SMTP邮件发送

SMTP简介

简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)是在Internet传输email的事实标准。

       SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX (Mail eXchange)

       在八十年代早期SMTP开始被广泛地使用。当时,它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反,SMTP在发送和接收的机器在持续连线的网络情况下工作得最好。

       Sendmail是最早使用SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP实现为一个客户端(消息的发送者)或一个服务器(消息的接收者)。一些其他的流行的SMTP服务器程序包括了Philip Hazel的exim,IBM的Postfix,D. J. Bernstein的Qmail,以及Microsoft Exchange Server。

       由于这个协议开始是基于纯ASCII文本的,它在二进制文件上处理得并不好。诸如MIME的标准被开发来编码二进制文件以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

     SMTP是一个“推”的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3或IMAP。另一个SMTP服务器可以使用ETRN在SMTP上触发一个发送。

      SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

 SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

SMTP 发信方法

使用 SMTP 协议的邮件服务器分为两种:

  • 一种为邮件发送服务器,通常叫做 smtpd,需要发件人进行认证。
  • 一种为邮件接收服务器,通常叫做 mx,接收外部运营商用户投递给本地用户的邮件。

通过 SMTP 协议发送邮件的整体过程如下:

  1. 客户端使用 telnet 命令连接到SMTP服务器,建立会话。
  2. 客户端发送一个 HELO 或 EHLO 命令。
  3. 客户端发送一个 AUTH 认证命令进行用户登录(使用 smtpd 方式)。
  4. 客户端发送一个 MAIL 命令指定发件人。
  5. 客户端发送一个 RCPT 命令指定收件人。
  6. 客户端发送一个 DATA 命令准备输入邮件正文。
  7. 客户端发送一个 . 命令(点命令)表示 DATA 命令结束。
  8. 客户端发送一个 QUIT 命令结束会话。

示例图:

SMTP邮件发送_第1张图片

手工发送邮件:telnet smtp.qq.com 587 (qq是587,163是25)

手工发送邮件参照链接:

    作者:YSOcean  出处:http://www.cnblogs.com/ysocean/

SMTP常用的响应

501——参数格式错误

502——命令不可实现

503——错误的命令序列

504——命令参数不可实现

211——系统状态或系统帮助响应

214——帮助信息

220——服务器就绪

221——服务关闭

421——服务器未就绪,关闭传输信道

250——要求的邮件操作完成

251——用户非本地,将转发向

450——要求的邮件操作未完成,邮箱不可用

550——要求的邮件操作未完成,邮箱不可用

451——放弃要求的操作,处理过程中出错

551——用户非本地,请尝试

452——系统存储不足,要求的操作未执行

552——过量的存储分配,要求的操作未执行

553——邮箱名不可用,要求的操作未执行

354——开始邮件输入,以“.”结束

554——操作失败

POP3协议

      允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

STMP,POP3和IMAP端口详情

    一般采用SSL协议端口号。目前比较倾向于imap邮件发送

SMTP邮件发送_第2张图片

       IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

SMTP邮件发送_第3张图片

       总之,IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。

STMP部分代码:

实现:

   public Tuple Send(bool isAsync = true)
        {
            //使用指定的邮件地址初始化MailAddress实例
            MailAddress maddr = new MailAddress(mailFrom);
            //初始化MailMessage实例
            MailMessage myMail = new MailMessage();


            //向收件人地址集合添加邮件地址
            if (mailToArray != null)
            {
                for (int i = 0; i < mailToArray.Length; i++)
                {
                    myMail.To.Add(mailToArray[i].ToString());
                }
            }

            //向抄送收件人地址集合添加邮件地址
            if (mailCcArray != null)
            {
                for (int i = 0; i < mailCcArray.Length; i++)
                {
                    myMail.CC.Add(mailCcArray[i].ToString());
                }
            }
            //发件人地址
            myMail.From = maddr;

            //电子邮件的标题
            myMail.Subject = mailSubject;

            //电子邮件的主题内容使用的编码
            myMail.SubjectEncoding = Encoding.UTF8;

            //电子邮件正文
            myMail.Body = mailBody;

            //电子邮件正文的编码
            myMail.BodyEncoding = Encoding.UTF8;

            //myMail.Priority = MailPriority.High;

            myMail.IsBodyHtml = isbodyHtml;

            //在有附件的情况下添加附件
            try
            {
                if (attachmentsPath != null && attachmentsPath.Length > 0)
                {
                    Attachment attachFile = null;
                    foreach (string path in attachmentsPath)
                    {
                        attachFile = new Attachment(path);
                        myMail.Attachments.Add(attachFile);
                    }
                }
            }
            catch (Exception err)
            {
                return new Tuple(false, err.ToString());
            }

            SmtpClient smtp = new SmtpClient();
            //指定发件人的邮件地址和密码以验证发件人身份
            smtp.Host = host;
            smtp.EnableSsl = true;
            smtp.UseDefaultCredentials = false;
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.Credentials = new System.Net.NetworkCredential(mailFrom, mailPwd);
            //smtp.Port = 465;
            try
            {
                ServicePointManager.ServerCertificateValidationCallback = delegate (Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

                //将邮件发送到SMTP邮件服务器
                if (isAsync)
                {
                    smtp.SendAsync(myMail, DateTime.Now);
                }
                else
                {
                    smtp.Send(myMail);
                }

                return new Tuple(true, string.Empty);

            }
            catch (System.Net.Mail.SmtpException ex)
            {
                return new Tuple(false, ex.ToString());
            }
            finally
            {
                smtp.Dispose();
                myMail.Dispose();
            }

        }

发送:

    public static Tuple Send(string subject, string body, string email)
        {
            EmailProxy proxy = new EmailProxy();

            proxy.mailFrom = "登陆用户";
            proxy.mailPwd = "密码";(授权密码)
            proxy.mailSubject = subject;
            proxy.mailBody = body ;
            proxy.isbodyHtml = true;

            //使用smtp
            proxy.host = "smtp.qq.com";
            proxy.mailToArray = email.Split(',');

            //图片或者文件
            proxy.attachmentsPath = new string[] { };

            return proxy.Send(false);
        }

你可能感兴趣的:(smtp邮件)