.NET郵件的收發

發送郵件現在應用得最多的兩種情況就是利用.NET自帶的發送郵件和利用jmail組件來發送郵件。
  .NET自帶的郵件發送利用了System.Web.Mail.MailMessage這個類,這是在VS2003的情況下,在VS2005下更多的是利用System.Net.Mail.MailMessage,下面的例子是在VS2003的情況下寫的,請在應用的時候自己替換掉裏面的參數。

public void SendMails()
{
    
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";//顯示名字

    
if(SendTos!="" || CcTos!="")
    
{
        
//用戶名(取發送郵箱的@前面的部分,即ustbwuyi1
        string MailUserName=FromMail.Substring(0,FromMail.IndexOf("@"));

        
//密碼
        string MailPassword="ustbwuyi";
        System.Web.Mail.MailMessage mailmessage
=new MailMessage();
        mailmessage.From
=FromMail;
        mailmessage.Subject
=Title;
        mailmessage.Body
=Body;

        
//添加附件
        ArrayList FileNames;
        
//如果存在附件
        if(FileNames.Count>=1)
        
{                    
            
//添加附件
            string Filename;
            
for(int k=0;k<FileNames.Count;k++)
            
{                            
                Filename
=FileNames[k].ToString();
                mailmessage.Attachments.Add(
new MailAttachment(Filename));                        
            }
            
        }

    }

    mailmessage.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1);
    mailmessage.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/sendusername",MailUserName);
    mailmessage.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/sendpassword",MailPassword);
                    
    
//向收件人和抄送人循環發送
    for(int j=0;j<Receiver.Length;j++)
    
{
        mailmessage.To
=Receiver[j].ToString();
        System.Web.Mail.SmtpMail.SmtpServer
="smtp.163.com";
        
try
        
{
            System.Web.Mail.SmtpMail.Send(mailmessage);
        }

        
catch(Exception ex)
        
{        
            Response.Write(
"<script language='javascript'>alert('郵件發送失敗,請您和ustbwuyi聯繫(QQ:108556024)!')</script>");
        }

    }

}

  上面的例子是利用163的SMTP郵件服務器來發送郵件,當然,如果你有自己的郵件服務器更好。
  其次,是利用jmail組件來發送,現在jmail組件的版本很多,在這裏我個人推薦jmail4.4pro版本,因爲如果你要收郵件的話,必須用pro版本,另外,個人經過測試了其它幾個版本,發現只有這個版本不會出現附件丟失的情況,其他幾個版本都會出現附件丟失或者損壞的情況,這個對txt文件來說沒有影響,但是對於傳送圖片或者其他的一些壓縮文件,會發現從pop服務器上下過來的附件有一些損壞,從而不能正常打開文件。下面是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(
"<script language='javascript'>alert('郵件發送失敗,請您和ustbwuyi聯繫(QQ:108556024)!')</script>");
        }

    }

}

  好了,現在我們來看看接收郵件的問題。一般來說,接收郵件主要分爲兩部分,一是將接收到的郵件的信息保存到數據庫,如郵件的主題,內容,發送人,發送時間等。其次是對郵件附件的處理,主要將郵件附件從POP服務器上下載下來並保存到數據庫,然後將附件信息保存到數據庫,如附件的路徑,附件對應的郵件編號等信息。這一點.NET自帶的似乎並不太好處理,沒有jmail組件處理方便,當然關於.NET自帶的我並沒有深入研究,個人經過比較還是推薦jmail,當然前面說過關於jmail幾個版本在這方面的差異,所以個人還是推薦jmail4.4pro版本。下面是收郵件的代碼:

public void ReceiveMails(string Username)
{
    jmail.Message Msg
=new jmail.Message();
    jmail.POP3 jpop 
= new jmail.POP3();
    jmail.Attachments atts;
    jmail.Attachment att;
            
    
//username爲用戶名,該方法通過用戶名獲取該用戶的pop設置,即用戶的POP用戶名,密碼,POP服務器地址以及端口號這四個參數,這四個參數是連接POP服務器的必用參數.
    SqlDataReader dataReader = this.ExtGetSetting(Username);
    
if(dataReader.Read())
    
{
        
if(dataReader["PopServer"].ToString()!=""&&dataReader["PopUsername"].ToString()!="")
        
{
            
//連接POP服務器
            jpop.Connect(dataReader["PopUsername"].ToString(),dataReader["PopPassword"].ToString(),dataReader["PopServer"].ToString(),Int32.Parse(dataReader["PopPort"].ToString()));
            
//如果服務器上有郵件
            if(jpop.Count>=1)
            
{
                
for(int i=1;i<=jpop.Count;i++)
                
{
                    Msg 
= jpop.Messages[i];
                    atts
=Msg.Attachments;

                    
//取數據庫中郵件信息中的最大發送時間,即最近接收到的一封郵件的時間
                    Database dbase=new Database();
                    DataTable data
=dbase.GetDataTable("select max(MailSendDate) as MailSenderDate from TabMailList where MailTypeFlag='1'");
                                
                    
//對服務器上的郵件的發送時間和數據庫最近一封郵件的時間進行比較,如果大那麼證明該郵件還未被收取,是一封新郵件,這樣避免重複收取郵件入庫
                    if(Msg.Date>Convert.ToDateTime(data.Rows[0][0].ToString()))
                    
{
                        
//將這封新郵件的信息保存到數據庫
                        this.SaveExtMail(Msg,Username,dataReader["Email"].ToString(),jpop.GetMessageUID(i));
                            
                        
//獲取附件上傳到服務器並且將信息存入數據庫
                        if(atts.Count>=1)
                        
{
                            
for(int k=0;k<atts.Count;k++)
                            
{
                                att
=atts[k];//獲得附件
                                string attname=att.Name;
                                
try
                                
{
                                    Random TempNameInt    
= new Random(); 
                                    
string NewMailDirName  = TempNameInt.Next(100000000).ToString();
                                    Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(
".")+"AttachFiles"+Username+""+NewMailDirName);
                                    string mailPath="AttachFiles"+Username+""+NewMailDirName+""+attname;
                                    att.SaveToFile(System.Web.HttpContext.Current.Server.MapPath(".")+mailPath); 
                                    
//獲取該封郵件在數據庫的ID,以便和附件信息相對應,取郵件表中的最大ID即可
                                    int mailID=this.GetMailID();
                                    
//將附件信息存入數據庫
                                    this.AttExtSend(mailID,attname,att.Size,mailPath,Msg.From);
                                }

                                
catch(Exception ex)
                                
{
                                    
throw new Exception(ex.Message);
                                }

                            }

                        }

                    }

                }

            }

            
//刪除服務器上的郵件
            jpop.DeleteMessages();
            
//斷開連接
            jpop.Disconnect();
        }

    }

}

至於將郵件信息和附件信息如何存入數據庫,就看你自己對錶的設計了,我就不多說了,經過上面就可以完全將你POP服務器上的郵件完全接收到你的本地了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章