本文主要讲述基于C#网络编程的发送邮件的编程,邮件发送功能是基于邮件协议的,常见的电子邮件协议有SMTP(简单邮件传输协议)、POP3(邮局协议)、IMAP(Internet邮件访问协议),文章主要参考周存杰的《C#网络编程实例教程》.这也是最后一篇参照该书的网络编程文章,之后的该系列文章都是基于网络实际应用的,不会再大量讲述原理知识.

一.SMTP协议

        SMTP协议是TCP/IP协议家族定义的机器间交换邮件的标准,它主要负责底层邮件系统如何将一个报文从一台机器传输到另一台机器,而不关心邮件如何存储及传输速度.它的步骤基本如下:

        
客户端首先建立与服务器TCP连接,然后服务器发送220报文(服务就绪),客户端收到220报文后发送HELLO命令,服务器收到HELLO后作出响应,最后服务器和客户端可以开始邮件通信.

        
本文不准备对SMTP命令(该命令定义了邮件传输或用户定义的系统功能)和SMTP应答状态码进行描述,你只需要知道使用SMTP发送邮件的操作通常如下:

        1.由MAIL命令(用于将邮件发送到一个多个邮箱)开始给出发送者标识,RCPT命令(用于确定邮件内容的接受者)给出接受者信息.

        2.用DATA命令(用于邮件内容加入缓冲区,<CRLF>.<CRLF>标识结束)列出发送邮件的内容.

        3.邮件内容指示符确认操作,如果此命令被接受,接收方返回一个250 OK应答.
        .NET平台上SmtpMail类实现了对SMTP协议的封装.所以我主要通过这些类介绍如何SMTP邮件收发.

        POP3:Post Office Protocol,目前版本为POP3,它是把邮件从电子邮箱中传输到本地计算机的协议.

        IMAP:Internet Message Access Protocol,是POP3的一种替代协议,提供了邮件检索和邮件处理的新功能,用户可以完全不必下载邮件正文就可以看到邮件的标题摘要,从邮件客户端软件就可以对服务器上的邮件和文件夹目录进行操作.

二.SMTP协议封装的类(旧版)

        1.SmtpMail类
        该类用于发送邮件,其命名空间为System.Web.Mail.该类常用属性只有一个:
        public static string SmtpServer {get; set;}
        获取或设置SMTP服务器名称,如不设置将使用本地主机名.如果提示添加命名空间不存在,需要在项目中添加引用,添加System.Web.dll即可.

  1. //SMTP类常用方法
  2. //构造方法
  3. public SmtpMail();
  4. //Send()方法 发送邮件 返回值:无
  5. public static void Send(
  6. MailMessage message //邮件
  7. );
  8. public static void Send(
  9. string from,        //发送者地址
  10. string to,          //收信人地址
  11. string subject,     //邮件主题
  12. string messageText  //邮件内容
  13. );

2.MailMessage类

        其命名控件为System.Web.Mail,该类用于设置邮件内容以及与邮件内容相关的信息,如发送人地址、收信人地址等.

  1. //MailMessage常用属性
  2. //1.Attachments属性 用于获取附件的文件列表
  3. public IList Attachments {get;}
  4. //2.Bcc属性 用于获取或设置暗送于地址,被暗送者的地址
  5. public string Bcc {get; set;}
  6. //3.Body属性 用于获取或设置邮件内容
  7. public string Body {get; set;}
  8. //4.BodyFormat属性 用于获取或设置邮件内容的格式 有Html Text格式
  9. public MailFormat BodyFormat {get; set;}
  10. //5.Cc属性 用于获取或设置抄送于地址,被抄送者的地址
  11. public string Cc {get; set;}
  12. //6.From属性 用于获取或设置发信人的地址
  13. public string From {get; set;}
  14. //7.Headers属性 用于获取邮件标头
  15. public IDictionary Headers {get;}
  16. //8.Priority属性 用于获取或设置邮件的优先级,包括High Low Normal
  17. public MailPriority Priority {get; set;}
  18. //9.Subject属性 用于获取或设置邮件的主题
  19. public string Subject {get; set;}
  20. //10.To属性 用于获取或设置邮件的收信人地址
  21. public string To {get; set;}
  22. //构造方法
  23. public MailMessage();

