c# 接发邮件2
最近因為項目需要,研究了一下郵件的發送和接收,發現現在這方面的問題很多.雖然網上這方面的資料很多,但是真正應用起來
仍然會發現不少問題,而且很多人都抱怨書上或者網上的一些代碼應用起來是失敗的,并且針對附件方面的處理不太完善,針對這種情況我把最近研究所得做一個小小的總結,希望能對大家有所幫助。
??????? 首先來談談發送郵件的問題。
?????? 發送郵件現在應用得最多的兩種情況就是利用.NET自帶的發送郵件和利用jmail組件來發送郵件。
?????? .NET自帶的郵件發送利用了System.Web.Mail.MailMessage這個類,這是在VS2003的情況下,在VS2005下更多的是利用System.Net.Mail.MailMessage,下面的例子是在VS2003的情況下寫的,請在應用的時候自己替換掉里面的參數。
??????
????????????string?CcTos=CcTo.Text.Trim();?? ??//抄送人
????????????string[]?Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");??//總收件人
????????????string?FromMail="ustbwuyi1@163.com";//發件人
????????????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發送郵件的代碼。
?????
????????????string?SendTos=SendTo.Text.Trim(); //發送人
????????????string?CcTos=CcTo.Text.Trim();?? ??//抄送人
????????????string[]?Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");??//總收件人
????????????string?FromMail="ustbwuyi1@163.com";//發件人
????????????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版本。下面是收郵件的代碼:
?
????????{
????????????
????????????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服務器上的
郵件完全接收到你的本地了。
轉載于:https://www.cnblogs.com/encounter/archive/2011/04/19/2188796.html
總結
- 上一篇: ThinkPHP采用模块和操作
- 下一篇: java复习题_java习题-(stat