現在我們來看看內送郵件的問題。一般來說,內送郵件主要分為兩部分,一是將接收到的郵件的資訊儲存到資料庫,如郵件的
主題,內容,發送人,發送時間等。其次是對郵件附件的處理,主要將郵件附件從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伺服器上的
郵件完全接收到你的本地了。