zoukankan      html  css  js  c++  java
  • 使用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.注意放火墙和杀毒软件。这一点我没有太关注,别人有提到过。要注意给这些软件加上规则,以防止它们阻止邮件的发送。

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/purplefox2008/p/1619987.html
Copyright © 2011-2022 走看看