现在我有一个问题,在asp.net中如何一次性发送一万封邮件?我们网站注册的会员有1万多个,比如元旦的时候想对所有会员发封邮件祝贺下,但是问题是现在我发送邮件用的是代码写的,所以没次都只能发个30封左右,后面的就没戏了。不知道哪位高手有方法帮我解决下这个难题。最后能给个例子我把我的代码附在下面:
 String[] arrEmail = Emails.Split(',');//将所有的邮件地址放在数组arrEmail里
        if (!Emails.Trim().Equals(""))
        {
            int temp = arrEmail.Length;
            for (int i = 0; i < arrEmail.Length; i++)
            {
                sendEmail("", "", "", arrEmail[i], this.t_subject.Text, this.Content.Value);
            }
     Response.Write("<script>alert('发送完毕,你已成功发送" + temp + "封邮件!')</script>");
        }

解决方案 »

  1.   

    使用jmail组件
    jmail.Message jm = new jmail.Message();                jm.MailServerUserName = m_strMail_UserName;
                    jm.MailServerPassWord = m_strMail_Password;                jm.Logging = true;
                    jm.Silent = true;
                    jm.Charset = "gb2312";
                    jm.Encoding = "base64";
                    jm.ContentTransferEncoding = "base64";
    //邮件发送
                            try
                            {
                                #region 发送人                            jm.From = strSender;
                                jm.FromName = strSenderName;                            #endregion                            #region 接收人,抄送,暗送
                                jm.Recipients.Clear();                            //收件人
                                if (strReceiver.Trim() != "")
                                {
                                    string[] strReceiverList = strReceiver.Trim().Trim(';').Trim().Split(';');
                                    foreach (string strTempReceiver in strReceiverList)
                                    {
                                        jm.AddRecipient(strTempReceiver.Trim(), strTempReceiver, strTempReceiver);
                                    }
                                }
                                //抄送
                                if (strCC.Trim() != "")
                                {
                                    string[] strCCList = strCC.Trim().Trim(';').Trim().Split(';');
                                    foreach (string strTempCC in strCCList)
                                    {
                                        jm.AddRecipientCC(strTempCC.Trim(), strTempCC, strTempCC);
                                    }
                                }
                                //暗送
                                if (strBCC.Trim() != "")
                                {
                                    string[] strBCCList = strBCC.Trim().Trim(';').Trim().Split(';');
                                    foreach (string strTempBCC in strBCCList)
                                    {
                                        jm.AddRecipientBCC(strTempBCC.Trim(), strTempBCC);
                                    }
                                }                            #endregion                            #region 邮件内容
                                jm.ClearAttachments();                            jm.Subject = strSubject;
                                
                                //HTML标记必须封闭
                                strBody = "<html>" + strBody + "</html>";
                                jm.HTMLBody = strBody;                            //附件
                                if (strAttachment.Trim() != "")
                                {
                                    string[] strAttachmentList = strAttachment.Trim().Trim('|').Trim().Split('|');
                                    ArrayList strAttachmentListResult = new ArrayList();
                                    #region 剔除无效、重复附件                                foreach (string strTempAttachment in strAttachmentList)
                                    {
                                        //附件不为空 且 不重复
                                        if (strTempAttachment.Trim() != "" && !strAttachmentListResult.Contains(strTempAttachment.ToUpper().Trim()))
                                        {
                                            strAttachmentListResult.Add(strTempAttachment.ToUpper().Trim());
                                        }
                                    }                                #endregion                                foreach (string strTempAttachment in strAttachmentListResult)
                                    {
                                        jm.AddAttachment(strTempAttachment.Trim(), true, "application/octet-stream");
                                    }
                                }                            #endregion                            #region 发送                            if (jm.Send(m_strMail_Server, false))
                                {
                                    //成功
                                }
                                else
                                {
                                    //失败
                                }                            #endregion
                            }
      

  2.   

    最好写个windows 服务发,别一次发那么多.可以分批发.
      

  3.   

    http://zzk.cnblogs.com/s?w=jmail&t=
      

  4.   

    看在100分的面子上。告诉你。哈哈  先在网上下一个jmail.dll(google搜一下就有。)然后在给你个代码。   
      public   bool   SendMail(string   from   ,string   fromName,string   subject   ,string   body   ,   
      string   attachmentFile1,string   attachmentFile2,bool   isinline,bool   isHtml,string[]   mailTo   )   
      {   
      jmail.MessageClass   MsgMail   =   new   jmail.MessageClass();   
        
      MsgMail.Logging   =   true;   
      MsgMail.Silent   =   true;   
      MsgMail.Charset   =   "GB2312";   
      MsgMail.Encoding   =   "Base64";   
        
      MsgMail.ISOEncodeHeaders   =   false;     
      MsgMail.From   =   from;   
      if   (fromName!=""){MsgMail.FromName   =   fromName;}   
        
      //加收件人   
      for   (int   i=0;i<mailTo.Length;i++)   
      {   
      string   emailAddress=mailTo[i].ToString();   
      i++;   
      string   MailToName=mailTo[i].ToString();   
      if   (MailToName==""   )   
      {MsgMail.AddRecipient(emailAddress,null,null);}   
      else{MsgMail.AddRecipient(emailAddress,MailToName,null);}   
      }   
        
      MsgMail.Subject   =   subject;   
      MsgMail.Body   =   body;   
        
      // if   (isHtml)   
      // {   
      MsgMail.ContentType="text/html";   
      // }   
      // else   
      // {   
      // MsgMail.ContentType="text/plain";   
      // }   
      if   (attachmentFile1!="")   
      {   
      MsgMail.AddAttachment(attachmentFile1,isinline,null);//例如:text/plain表示txt文档   
      }   
      if   (attachmentFile2!="")   
      {   
      MsgMail.AddAttachment(attachmentFile2,isinline,null);//例如:text/plain表示txt文档   
      }   
        
      MsgMail.MailServerUserName   =   "[email protected]";           //登录邮件服务器所需的用户名   
      MsgMail.MailServerPassWord   =   "fhquutuu"   ;   
        
      if(MsgMail.Send("mail.51db.com",   false))   
      {return   true;}   
      else   
      {   return   false;   }   
        
      }   
      }
      

  5.   

    使用JMAIL不会被打断吗?
    我希望是可以一万封都发完,不要出现掉了没法的现象
      

  6.   

    windows服务?能详细点吗?
    我知道SQL有个邮件服务
    但是我不会用
      

  7.   

    jmail 现在还有多少邮箱支持???
      

  8.   

    Jmail的功能是强大,但是在强大的功能也是建立在一定限度之上的,建议你搞几个线程来个循环发送,一次性发送几十封的样子。这些信你就放在一个数据库里面,这样用不了多久电脑就自动帮你搞定了!
    public void SendMails() 
    ...{ 
        jmail.MessageClass MyMail = new jmail.MessageClass(); 
        string SendTos=SendTo.Text.Trim();  //发送人 
        string CcTos=CcTo.Text.Trim();      //抄送人 
        string[] Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");  //总收件人 
        string FromMail="[email protected]";//发件人 
        string Title="你好"; //邮件主题 
        string Body="附件里是重要文档,请查收!";  //邮件主体 
        string ShowName="ustbwuyi";//显示名字 
        //取email的@前面部分为用户名,即ustbwuyi1,当然也可以自己设置. 
        string MailUserName=FromMail.Substring(0,FromMail.IndexOf("@")); 
        string MailPassword="ustbwuyi"; 
        if(SendTos!="" || CcTos!="") 
        ...{ 
            // 字符集 
            MyMail.Charset = "GB2312"; 
            //附件的编码格式 
            MyMail.Encoding = "BASE64"; 
            //是否将信头编码成iso-8859-1字符集 
            MyMail.ISOEncodeHeaders = false; 
            //发送人邮件地址 
            MyMail.From = FromMail; 
            //发送人姓名 
            MyMail.FromName = ShowName; 
            // 邮件主题 
            MyMail.Subject =Title; 
            //身份验证的用户名 
            MyMail.MailServerUserName = MailUserName; 
            //用户密码 
            MyMail.MailServerPassWord = MailPassword; 
            //邮件内容 
            MyMail.Body = Body; 
            ArrayList FileNames; 
            //如果存在附件 
            if(FileNames.Count>=1) 
            ...{ 
                //添加附件 
                string Filename; 
                for(int k=0;k <FileNames.Count;k++) 
                ...{ 
                    Filename=FileNames[k].ToString(); 
                    MyMail.AddAttachment(Filename,false,HttpUtility.UrlDecode(Filename.Substring(Filename.LastIndexOf(".")+1,3))); 
                }            
            }         try 
            ...{ 
                //循环发送 
                for(int i=0;i <Receiver.Length;i++) 
                ...{ 
                    MyMail.AddRecipient(Receiver[i],"",""); 
                    MyMail.Send("Mail.rshi.cn",false); 
                } 
                        
            } 
            catch(Exception ex) 
            ...{ 
                Response.Write("邮件发送失败,请您检查网络或物理连接"); 
            } 
        } 
    }
    供你参考参考!
      

  9.   


    163.com新的注册的全部都不支持,,,,我那个6年前注册的就可以
      

  10.   

    不要用aspx页面来发,会超时返回的,写个应用程序来发
      

  11.   

    回复18楼我现在也是用线程在解决这个问题。
    没用线程前是这样实现的
    for(int i=0;i<aryEmail.rows.count;i++)
    {
    sendEmail(toWho,subject,content);
    }
    现在用了线程后是这样的
    for(int i=0;i<aryEmail.rows.count;i++)
    {
    sendEmail(toWho,subject,content);
    Thread.Sleep(10000);//线程休息10秒钟。
    }
    但是这样会不会影响程序性能?执行一定时候不执行了?
      

  12.   

    其实楼主问的是为什么发不完,而不是用什么组件,imail\jmail都可以,为什么发不完,我想你可以试一下不要用数组来存放MAIL列表,表数据表试试,另外,多线程试试