3.MailAttachment类

        该类用于构造和设置邮件的附件,命名空间为System.Web.Mail.

  1. //MailAttachment类常用属性
  2. //Encoding属性 用于设置附件的编码
  3. public MailEncoding Encoding {get;}
  4. //Filename属性 用于设置附件的文件名
  5. public string Filename {get;}
  6. //构造方法
  7. public MailAttachment(
  8. string filename        //文件名
  9. );
  10. public MailAttachment(
  11. string filename,       //文件名
  12. MailEncoding encoding  //编码
  13. );

三.SMTP协议封装的类(新版)

使用旧版的SMTP可能会出现很多错误,譬如“SendUsing 配置值无效”或“服务器未响应”等,但是它与新版的方法及属性基本没有变换.

        
C#更新的smtp命名空间为System.Net.Mail,其中SmtpClient类用于smtp发送邮件.

        1.Host属性用于设置主机名或IP地址

        2.Port属性用于设置SMTP事务端口

        3.Credentials属性用于验证寄件者的认证

        4.DeliveryMethod属性用于指定如何处理待送的电子邮件讯息

        5.Send方法用于将电子邮件发送到 SMTP 服务器以便传递

        
MailMessage类中属性也有变化,如To属性(邮件收信人地址属性)变为只读属性需要通过Add函数添加收件人邮件地址,但大体都与旧版的相同.

        Attachment类是在System.Net.Mail中新增,表示电子邮件的附件,以前System.Web.Mail中的是MailAttachment类.下面是具体的发送邮件的实例源代码及效果:

  1. //添加命名空间
  2. using System.Net.Mail;
  3. //添加私有成员
  4. private MailMessage msg;      //用于构造邮件属性和方法
  5. private Attachment att;       //用于构造邮件附件属性和方法
  6. public Form1()
  7. {
  8. InitializeComponent();
  9. msg = new MailMessage();  //实例化
  10. }
  11. //点击"发送邮件"按钮
  12. private void button1_Click(object sender, EventArgs e)
  13. {
  14. try
  15. {
  16. //To邮件收信人地址属性 只读属性不能赋值
  17. msg.To.Add(textBox1.Text);
  18. //From邮件发件人地址属性
  19. msg.From = new MailAddress(textBox2.Text);
  20. //Subject邮件主题属性
  21. msg.Subject = textBox3.Text;
  22. msg.SubjectEncoding = Encoding.Default;
  23. //Body设置邮件内容属性
  24. msg.Body = richTextBox1.Text;
  25. msg.BodyEncoding = Encoding.Default;
  26. //设置邮件的优先级Priority属性
  27. if (radioButton1.Checked)
  28. msg.Priority = MailPriority.High;
  29. else if (radioButton2.Checked)
  30. msg.Priority = MailPriority.Low;
  31. else if (radioButton3.Checked)
  32. msg.Priority = MailPriority.Normal;
  33. else
  34. msg.Priority = MailPriority.Normal;
  35. //发送邮件
  36. SmtpClient client = new SmtpClient();
  37. //邮件服务器设置smtp端口 默认25
  38. client.Host = "smtp.163.com";
  39. client.Port = 25;
  40. //邮件发送方式 通过网络发送到SMTP服务器
  41. client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
  42. //凭证 发件人登录邮箱的用户名和密码
  43. client.Credentials = new System.Net.NetworkCredential("1520161xxxx", "19911203xxxx");
  44. client.Send(msg);
  45. MessageBox.Show("邮件发送成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  46. }
  47. catch (Exception m) //异常处理
  48. {
  49. MessageBox.Show(m.Message);
  50. }
  51. }
  52. //点击"添加附件"按钮
  53. private void button2_Click(object sender, EventArgs e)
  54. {
  55. OpenFileDialog openFileDialog = new OpenFileDialog();
  56. openFileDialog.CheckFileExists = true;  //不存在文件名显示警告
  57. openFileDialog.ValidateNames = true;    //值接受Win32文件
  58. openFileDialog.Multiselect = false;     //不允许多选文件
  59. openFileDialog.Filter = "所有文件(*.*)|*.*";
  60. //添加附件 现仅支持添加一个附件
  61. if (openFileDialog.ShowDialog() == DialogResult.OK)
  62. {
  63. richTextBox1.Text = openFileDialog.FileName;
  64. att = new Attachment(openFileDialog.FileName);
  65. msg.Attachments.Add(att);
  66. }
  67. }
  68. //点击"删除附件"按钮
  69. private void button3_Click(object sender, EventArgs e)
  70. {
  71. msg.Attachments.Clear();
  72. }

        运行结果如下图所示:


        这仅仅是C#使用SMTP发送邮件的基础知识,读者可以自己完善做成更好的界面.

四.总结

        你也可以调用Windows自带的邮件发送程序实现,Windows自带Outlook Express软件,可以通过函数ShellExecute()或CreateProcess()调用Outlook Express,Ctrl+R调用"运行",输入“mailto:eastmount@163.com”即可调用发送邮件.使用该软件时首先需要测试账户,我绑定的是163邮箱.读者感兴趣可以自己完成.

        本文主要讲述C#网络编程中SMTP邮件协议,如何发送邮件的过程,并比较了新版的和旧版的方法.这将是我的C#网络编程的最后一篇文章,接下来想学习C#网络编程爬虫、下载网上图片、数据挖掘结合之类的知识.希望文章对大家有所帮助,如果有错误或不足之处,请海涵!目前法国VS瑞士 3:0.
 (By:Eastmount 2014-6-21 夜4点 原创CSDN http://blog.csdn.net/eastmount/)
        推荐相参考的关资料,非常不错,值得学习:

        1.[C# 网络编程系列]专题十:实现简单的邮件收发器 -- Learning_Hard

        http://blog.csdn.net/learning_hard/article/details/9071041
        2.C#使用163的SMTP服务器发送邮件  -- PowerCoder

        
http://www.cnblogs.com/OpenCoder/archive/2010/07/16/1779247.html
        3.C#邮件下载 -- zhouquanandy

        
http://download.csdn.net/detail/zhouquanandy/4444802
        4.《C#网络编程实例教程》-- 周存杰
        5.C#发送邮件(添加附件)-- 期待秋天的叶
        http://blog.csdn.net/kkkkkxiaofei/article/details/7941239

C# 网络编程之基于SMTP发送电子邮件的更多相关文章

  1. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  2. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  3. Java网络编程:QQ邮件发送客户端程序设计

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  4. 在Python中使用SMTP发送电子邮件

    Python中有内置的smtplib模块,完成一封邮件的发送,需要做很多准备工作.第三方的py_smtp这个包也是基于smtplib的,在Python中使用py_smtp发送电子邮件非常方便,只要填写 ...

  5. 网络编程之基于tcp和udp的套接字

    一   udp协议网络编程 DNS:将域名解析成ip地址 SOCK_DGRAM:数据报协议,也是udp协议 udp协议的网络编程的一些用法: recvfrom:接收消息,接收的时一个元组,元组里面的元 ...

  6. Linux网络编程:基于TCP的程序开发回顾篇《转》

    面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...

  7. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

  8. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...

随机推荐

  1. linux-umount挂载点无法卸载:device is busy(解决)

    umount不了的原因一般是由于有程序有用户在占用 解决方法: 1.      首先查找谁在占用:#fuser /mnt/nfs 得到进程号. 2.      查找进程:#ps –ef|grep 进程 ...

  2. Python os.walk() 方法遍历文件目录

    概述 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 在Un ...

  3. python 给对象绑定属性和方法和__slots__的使用

    # 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码# 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python) # python动态的添加属性以及方法class ...

  4. “Error:(1, 1) java: 非法字符: '\ufeff'”错误解决办法

    原因 用Windows记事本打开并修改.java文件保存后重新编译运行项目出现“Error:(1, 1) java: 非法字符: '\ufeff'”错误,如下图所示:     原来这是因为Window ...

  5. [转] React之Immutable学习记录

    从问题说起:熟悉 React 组件生命周期的话都知道:调用 setState 方法总是会触发 render 方法从而进行 vdom re-render 相关逻辑,哪怕实际上你没有更改到 Compone ...

  6. CTAP: Complementary Temporal Action Proposal Generation (ECCV2018)

    互补时域动作提名生成 这里的互补是指actionness score grouping 和 sliding window ranking这两种方法提proposal的结合,这两种方法各有利弊,形成互补 ...

  7. [LeetCode] Best Time to Buy and Sell Stock 6道合集【DP】

    1. Best Time to Buy and Sell Stock 2. Best Time to Buy and Sell Stock II 3. Best Time to Buy and Sel ...

  8. JQuery函数大全

    $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式 $(”img”).attr({src:”test.jpg”,alt:”test Image”}); 给某个元素添加属性/ ...

  9. JVM及class文件加载问题-学习使人快乐4

    今天看了些粗浅的JVM原理的知识 1.class文件编译过程: 词法分析 语法分析 源码 ---------Token流-------------语法树----------字节码 2.classloa ...

  10. Nginx的配置与部署研究,Upstream负载均衡模块

    Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: upstream backend { server ...