關於.NET郵件的收發問題總結,.net郵件收發
最近因為項目需要,研究了一下郵件的發送和接收,發現現在這方面的問題很多.雖然網上這方面的資料很多,但是真正應用起來
仍然會發現不少問題,而且很多人都抱怨書上或者網上的一些代碼應用起來是失敗的,並且針對附件方面的處理不太完善,針對這種情況我把最近研究所得做一個小小的總結,希望能對大家有所幫助。
首先來談談發送郵件的問題。
發送郵件現在應用得最多的兩種情況就是利用.NET自帶的發送郵件和利用jmail組件來發送郵件。
.NET自帶的郵件發送利用了System.Web.Mail.MailMessage這個類,這是在VS2003的情況下,在VS2005下更多的是利 用System.Net.Mail.MailMessage,下面的例子是在VS2003的情況下寫的,請在應用的時候自己替換掉裡面的參數。
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發送郵件的代碼。
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服務器上的
郵件完全接收到你的本地了。
郵件收發模塊NET來實現
1樓代碼好長
工作一年,領導要寫年終總結,我在文印室工作,還附帶各部門報紙與信件的收發
我的工作和你的差不多,我的報告已經寫好了 順便給你解燃眉之急。呵呵。
2009年度個人工作總結
在公司全體上下的忙碌拼搏中,2009年就這樣悄悄的過去了。這一年,有喜悅的笑容,也有酸楚的艱辛,有激動人心的成功,也有閃著淚花的感動。人人都有值得高興的地方,人人都有需要深思的地方。我也在這裡度過了我職業生涯的一年,這一年來的點點滴滴,不管是對公司還是對我自己,我都感觸頗深。
一、回首09
回首09,從我加入xx的第一天起,我就知道,這是一支充滿蓬勃朝氣和無限前景的優秀團隊。當時,我對自己只有3個字:好好干!
①我的工作(把你的工作寫進去,寫的詳細一點,辛苦一點)
我平日裡最主要的工作就是貫徹公司管理安全化、規范化的精神,認真做好……………………………………工作,協助部長做好本部門的其他工作,另外,還有協助三樓其他部門做一些文書工作。在這些事情上,我都會做調查搜集資料工作,慢慢的學習充實自己。
②我的收獲
雖然我的工作不像業務員那樣業績滿滿,我只是在自己的崗位上為公司盡力,但是我認為,認真工作是對自己負責,對公司負責,對社會負責,認真工作就是好的,這就是我09年最大的收獲。對於工作,熟悉並熟練掌握自己的工作,為公司做好每一件事,真正融入到xx這個團隊中,就是我在工作上的收獲。
③我的反思
常言道:有得必有失。在收獲09的時候,我是不是也應該仔細想想失去了什麼呢?剛進入公司的時候,我熱情洋溢,心中有滿腔熱血,規劃著理想的藍圖。而現在,剛踏入社會的那份新奇感已經逐漸消失,社會的責任感開始壓到我的肩頭,而我每天千篇一律的工作也慢慢變得平淡無奇,毫無挑戰性可言。這也是許許多多應屆畢業生剛剛走上工作崗位所面臨的第一個考驗。
很多人在這樣一種心態中自怨自艾,迷失了自己。我知道,我必須盡快從這種局面中走出來。思前想後,我忽然意識到:不是工作太平淡,而是我們太平凡。並不是所有人都能像理想中的那樣,一下子找到心目中的平台,因為我們都是平凡的人。我終於明白,我現在要做的就是在平凡的崗位上做出不平凡的業績,為公司的發展盡最大的努力。
二、展望10
在10年,公司必將踏上一個更高的平台,相信我們的產品可以在世界上走得更遠。我作為公司的一份子,作為公司的一份子,更是要在工作的同事努力學習,充實自己,做好本職工作,幫助需要幫助的兄弟科室。
三、結束語
現在就是2010年了,我們大家面前的路都還很長,相信在新的一年裡,xx會取得比09年更高的成就,我也會緊跟領導的步伐,積極發揮自己的主觀能動性,向前發展,為公司的可持續高效發展,為團隊的和諧進步,盡最大的力!
最後祝公司在新的一年裡蒸蒸日上,全體員工合家歡樂!
此致
敬禮!
xxx部門 xxx
2009-12-31