1 引言

电子邮件介绍

电子邮件(简称E-mail)又称电子信箱、电子邮政,它是一种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是一个简易、快速的方法。通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。

电子邮件不是一种“终端到终端”的服务,是被称为“存贮转发式”服务。这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时空限制。在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件则意味着从自己的信箱中读取信件,信箱实际上是由文件管理系统支持的一个实体。因为电子邮件是通过邮件服务器(mai1server)来传递档的。通常mailserver是执行多任务操作系统UNIX的计算机,它提供24小时的电子邮件服务,用户只要向 mail server管理人员申请一个信箱账号,就可使用这项快速的邮件服务。

电子邮件的工作原理:

  • 电子邮件系统是一种新型的信息系统,是通信技术和计算机技术结合的产物。电子邮件的传输是通过电子邮件简单传输协议(Simple Mail Transfer Protocol,简称SMTP)这一系统软件来完成的,它是Internet下的一种电子邮件通信协议。
  • 电子邮件的基本原理,是在通信网上设立“电子信箱系统”,它实际上是一个计算机系统。系统的硬件是一个高性能、大容量的计算机。硬盘作为信箱的存储介质,在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的—个电子信箱。并确定—个用户名和用户可以自己随意修改的口令。存储空间包含存放所收信件、编辑信件以及信件存盘三部分空间,用户使用口令开启自己的信箱,并进行发信、读信、编辑、转发、存档等各种操作。系统功能主要由软件实现。
  • 电子邮件的通信是在信箱之间进行的。用户首先开启自己的信箱,然后通过键入命令的方式将需要发送的邮件发到对方的信箱中。邮件在信箱之间进行传递和交换,也可以与另—个邮件系统进行传递和交换。收方在取信时,使用特定账号从信箱提取。

2 代码实现部分

2.1 新建邮件帮助类,自由命名即可,这里以Utilities_Xofly为例

