使用SmtpClient发送电子邮件

        最近做的一个项目中使用到了发送邮件功能。跟以前做过的一个项目发送邮件的方式不同。以前是将要发送邮件的相关信息插入到一个服务器的数据库表中,由数据库来检测新添加记录,进行发送邮件。即我只要向某个数据库插入记录就可以了。这次发送邮件功能是使用微软System.Net.Mail命名空间下的SmtpClient来发送。使用过程中注意引用System.Net.Mail命名空间。

      过程如下:

smtpClient发送邮件
/// <summary>
        
/// 发送邮件
        
/// </summary>
        
/// <param name="server">smtp服务器</param>
        
/// <param name="sender">发件人</param>
        
/// <param name="recipient">收件人</param>
        
/// <param name="subject">主题</param>
        
/// <param name="body">主体内容</param>
        
/// <param name="isBodyHtml">主体内容是否是HTML</param>
        
/// <param name="encoding">编码方式</param>
        
/// <param name="isAuthentication">是否验证</param>
        
/// <param name="files">附件</param>
        public static void Send(string server, string sender, string[] recipient, string subject,
             
string body, bool isBodyHtml, Encoding encoding, bool isAuthentication, params string[] files)
        {
            
//smtp服务器
            SmtpClient smtpClient = new SmtpClient(server);

            
//邮件信息
            MailMessage message = new MailMessage();
            
//客户端用户名验证与此处发件人要相同
            message.From = new MailAddress(sender);
            
//收件人
            foreach (string to in recipient)
            {
                message.To.Add(to);
            }
            
//主体内容是否HTML
            message.IsBodyHtml = isBodyHtml;
            
//编码方式
            message.SubjectEncoding = encoding;
            message.BodyEncoding 
= encoding;
            
//主题
            message.Subject = subject;
            
//主体内容
            message.Body = body;
            
//附件
            message.Attachments.Clear();
            
if (files != null && files.Length != 0)
            {
                
for (int i = 0; i < files.Length; ++i)
                {
                    Attachment attach 
= new Attachment(files[i]);
                    message.Attachments.Add(attach);
                }
            }

            
if (isAuthentication == true)
            {
                
//用户名凭证
                smtpClient.Credentials = new NetworkCredential(ConfigHelper.GetConfigString("userid"), ConfigHelper.GetConfigString("password"));
            }
            
//发送方式:网络方式
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            
//客户端发送邮件
            smtpClient.Send(message);
        }

方法大概是这样的。有几点需要作一下说明:

1.公用邮箱的身份验证。很多公用邮箱为了反垃圾邮件,都加强了用户发邮件的限制。需要用户名密码进行安全验证。即我这里的

smtpClient.Credentials = new NetworkCredential(ConfigHelper.GetConfigString("userid"), ConfigHelper.GetConfigString("password"));

ConfigHelper.GetConfigString("userid")和ConfigHelper.GetConfigString("password")是其他类库的方法,其中userid和password是在web.config中设置的。message.From要与配置的userid相同。即某个身份通过验证后,以它的身份发送。否则会出错。还有一点,发送方式一般设置成Network就可以了。

2.发送频率问题。我所要实现的内网(公司使用foxmail邮箱)之间发送邮件,如果邮件大量瞬时发送,即1秒钟发送好几封邮件这样的频率。发送是不成功的。邮件服务商和公司都通不过。容易被邮件服务商当作垃圾邮件也处理掉了,同时公司也通不过,公司内部之间发送foxmai邮件时是一进一出的过程,占用大量的宽带资源。(我直接通过公司foxmail邮箱向我的163邮箱发送邮件,对发送频率没有做限制,发送成功。结果一下子发送了几千封邮件,把我163的邮箱都挤爆了。)所以最好设置成好几秒钟发送一封。我通过设置System.Threading.Thread.Sleep(5000),使每5秒钟发送一封邮件是OK的。

3.注意放火墙和杀毒软件。这一点我没有太关注,别人有提到过。要注意给这些软件加上规则,以防止它们阻止邮件的发送。

原文地址:https://www.cnblogs.com/purplefox2008/p/1619987.html