本文主要讲述基于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. 线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置

    top基本使用: top命令参考本篇文章 查看内存和CPU的top命令,别看输出一大堆,理解了其实很简单 top 命令运行图: 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理 ...

  2. PAT Basic 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  3. 一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

    1:MapReduce的概述: (1):MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. (2):MapReduce由两个阶段组成:Map和Red ...

  4. 简单有效:解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG

    https://blog.csdn.net/Sukie_csdn/article/details/78752969

  5. 重排DL

    题解: https://www.luogu.org/problemnew/show/T51442 从这题上还是学到不少东西.. 以前并没有写过ex-bsgs 正好拿这个复习中国剩余定理和bsgs了(我 ...

  6. 【BZOJ4998】星球联盟

    题解: 应该还是比较水的 首先很容易发现的就是两个点一旦联通他们就永远联通了 所以联通之后我们就把他们之间缩成一个点

  7. python全栈开发day77-博客主页

    1.文章分类 2.标签 3.归档 1) MySQL的日期格式化函数 DATE_FORMAT(字段名,格式) 2) Django ORM中如何执行SQL原生语句 (1) models.Article.o ...

  8. 移动端1px问题

    .component-confirm__buttons { border-top: 1px solid #eceef0; box-shadow: 0 1px 1px #fff; } 造成边框变粗的原因 ...

  9. SPOJ LCS - Longest Common Substring 字符串 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/8982392.html 题目传送门 - SPOJ LCS 题意 求两个字符串的最长公共连续子串长度. 字符串长$\ ...

  10. 055 kafka可靠性与高性能

    一:可靠性 1. 二:高性能 1.