C# 发送邮件总结(SMTP)


一、要使用程序来发送邮件,以下几个信息必不可少

Smtp服务器:发送邮件的服务器,如常见的smtp.163.com、smtp.qq.com,不同的服务商,发送邮件的服务器也不相同
账号:发送邮件的邮箱账号
密码:邮箱密码或授权码(注:当你在程序中使用邮箱密码进行发邮件,发现无法发送等问题,就要考虑邮箱是否开启了SMTP权限,是不是需 要使用授权码进行发邮件,像qq、163邮箱,这些邮箱是需要先开启SMTP发送邮件的权限,当开启后,会产生一个授权码,这时第三方就可以使用邮件账号加授权码来实现发送邮件功能)
端口:默认端口25 加密端口一般是 465端口,如果不对,请自行百度查询

二、为什么要加密发送邮件

阿里云为了反垃圾邮件,25端口是封掉的,也就是说,如果你要使用阿里服务器发送邮件,25端口是走不通的,必须使用其他端口发送邮件,
这个时候就要用到加密端口发送邮件。如果你的项目有发送邮件的功能,且在测试服务器上发邮件是正常的,部署到阿里云之后就不行了,
这个时候就要想到是不是服务器端口的问题。

三、邮件发送限制

 1、发送的邮件,可能会被接收方的邮件系统当做垃圾邮件拦截。
 2、程序发送邮件的速度很快的,如果在短时间内发送大量邮件,可能会被当前邮箱所在服务器拦截(邮件发送频率太高)具体限制详情,要 咨询邮件服务器的管理人员。
 3、单个邮箱单日发送大量邮件,很有可能发送失败,理论上每个邮箱所在服务器都会有单日发送邮件数量的限制,具体限制是多少,要咨询 邮件服务器的管理人员。

四、发送邮件的函数

1、基于System.Net.Mail.MailMessage 发送邮件

    /// <summary>
    /// 发送邮件
    /// </summary>
    /// <param name="email">收件人邮箱</param>
    /// <param name="title">标题</param>
    /// <param name="content">发送内容</param>
    /// <returns></returns>
    public static bool SendEmail(string email,string title,string content)
    {
        string _smtpServer = "smtp.163.com";   //SMTP服务器
        string _userName = "test@163.com";   //邮箱
        string _pwd = "test";   //密码或授权码

        if(_smtpServer == "" || _userName == "" || _pwd == "") {
            return false;
        }
        
        using(System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage()) {
            /*   
           * msg.To.Add("b@b.com");可以发送给多人   
           */
            msg.To.Add(email);  //设置收件人

            /*  
            * msg.CC.Add("c@c.com");   
            * msg.CC.Add("c@c.com");可以抄送给多人   
            */

            /* 3个参数分别是 发件人地址(可以随便写),发件人姓名,编码*/
            msg.From = new MailAddress(_userName,_userName,System.Text.Encoding.UTF8);


            msg.Subject = title; //邮件标题   
            msg.SubjectEncoding = System.Text.Encoding.UTF8; //邮件标题编码   
            msg.Body = content;  //邮件内容   
            msg.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码   
            msg.IsBodyHtml = true; //是否是HTML邮件   
            msg.Priority = MailPriority.Normal; //邮件优先级

            SmtpClient client = new SmtpClient(_smtpServer,587); //邮件服务器地址及端口号
            client.EnableSsl = true; //ssl加密发送
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            client.Credentials = new System.Net.NetworkCredential(_userName,_pwd); //邮箱账号  密码
            client.Timeout = 6000;  //6秒超时

            try {
                client.Send(msg);  //发送邮件

                client.Dispose();  //释放资源
                return true;
            } catch(System.Net.Mail.SmtpException ex) {
                return false;
            }
        }
    }

缺点:最近发现该方法不支持163邮箱加密发送,为此在网上找了很久,最终发现System.Net.Mail只支持显式SSL(ExplicitSSL),但是不支持隐式SSL(Implicit SSL),所以会造成163邮箱发送超时的问题,其他邮箱可能也有同样的问题,需要自行测试,如碰到163邮箱加密发送发送超时问题,可以使用下面的发送邮件函数来解决。

2、基于System.Web.Mail 发送邮件(用于解决163邮箱加密发送超时问题,该函数微软已弃用,如果不是特殊情况,不推荐使用该函数)

    /// <summary>
    /// 发送邮件
    /// </summary>
    /// <param name="emails">收件人的邮箱</param>
    /// <param name="title">邮件标题</param>
    /// <param name="content">邮件内容(支持Html)</param>
    public static bool SendEmailBack(List<string> emails,string title,string content)
    {
        string _smtpServer = "smtp.163.com";    //发邮件smtp服务器名称              
        string _userEmail = "test@163.com"; //发送人邮箱地址               
        string _pwd = "test";               //发邮件邮箱的密码或授权码

        System.Web.Mail.MailMessage _msg = new System.Web.Mail.MailMessage();
        //邮件主题
        _msg.Subject = title;
        _msg.BodyFormat = System.Web.Mail.MailFormat.Html;
        //邮件正文
        _msg.Body = content;
        //正文编码
        _msg.BodyEncoding = Encoding.UTF8;
        //优先级
        _msg.Priority = System.Web.Mail.MailPriority.Normal;
        //发件者邮箱地址
        _msg.From = _userEmail;
        //收件人收箱地址
        string _toEmail = "";
        emails.ForEach(s => { _toEmail += s + ","; });

        //_msg.Cc = _toEmail.TrimEnd(',');   //抄送
        _msg.To = _toEmail.TrimEnd(',');   //收件人
        
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate","1");
        //用户名
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername",_userEmail);
        //密码
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword",_pwd);
        //端口
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport",465);
        //是否ssl
        _msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl",true);
        //Smtp服务器
        System.Web.Mail.SmtpMail.SmtpServer = _smtpServer;

        try {
            System.Web.Mail.SmtpMail.Send(_msg);
            return true;
        } catch(SmtpException e) {
            return false;
        }
    }

总结:

163邮箱使用SSL端口发送时出现异常:操作超时,查了好久,发现是因为:System.Net.Mail只支持显式SSL(ExplicitSSL),但是不支持隐式SSL(Implicit SSL),此问题似乎可以用System.Web.Mail或Cdosys.dll解决,System.Web.Mail 测试下来是可以使用的,Cdosys.dll没有用过。
显式SSL通过25端口连接 -> StartTLS(开始加密)-> 验证 -> 发送数据
隐式SSLStartSSL(开始加密) -> 连接 -> 验证 -> 发送数据

以上内容仅为个人见解

总结摘抄自:https://zhaoqi.vip/3123403799.html 感兴趣的同学可以看一下


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM