目录结构:

contents structure [+]

1.简介

邮件传输常用的协议有,SMTP、POP3、IMAP4。他们都属于TCP/IP协议,默认状态下分别通过TCP端口25,110,和143建立链接。

SMTP协议

SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

POP协议

POP邮局协议负责从邮件服务器中检索电子邮件。它要求邮件服务器完成下面几种任务之一:从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。

IMAP协议

互联网信息访问协议(IMAP)是一种优于POP的新协议。和POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。例如,它可以决定客户机请求邮件服务器提交所收到邮件的方式,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。

简单来说,SMTP协议主要是用于发邮件,POP和IMAP协议用于读取、删除、下载邮件。结合QQ邮箱和网易邮箱,笔者认为,QQ邮箱更注重POP协议方面,网易邮箱比较注重SMTP协议方面,下面笔者将会对其原由进行阐述,希望对读者有所帮助。

在利用第三方对QQ邮箱和网易邮箱进行邮件操作之前,需要在各自的后台开启POP/SMTP服务,并且获取到授权码(网易邮箱若关闭客户端授权码,则可以直接用登录密码)。

2.发送邮件

发送邮件应该使用SMTP协议。有关SMTP协议的具体内容,这里笔者就不再阐述了。

C#对发送邮件的库封装得已经比较好了,开发人员可以很方便的完成发送邮件的操作。在System.Net.Mail命名空间中封装了对发送邮件的操作,下面是使用QQ邮箱发送的案例:

  1. MailMessage message = new MailMessage();
  2.  
  3. //设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致
  4. MailAddress fromAddr = new MailAddress("2965372061@qq.com");
  5. message.From = fromAddr;
  6. //设置收件人,可添加多个,添加方法与下面的一样
  7. message.To.Add("2965372061@qq.com");
  8. //设置抄送人
  9. message.CC.Add("2965372061@qq.com");
  10. //设置邮件标题
  11. message.Subject = "通知";
  12. //设置邮件内容
  13. message.Body = "Hello world";
  14.  
  15. //设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看
  16. SmtpClient client = new SmtpClient("smtp.qq.com", );
  17. //设置发送人的邮箱账号和授权码
  18. client.Credentials = new NetworkCredential("2965372061@qq.com", "授权码");
  19.  
  20. //启用ssl,也就是安全发送
  21. client.EnableSsl = true;
  22. //发送邮件
  23. client.Send(message);
  24. Console.WriteLine("发送成功");
  25. Console.ReadLine();

上面发送的是文本格式,接下来介绍如何发送HTML格式的文件。如何想要发送HTML格式的邮件,那么只需要指定IsBodyHtml为true即可。

  1. message.Body="<h1>Hello World</h1>";
  2. message.IsBodyHtml=true;

如果想要发送附件的话,那么应该往Message实例中的Attachments 属性中添加一个Attachment(附件)实例。

关于QQ邮件的发送就讨论到这里,接下来讨论一下网易邮件的发送。网易邮件的发送较为麻烦,这和网易邮箱的反垃圾邮件机制有关。网易为了希望用户能够得到纯净的电子邮件网络环境,减少垃圾邮件,系统对会对发送的信件做判定,并限制对垃圾的邮件的发送。

下面是网易发送邮件的代码,笔者测试能够成功发送邮件:

  1. MailMessage message = new MailMessage();
  2.  
  3. //设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致
  4. MailAddress fromAddr = new MailAddress("18011389221@163.com");
  5.  
  6. message.From = fromAddr;
  7. message.To.Add("18011389221@163.com");//自己接收
  8.  
  9. //设置邮件标题
  10. message.Subject = "通知";
  11. //设置邮件内容
  12. message.Body = "Hello world";
  13. //设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看
  14. SmtpClient client = new SmtpClient("smtp.163.com", );
  15.  
  16. //设置发送人的邮箱账号和授权码
  17. client.Credentials = new NetworkCredential("18011389221@163.com", "授权码");
  18.  
  19. //发送邮件
  20. client.Send(message);
  21. Console.WriteLine("发送成功");
  22. Console.ReadLine();

笔者只在自己给自己发邮件中测试成功过,在给别的邮箱中发邮件时总是被判定为垃圾邮件。如果读者测试时并不能够成功发送邮件,可按照如下几部步骤检查:
1.检查客户端授权码是否开启,授权码是否停用
2.检查是否开启POP3/SMTP服务
3.将发件人添加到白名单中
4.取消智能收信分类
5.不要设置抄送人

