现在我们来看看接收邮件的问题。一般来说,接收邮件主要分为两部分,一是将接收到的邮件的信息保存到数据库,如邮件的
主题,内容,发送人,发送时间等。其次是对邮件附件的处理,主要将邮件附件从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服务器上的
邮件完全接收到你的本地了。