邮件帮助类也可以在这里查看:SmtpServerHelper

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace Sea.Common
{public class Utilities_Xofly{public enum MailFormat { Text, HTML };public enum MailPriority { Low = 1, Normal = 3, High = 5 };/// <summary>  /// 添加附件  /// </summary>  public class MailAttachments{#region 构造函数  public MailAttachments(){_Attachments = new ArrayList();}#endregion#region 私有字段  private IList _Attachments;private const int MaxAttachmentNum = 10;#endregion#region 索引器  public string this[int index]{get { return (string)_Attachments[index]; }}#endregion#region 公共方法  /// <summary>  /// 添加邮件附件  /// </summary>  /// <param name="FilePath">附件的绝对路径</param>  public void Add(params string[] filePath){if (filePath == null){throw (new ArgumentNullException("非法的附件"));}else{for (int i = 0; i < filePath.Length; i++){Add(filePath[i]);}}}/// <summary>  /// 添加一个附件,当指定的附件不存在时,忽略该附件,不产生异常。  /// </summary>  /// <param name="filePath">附件的绝对路径</param>  public void Add(string filePath){if (System.IO.File.Exists(filePath)){if (_Attachments.Count < MaxAttachmentNum){_Attachments.Add(filePath);}}}/// <summary>  /// 清除所有附件  /// </summary>  public void Clear(){_Attachments.Clear();}/// <summary>  /// 获取附件个数  /// </summary>  public int Count{get { return _Attachments.Count; }}#endregion}/// <summary>  /// 邮件信息  /// </summary>  public class MailMessage{#region 构造函数  public MailMessage(){_Recipients = new ArrayList();        //收件人列表  _Attachments = new MailAttachments(); //附件  _BodyFormat = MailFormat.HTML;        //缺省的邮件格式为HTML  _Priority = MailPriority.Normal;_Charset = "GB2312";}#endregion#region 私有字段  private int _MaxRecipientNum = 30;private string _From;      //发件人地址  private string _FromName;  //发件人姓名  private IList _Recipients; //收件人  private MailAttachments _Attachments;//附件  private string _Body;      //内容  private string _Subject;   //主题  private MailFormat _BodyFormat;     //邮件格式  private string _Charset = "GB2312"; //字符编码格式  private MailPriority _Priority;     //邮件优先级  #endregion#region 公有属性  /// <summary>  /// 设定语言代码,默认设定为GB2312,如不需要可设置为""  /// </summary>  public string Charset{get { return _Charset; }set { _Charset = value; }}/// <summary>  /// 最大收件人  /// </summary>  public int MaxRecipientNum{get { return _MaxRecipientNum; }set { _MaxRecipientNum = value; }}/// <summary>  /// 发件人地址  /// </summary>  public string From{get { return _From; }set { _From = value; }}/// <summary>  /// 发件人姓名  /// </summary>  public string FromName{get { return _FromName; }set { _FromName = value; }}/// <summary>  /// 内容  /// </summary>  public string Body{get { return _Body; }set { _Body = value; }}/// <summary>  /// 主题  /// </summary>  public string Subject{get { return _Subject; }set { _Subject = value; }}/// <summary>  /// 附件  /// </summary>  public MailAttachments Attachments{get { return _Attachments; }set { _Attachments = value; }}/// <summary>  /// 优先权  /// </summary>  public MailPriority Priority{get { return _Priority; }set { _Priority = value; }}/// <summary>  /// 收件人  /// </summary>  public IList Recipients{get { return _Recipients; }}/// <summary>  /// 邮件格式  /// </summary>  public MailFormat BodyFormat{set { _BodyFormat = value; }get { return _BodyFormat; }}#endregion#region 公共方法  /// <summary>  /// 增加一个收件人地址  /// </summary>  /// <param name="recipient">收件人的Email地址</param>  public void AddRecipients(string recipient){if (_Recipients.Count < MaxRecipientNum){_Recipients.Add(recipient);}}/// <summary>  /// 增加多个收件人地址  /// </summary>  /// <param name="recipient">收件人的Email地址集合</param>  public void AddRecipients(params string[] recipient){if (recipient == null){throw (new ArgumentException("收件人不能为空."));}else{for (int i = 0; i < recipient.Length; i++){AddRecipients(recipient[i]);}}}#endregion}/// <summary>  /// 邮件操作  /// </summary>  public class SmtpServerHelper{#region 构造函数、析构函数  public SmtpServerHelper(){SMTPCodeAdd();}~SmtpServerHelper(){networkStream.Close();tcpClient.Close();}#endregion#region 私有字段  /// <summary>  /// 回车换行  /// </summary>  private string CRLF = "\r\n";/// <summary>  /// 错误消息反馈  /// </summary>  private string errmsg;/// <summary>  /// TcpClient对象,用于连接服务器  /// </summary>   private TcpClient tcpClient;/// <summary>  /// NetworkStream对象  /// </summary>   private NetworkStream networkStream;/// <summary>  /// 服务器交互记录  /// </summary>  private string logs = "";/// <summary>  /// SMTP错误代码哈希表  /// </summary>  private Hashtable ErrCodeHT = new Hashtable();/// <summary>  /// SMTP正确代码哈希表  /// </summary>  private Hashtable RightCodeHT = new Hashtable();#endregion#region 公有属性  /// <summary>  /// 错误消息反馈  /// </summary>  public string ErrMsg{set { errmsg = value; }get { return errmsg; }}#endregion#region 私有方法  /// <summary>  /// 将字符串编码为Base64字符串  /// </summary>  /// <param name="str">要编码的字符串</param>  private string Base64Encode(string str){byte[] barray;barray = Encoding.Default.GetBytes(str);return Convert.ToBase64String(barray);}/// <summary>  /// 将Base64字符串解码为普通字符串  /// </summary>  /// <param name="str">要解码的字符串</param>  private string Base64Decode(string str){byte[] barray;barray = Convert.FromBase64String(str);return Encoding.Default.GetString(barray);}/// <summary>  /// 得到上传附件的文件流  /// </summary>  /// <param name="FilePath">附件的绝对路径</param>  private string GetStream(string FilePath){System.IO.FileStream FileStr = new System.IO.FileStream(FilePath, System.IO.FileMode.Open);byte[] by = new byte[System.Convert.ToInt32(FileStr.Length)];FileStr.Read(by, 0, by.Length);FileStr.Close();return (System.Convert.ToBase64String(by));}/// <summary>  /// SMTP回应代码哈希表  /// </summary>  private void SMTPCodeAdd(){ErrCodeHT.Add("421", "服务未就绪,关闭传输信道");ErrCodeHT.Add("432", "需要一个密码转换");ErrCodeHT.Add("450", "要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)");ErrCodeHT.Add("451", "放弃要求的操作;处理过程中出错");ErrCodeHT.Add("452", "系统存储不足,要求的操作未执行");ErrCodeHT.Add("454", "临时认证失败");ErrCodeHT.Add("500", "邮箱地址错误");ErrCodeHT.Add("501", "参数格式错误");ErrCodeHT.Add("502", "命令不可实现");ErrCodeHT.Add("503", "服务器需要SMTP验证");ErrCodeHT.Add("504", "命令参数不可实现");ErrCodeHT.Add("530", "需要认证");ErrCodeHT.Add("534", "认证机制过于简单");ErrCodeHT.Add("538", "当前请求的认证机制需要加密");ErrCodeHT.Add("550", "要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)");ErrCodeHT.Add("551", "用户非本地,请尝试<forward-path>");ErrCodeHT.Add("552", "过量的存储分配,要求的操作未执行");ErrCodeHT.Add("553", "邮箱名不可用,要求的操作未执行(例如邮箱格式错误)");ErrCodeHT.Add("554", "传输失败");RightCodeHT.Add("220", "服务就绪");RightCodeHT.Add("221", "服务关闭传输信道");RightCodeHT.Add("235", "验证成功");RightCodeHT.Add("250", "要求的邮件操作完成");RightCodeHT.Add("251", "非本地用户,将转发向<forward-path>");RightCodeHT.Add("334", "服务器响应验证Base64字符串");RightCodeHT.Add("354", "开始邮件输入,以<CRLF>.<CRLF>结束");}/// <summary>  /// 发送SMTP命令  /// </summary>   private bool SendCommand(string str){byte[] WriteBuffer;if (str == null || str.Trim() == String.Empty){return true;}logs += str;WriteBuffer = Encoding.Default.GetBytes(str);try{networkStream.Write(WriteBuffer, 0, WriteBuffer.Length);}catch{errmsg = "网络连接错误";return false;}return true;}/// <summary>  /// 接收SMTP服务器回应  /// </summary>  private string RecvResponse(){int StreamSize;string Returnvalue = String.Empty;byte[] ReadBuffer = new byte[1024];try{StreamSize = networkStream.Read(ReadBuffer, 0, ReadBuffer.Length);}catch{errmsg = "网络连接错误";return "false";}if (StreamSize == 0){return Returnvalue;}else{Returnvalue = Encoding.Default.GetString(ReadBuffer).Substring(0, StreamSize);logs += Returnvalue + this.CRLF;return Returnvalue;}}/// <summary>  /// 与服务器交互,发送一条命令并接收回应。  /// </summary>  /// <param name="str">一个要发送的命令</param>  /// <param name="errstr">如果错误,要反馈的信息</param>  private bool Dialog(string str, string errstr){if (str == null || str.Trim() == string.Empty){return true;}if (SendCommand(str)){string RR = RecvResponse();if (RR == "false"){return false;}//检查返回的代码,根据[RFC 821]返回代码为3位数字代码如220  string RRCode = RR.Substring(0, 3);if (RightCodeHT[RRCode] != null){return true;}else{if (ErrCodeHT[RRCode] != null){errmsg += (RRCode + ErrCodeHT[RRCode].ToString());errmsg += CRLF;}else{errmsg += RR;}errmsg += errstr;return false;}}else{return false;}}/// <summary>  /// 与服务器交互,发送一组命令并接收回应。  /// </summary>  private bool Dialog(string[] str, string errstr){for (int i = 0; i < str.Length; i++){if (!Dialog(str[i], "")){errmsg += CRLF;errmsg += errstr;return false;}}return true;}/// <summary>  /// 连接服务器  /// </summary>  private bool Connect(string smtpServer, int port){try{tcpClient = new TcpClient(smtpServer, port);}catch (Exception e){errmsg = e.ToString();return false;}networkStream = tcpClient.GetStream();if (RightCodeHT[RecvResponse().Substring(0, 3)] == null){errmsg = "网络连接失败";return false;}return true;}/// <summary>  /// 获取优先级  /// </summary>  /// <param name="mailPriority">优先级</param>  private string GetPriorityString(MailPriority mailPriority){string priority = "Normal";if (mailPriority == MailPriority.Low){priority = "Low";}else if (mailPriority == MailPriority.High){priority = "High";}return priority;}/// <summary>  /// 发送电子邮件  /// </summary>  /// <param name="smtpServer">发信SMTP服务器</param>  /// <param name="port">端口,默认为25</param>  /// <param name="username">发信人邮箱地址</param>  /// <param name="password">发信人邮箱密码</param>  /// <param name="mailMessage">邮件内容</param>  private bool SendEmail(string smtpServer, int port, bool ESmtp, string username, string password, MailMessage mailMessage){if (Connect(smtpServer, port) == false) return false;string priority = GetPriorityString(mailMessage.Priority);bool Html = (mailMessage.BodyFormat == MailFormat.HTML);string[] SendBuffer;string SendBufferstr;//进行SMTP验证  if (ESmtp){SendBuffer = new String[4];SendBuffer[0] = "EHLO " + smtpServer + CRLF;SendBuffer[1] = "AUTH LOGIN" + CRLF;SendBuffer[2] = Base64Encode(username) + CRLF;SendBuffer[3] = Base64Encode(password) + CRLF;if (!Dialog(SendBuffer, "SMTP服务器验证失败,请核对用户名和密码。")) return false;}else{SendBufferstr = "HELO " + smtpServer + CRLF;if (!Dialog(SendBufferstr, "")) return false;}//发件人地址  SendBufferstr = "MAIL FROM:<" + username + ">" + CRLF;if (!Dialog(SendBufferstr, "发件人地址错误,或不能为空")) return false;//收件人地址  SendBuffer = new string[mailMessage.Recipients.Count];for (int i = 0; i < mailMessage.Recipients.Count; i++){SendBuffer[i] = "RCPT TO:<" + (string)mailMessage.Recipients[i] + ">" + CRLF;}if (!Dialog(SendBuffer, "收件人地址有误")) return false;SendBufferstr = "DATA" + CRLF;if (!Dialog(SendBufferstr, "")) return false;//发件人姓名  SendBufferstr = "From:" + mailMessage.FromName + "<" + mailMessage.From + ">" + CRLF;if (mailMessage.Recipients.Count == 0){return false;}else{SendBufferstr += "To:=?" + mailMessage.Charset.ToUpper() + "?B?" + Base64Encode((string)mailMessage.Recipients[0]) + "?=" + "<" + (string)mailMessage.Recipients[0] + ">" + CRLF;}SendBufferstr += ((mailMessage.Subject == String.Empty || mailMessage.Subject == null) ? "Subject:" : ((mailMessage.Charset == "") ? ("Subject:" + mailMessage.Subject) : ("Subject:" + "=?" + mailMessage.Charset.ToUpper() + "?B?" + Base64Encode(mailMessage.Subject) + "?="))) + CRLF;SendBufferstr += "X-Priority:" + priority + CRLF;SendBufferstr += "X-MSMail-Priority:" + priority + CRLF;SendBufferstr += "Importance:" + priority + CRLF;SendBufferstr += "X-Mailer: Lion.Web.Mail.SmtpMail Pubclass [cn]" + CRLF;SendBufferstr += "MIME-Version: 1.0" + CRLF;if (mailMessage.Attachments.Count != 0){SendBufferstr += "Content-Type: multipart/mixed;" + CRLF;SendBufferstr += " boundary=\"=====" + (Html ? "001_Dragon520636771063_" : "001_Dragon303406132050_") + "=====\"" + CRLF + CRLF;}if (Html){if (mailMessage.Attachments.Count == 0){SendBufferstr += "Content-Type: multipart/alternative;" + CRLF; //内容格式和分隔符  SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\"" + CRLF + CRLF;SendBufferstr += "This is a multi-part message in MIME format." + CRLF + CRLF;}else{SendBufferstr += "This is a multi-part message in MIME format." + CRLF + CRLF;SendBufferstr += "--=====001_Dragon520636771063_=====" + CRLF;SendBufferstr += "Content-Type: multipart/alternative;" + CRLF; //内容格式和分隔符  SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\"" + CRLF + CRLF;}SendBufferstr += "--=====003_Dragon520636771063_=====" + CRLF;SendBufferstr += "Content-Type: text/plain;" + CRLF;SendBufferstr += ((mailMessage.Charset == "") ? (" charset=\"iso-8859-1\"") : (" charset=\"" + mailMessage.Charset.ToLower() + "\"")) + CRLF;SendBufferstr += "Content-Transfer-Encoding: base64" + CRLF + CRLF;SendBufferstr += Base64Encode("邮件内容为HTML格式,请选择HTML方式查看") + CRLF + CRLF;SendBufferstr += "--=====003_Dragon520636771063_=====" + CRLF;SendBufferstr += "Content-Type: text/html;" + CRLF;SendBufferstr += ((mailMessage.Charset == "") ? (" charset=\"iso-8859-1\"") : (" charset=\"" + mailMessage.Charset.ToLower() + "\"")) + CRLF;SendBufferstr += "Content-Transfer-Encoding: base64" + CRLF + CRLF;SendBufferstr += Base64Encode(mailMessage.Body) + CRLF + CRLF;SendBufferstr += "--=====003_Dragon520636771063_=====--" + CRLF;}else{if (mailMessage.Attachments.Count != 0){SendBufferstr += "--=====001_Dragon303406132050_=====" + CRLF;}SendBufferstr += "Content-Type: text/plain;" + CRLF;SendBufferstr += ((mailMessage.Charset == "") ? (" charset=\"iso-8859-1\"") : (" charset=\"" + mailMessage.Charset.ToLower() + "\"")) + CRLF;SendBufferstr += "Content-Transfer-Encoding: base64" + CRLF + CRLF;SendBufferstr += Base64Encode(mailMessage.Body) + CRLF;}if (mailMessage.Attachments.Count != 0){for (int i = 0; i < mailMessage.Attachments.Count; i++){string filepath = (string)mailMessage.Attachments[i];SendBufferstr += "--=====" + (Html ? "001_Dragon520636771063_" : "001_Dragon303406132050_") + "=====" + CRLF;SendBufferstr += "Content-Type: text/plain;" + CRLF;SendBufferstr += " name=\"=?" + mailMessage.Charset.ToUpper() + "?B?" + Base64Encode(filepath.Substring(filepath.LastIndexOf("\\") + 1)) + "?=\"" + CRLF;SendBufferstr += "Content-Transfer-Encoding: base64" + CRLF;SendBufferstr += "Content-Disposition: attachment;" + CRLF;SendBufferstr += " filename=\"=?" + mailMessage.Charset.ToUpper() + "?B?" + Base64Encode(filepath.Substring(filepath.LastIndexOf("\\") + 1)) + "?=\"" + CRLF + CRLF;SendBufferstr += GetStream(filepath) + CRLF + CRLF;}SendBufferstr += "--=====" + (Html ? "001_Dragon520636771063_" : "001_Dragon303406132050_") + "=====--" + CRLF + CRLF;}SendBufferstr += CRLF + "." + CRLF;if (!Dialog(SendBufferstr, "错误信件信息")) return false;SendBufferstr = "QUIT" + CRLF;if (!Dialog(SendBufferstr, "断开连接时错误")) return false;networkStream.Close();tcpClient.Close();return true;}#endregion#region 公有方法  /// <summary>  /// 发送电子邮件,SMTP服务器不需要身份验证  /// </summary>  /// <param name="smtpServer">发信SMTP服务器</param>  /// <param name="port">端口,默认为25</param>  /// <param name="mailMessage">邮件内容</param>  public bool SendEmail(string smtpServer, int port, MailMessage mailMessage){return SendEmail(smtpServer, port, false, "", "", mailMessage);}/// <summary>  /// 发送电子邮件,SMTP服务器需要身份验证  /// </summary>  /// <param name="smtpServer">发信SMTP服务器</param>  /// <param name="port">端口,默认为25</param>  /// <param name="username">发信人邮箱地址</param>  /// <param name="password">发信人邮箱密码</param>  /// <param name="mailMessage">邮件内容</param>  public bool SendEmail(string smtpServer, int port, string username, string password, MailMessage mailMessage){return SendEmail(smtpServer, port, true, username, password, mailMessage);}#endregion}/// <summary>  /// 发送邮件  /// </summary>  //--------------------调用-----------------------  //MailAttachments ma=new MailAttachments();  //ma.Add(@"附件地址");  //MailMessage mail = new MailMessage();  //mail.Attachments=ma;  //mail.Body="你好";  //mail.AddRecipients("zjy99684268@163.com");  //mail.From="zjy99684268@163.com";  //mail.FromName="zjy";  //mail.Subject="Hello";  //SmtpClient sp = new SmtpClient();  //sp.SmtpServer = "smtp.163.com";  //sp.Send(mail, "zjy99684268@163.com", "123456");  //------------------------------------------------  public class SmtpClient{#region 构造函数  public SmtpClient(){ }public SmtpClient(string _smtpServer){_SmtpServer = _smtpServer;}#endregion#region 私有字段  private string errmsg;private string _SmtpServer;#endregion#region 公有属性  /// <summary>  /// 错误消息反馈  /// </summary>  public string ErrMsg{get { return errmsg; }}/// <summary>  /// 邮件服务器  /// </summary>  public string SmtpServer{set { _SmtpServer = value; }get { return _SmtpServer; }}#endregionpublic bool Send(MailMessage mailMessage, string username, string password){SmtpServerHelper helper = new SmtpServerHelper();if (helper.SendEmail(_SmtpServer, 25, username, password, mailMessage))return true;else{errmsg = helper.ErrMsg;return false;}}}/// <summary>  /// 操作服务器上邮件  /// </summary>  public class SmtpMail{public SmtpMail(){ }#region 字段  private StreamReader sr;private StreamWriter sw;private TcpClient tcpClient;private NetworkStream networkStream;#endregion#region 私有方法  /// <summary>  /// 向服务器发送信息  /// </summary>  private bool SendDataToServer(string str){try{sw.WriteLine(str);sw.Flush();return true;}catch (Exception err){return false;}}/// <summary>  /// 从网络流中读取服务器回送的信息  /// </summary>  private string ReadDataFromServer(){string str = null;try{str = sr.ReadLine();if (str[0] == '-'){str = null;}}catch (Exception err){str = err.Message;}return str;}#endregion#region 获取邮件信息  /// <summary>  /// 获取邮件信息  /// </summary>  /// <param name="uid">邮箱账号</param>  /// <param name="pwd">邮箱密码</param>  /// <returns>邮件信息</returns>  public ArrayList ReceiveMail(string uid, string pwd){ArrayList EmailMes = new ArrayList();string str;int index = uid.IndexOf('@');string pop3Server = "pop3." + uid.Substring(index + 1);tcpClient = new TcpClient(pop3Server, 110);networkStream = tcpClient.GetStream();sr = new StreamReader(networkStream);sw = new StreamWriter(networkStream);if (ReadDataFromServer() == null) return EmailMes;if (SendDataToServer("USER " + uid) == false) return EmailMes;if (ReadDataFromServer() == null) return EmailMes;if (SendDataToServer("PASS " + pwd) == false) return EmailMes;if (ReadDataFromServer() == null) return EmailMes;if (SendDataToServer("LIST") == false) return EmailMes;if ((str = ReadDataFromServer()) == null) return EmailMes;string[] splitString = str.Split(' ');int count = int.Parse(splitString[1]);if (count > 0){for (int i = 0; i < count; i++){if ((str = ReadDataFromServer()) == null) return EmailMes;splitString = str.Split(' ');EmailMes.Add(string.Format("第{0}封邮件,{1}字节", splitString[0], splitString[1]));}return EmailMes;}else{return EmailMes;}}#endregion#region 读取邮件内容  /// <summary>  /// 读取邮件内容  /// </summary>  /// <param name="mailMessage">第几封</param>  /// <returns>内容</returns>  public string ReadEmail(string str){string state = "";if (SendDataToServer("RETR " + str) == false)state = "Error";else{state = sr.ReadToEnd();}return state;}#endregion#region 删除邮件  /// <summary>  /// 删除邮件  /// </summary>  /// <param name="str">第几封</param>  /// <returns>操作信息</returns>  public string DeleteEmail(string str){string state = "";if (SendDataToServer("DELE " + str) == true){state = "成功删除";}else{state = "Error";}return state;}#endregion#region 关闭服务器连接  /// <summary>  /// 关闭服务器连接  /// </summary>  public void CloseConnection(){SendDataToServer("QUIT");sr.Close();sw.Close();networkStream.Close();tcpClient.Close();}#endregion}}
}

2.2 方法的调用

方法调用查看如下所示的样例,mail.AddRecipients()方法,如果需要发送多个邮箱的时候传入数组即可。

        /// <summary>  /// 发送邮件  /// </summary>  //--------------------调用-----------------------  //MailAttachments ma=new MailAttachments();  //ma.Add(@"附件地址");  //MailMessage mail = new MailMessage();  //mail.Attachments=ma;  //mail.Body="你好";  //mail.AddRecipients("zjy99684268@163.com");  //mail.From="zjy99684268@163.com";  //mail.FromName="zjy";  //mail.Subject="Hello";  //SmtpClient sp = new SmtpClient();  //sp.SmtpServer = "smtp.163.com";  //sp.Send(mail, "zjy99684268@163.com", "123456");  //------------------------------------------------  

2.3 查看相关邮箱的设置(这里以QQ邮箱为例)

点击查看POP3/SMTP服务,记得一定要开启哦,开启之后如下图所示。

2.4 运行相关程序,查看邮件内容是否正确

邮件发送成功之后登录到对应的接收邮箱查看邮件内容是否正确。

C#实现电子邮件的发送相关推荐

  1. python如何实现电子邮件的发送

    注明:邮箱如果发送失败,则会报错,可以使用异常处理来检测邮件是否会发送失败 常用SMTP地址 1.QQ邮箱(mail.qq.com) POP3服务器地址:pop.qq.com(端口:110) SMTP ...

  2. PHP邮件功能无法完成电子邮件的发送

    本文翻译自:PHP mail function doesn't complete sending of e-mail <?php$name = $_POST['name'];$email = $ ...

  3. 一封电子邮件的发送和接收的主要步骤

    1,用户使用用户代理编辑好要发送的电子邮件,并且指明正确的收件人地址,然后单击"发送"按钮 2,用户代理使用SMTP协议,将邮件传送到发送方邮件服务器上,保存在邮件缓冲区内,等待发 ...

  4. python中带附件发送电子邮件_python发送带附件邮件

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  5. sendgrid java_java – SendGrid电子邮件API,发送电子邮件附件

    我使用sendgrid发送电子邮件,使用以下代码工作正常 但它没有附件. package sendgrid; import com.sendgrid.Content; import com.sendg ...

  6. word邮件合并发送记录_如何将Word文档作为电子邮件正文发送

    word邮件合并发送记录 If you prefer to write your emails in Word, there is a way to send them directly to you ...

  7. android发送电子邮件,Android发送电子邮件

    电子邮件 是通过电子方式从一个系统用户通过网络分发给一个或多个接收者的消息. 在开始电子邮件活动之前,您必须知道具有意图的电子邮件功能,Intent将数据从一个组件传送到应用程序中或应用程序外部的另一 ...

  8. 电子邮件的发送过程计算机网络,计算机网络技术〖负责电子邮件传输的应用层协议是〗相关单选题...

    1.[题目]负责电子邮件传输的应用层协议是 选项: A.SMTP B.PPP C.IP D.FTP 答案: A 解析: 暂无解析 1.[题目]服务与协议是完全不同的两个概念.下列关于它们的说法错误的是 ...

  9. 电子邮件服务器组成部分,电子邮件系统由哪几部分组成?各部分的作用是什么?简述电子邮件的发送过程。...

    电子邮件e-mail是一种利用网络交换信息的非交互式服务.一份电子邮件一般涉及两个服务器,发送方服务器和接收方服务器.发送方服务器的功能是依照收件人地址将邮件发送出去,发送方服务器就像普通的发信邮局: ...

最新文章

  1. (C++)字符数组的四种输入输出方式
  2. 微信tocken后台后台保存方法
  3. DHCP欺骗(DHCP Sproofing)
  4. 如何设置窗口立即刷新显示
  5. 14.深度学习练习:Face Recognition for the Happy House
  6. android查询所有照片,Android查询外部存储中所有照片
  7. jetty java 文件下载_Jetty 嵌入式开发之文件浏览和文件下载
  8. 2道编程题:1.给定一个字符串,计算字符串中数值的个数并求和。
  9. 基于tkinter的简易加减乘除计算器
  10. c语言if语句教学设计,C实验教案(清华)
  11. vue.js 定义全局组件和局部组件的方法
  12. intel 10G BASE-T 以太网控制器: X540
  13. 网络层协议——ICMP协议
  14. 对偶的应用及拓展(Duality Uses and Correspondences)
  15. 一瞬间、一刹那、一弹指具体是多少时间呢?
  16. 老年手机英文改中文_老年人使用智能手机(九)不会英语不用怕,装一款软件就能出国啦...
  17. Composer 基础使用
  18. 数据挖掘思维和实战06 数据建模:该如何选择一个适合我需求的算法?
  19. Avira AntiVir Personal 8 - FREE Antivirus/免费的杀毒软件
  20. 带你认识不一样的常春藤之一的普林斯顿大学

热门文章

  1. 链创未来——迅雷启动全球区块链应用大赛
  2. Camtasia Studio8如何提高视频画质和清晰度
  3. form表单(自用)
  4. springboot的学习(2)
  5. usb转串口驱动cp210x下载地址(亲测有用)
  6. csdn博客链接如何提交到百度引擎上
  7. android+xposed+实例,Android Studio 上第一个 Xposed 模块(示例代码)
  8. 周鸿祎:恭喜腾讯穿铁裤衩 现在又养条狗
  9. JointJS动态流程图升级
  10. 怎么把多个pdf合并成一个?