从上面可以看出,在SMTP服务中网易邮箱比QQ邮箱的判断要更加严格。

3.读取邮件

读取邮件要用到的协议为POP3协议。然而C#的类库中,并没有对POP3协议进行封装。QQ邮箱在POP3协议的建立中,使用了SSL,这使得数据的传输更加的安全。然而网易邮箱并没有使用SSL协议。

如果是电脑客户端通过CMD命令与POP服务器建立链接的话,网易邮箱的操作(telnet)没什么难度。但是QQ邮箱的操作(openssl)就相对比较复杂了,在使用openssl命令与主机建立连接时,必需传入证书。C#对SSL已经有过包装,通过C#可以轻松的与QQ邮箱和网易邮箱POP协议主机建立连接。

在开始之前,读者可能需要先了解一些POP3协议的知识,关于POP3文档读者可以自行度娘。这里笔者列举出,POP3协议中的命令码:

命令 描述
USER [username] 用户名
PASS [password] 密码
APOP [Name,Digest] 认可Digest是MD5消息摘要
STAT 处理请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL [Msg#] 处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST [Msg#] 处理返回邮件数量和每个邮件的大小
RETR [Msg#] 处理返回由参数标识的邮件的全部文本
DELE [Msg#] 处理服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET 处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP [Msg# n] 处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP 处理服务器返回一个肯定的响应
QUIT 终止会话

接下来笔者连接QQ邮箱POP服务主机,展示一些常见的命令使用:

  1. TcpClient clientSocket = new TcpClient();
  2. clientSocket.Connect("pop.qq.com", );//连接到QQ邮箱POP服务器
  3. //建立SSL连接
  4. SslStream stream = new SslStream(
  5. clientSocket.GetStream(),
  6. false,
  7. (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) => {
  8. return true;//接收所有的远程SSL链接
  9. });
  10. stream.AuthenticateAsClient("pop.qq.com");//验证
  11.  
  12. //得到输入流
  13. StreamReader reader = new StreamReader(stream, Encoding.Default, true);
  14. //得到输出流
  15. StreamWriter writer = new StreamWriter(stream);
  16.  
  17. Console.WriteLine(reader.ReadLine());//以+Ok开头,表示连接成功
  18.  
  19. writer.WriteLine("USER 2965372061@qq.com");
  20. writer.Flush();
  21. Console.WriteLine(reader.ReadLine());//+Ok 表示用户名正确
  22.  
  23. writer.WriteLine("PASS 授权码");
  24. writer.Flush();
  25. Console.WriteLine(reader.ReadLine());//+Ok 表示密码正确
  26.  
  27. writer.WriteLine("STAT");
  28. writer.Flush();
  29. Console.WriteLine(reader.ReadLine());//获得邮件数 +OK 189 1058197 表示 189封邮件,1058197b
  30.  
  31. writer.WriteLine("RETR 1");
  32. writer.Flush();
  33. String result = null;//获得第1封邮件的内容,读取的内容需要使用base64解码
  34. while ((result = reader.ReadLine()) != null)
  35. {
  36. Console.WriteLine(reader.ReadLine());
  37. }
  38.  
  39. Console.ReadLine();

读者也可以测试连接网易邮箱POP服务器,
1.网易邮箱POP服务器的远程地址是:pop.163.com:995。
2.无需建立SSL链接

参考文档:
POP3协议
SMTP协议

【C#】C#对电子邮件的收发操作的更多相关文章

  1. 基于Socket客户端局域网或广域网内共享同一短信猫收发短信的开发解决方案

    可使同一网络(局域网或广域网)内众多客户端,共享一个短信猫设备短信服务器进行短信收发,短信服务器具备对客户端的管理功能. 下面是某市建设银行采用本短信二次开发平台时实施的系统方案图: 在该方案中,考虑 ...

  2. linux邮件服务器postfix配置实例

    linux邮件服务器postfix配置实例(超级详细!!!) 2013-03-13 13:30:21 标签:邮件服务器 linux 1. 系统安装:1)centos4.3 选上MAIL组件里的全部.2 ...

  3. 【Flask】 项目结构说明

    项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和Django这种框架又不一样,Fl ...

  4. Linux的邮件服务器配置

    一.邮件服务简介 1.电子邮件服务是Interne上最基本的服务之一,进入互联网的用户不需要任何纸张就可以方便地使用电子邮件来收发邮件 2.Internet上的电子邮件服务都是基于客户/服务器模式的 ...

  5. tcp/ip--百度百科

    Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Inter ...

  6. 邮箱基础协议:SMTP/POP3/IMAP

    目录 电子邮件的组成:信封.首部和正文 邮件基础协议 SMTP SMTP 指令 使用 Telnet 模拟 SMTP 发送邮件 POP3 POP3 的生命周期 IMAP 标志消息属性 状态和流程图 IM ...

  7. linux入门系列17--邮件系统之Postfix和Dovecot

    前文演示了通过Samba和NFS实现文件共享,本篇演示使用Postfix和Dovecot在局域网实现电子邮件收发系统. 电子邮件系统是我们日常生活和工作中非常重要的一个网络服务,在windows下收发 ...

  8. 原来这才是 Socket !

    关于对 Socket 的认识,大致分为下面几个主题,Socket 是什么,Socket 是如何创建的,Socket 是如何连接并收发数据的,Socket 套接字的删除等. Socket 是什么以及创建 ...

  9. [原]Cachedb 网络模块文档

    Cachedb 网络模块文档 整体结构 多路复用 (epoll 模块) 事件驱动 (事件封装) 缓冲管理 (上层buffer管理) 设计思想 层次化的设计,每一个模块只调用上一个模块的接口,并将耦合聚 ...

随机推荐

  1. Spring的核心之IoC容器创建对象

    Spring的Ioc容器,是Spring的核心内容: 作用:对象的创建和处理对象的依赖关系. Spring容器创建对象有以下几种方式: 1:调用无参数的构造器 <!-- 默认无参的构造器 --& ...

  2. URAL - 1078 Segments

    URAL - 1078 题目大意:有n条线段,一个线段a 完全覆盖另一个线段b 当且仅当,a.l < b.l && a.r>b.r.问你 一个线段覆盖一个线段再覆盖一个线段 ...

  3. qrcodebox 面向移动设备的二维码弹出框

    qrcodebox 面向移动设备的二维码弹出框 qrcodebox 简介 qrcode box,一个小小的二维码工具,通过调用它,可以在页面中间弹出一个二维码窗口,主要是面向移动设备的,对于PC端浏览 ...

  4. Linux proc目录下 几个系统文件下的各项参数 (cpuinfo,uptime,meminfo,stat,loadavg)

    参考链接: Linux 操作系统内核基本实验.pdf http://max.book118.com/html/2015/0919/25787869.shtm Linux下cpuinfo文件各项参数的详 ...

  5. Jmeter脚本录制方法(二)手工编写脚本(jmeter与fiddler结合使用)

    jmeter脚本录制方法可以分三种,前几天写的一篇文章中,已介绍了前两种,今天来说下第三种,手工编写脚本,建议使用这一种方法,虽然写的过程有点繁琐,但调试脚本比前两者方式都要便捷. 首先来看下三种方式 ...

  6. WebSocket协议解析

    WebSocket协议解析 转载请注明出处:WebSocket解析 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是指在特定的时间间隔(如每一秒),由浏览器对服务器发起HTTP请求,然后由服 ...

  7. Java 8新特性----Lambda

    Lambda 一.如何辨别Lambda表达式 Runnable noArguments = () -> System.out.println("Hello World"); ...

  8. 创建PCB原理图的模板

    Q:创建PCB原理图的模板,主要就是设置模板的大小,右下角的信息框, 效果图如下: 创建PCB工程 创建原理图 设置模板,方便以后画原理图 打开模板的方式有:1按DO 2双击边框 标题块是附带有的,取 ...

  9. 修改button的可点击区域

    需求:在cocos2dx引擎中,button的点击区域和button图片的大小是一样的,但是我需要修改可点击区域的大小和位置,需要修改引擎源码: button提供的接口中并没有和touch相关,but ...

  10. WPF应用Access数据库

    WPF应用Access数据库 现在Access数据库中有表GuestTable,其中的字段如下图所示,现在需要应用WPF技术为此表制作一个数据库管理窗口,实现对此数据库中的数据进行数据的增.删.改和查 ...