最近因为项目需要,研究了一下邮件的发送和接收,发现现在这方面的问题很多.虽然网上这方面的资料很多,但是真正应用起来
仍然会发现不少问题,而且很多人都抱怨书上或者网上的一些代码应用起来是失败的,并且针对附件方面的处理不太完善,针对这种情况我把最近研究所得做一个小小的总结,希望能对大家有所帮助。
首先来谈谈发送邮件的问题。
发送邮件现在应用得最多的两种情况就是利用.NET自带的发送邮件和利用jmail组件来发送邮件。
.NET自带的邮件发送利用了System.Web.Mail.MailMessage这个类,这是在VS2003的情况下,在VS2005下更多的是利用System.Net.Mail.MailMessage,下面的例子是在VS2003的情况下写的,请在应用的时候自己替换掉里面的参数。
stringSendTos=SendTo.Text.Trim(); //发送人
stringCcTos=CcTo.Text.Trim(); //抄送人
string[]Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");//总收件人
stringFromMail="ustbwuyi1@163.com";//发件人
stringTitle="你好";//邮件主题
stringBody="附件里重要文档,请查收!";//邮件主体
stringShowName="ustbwuyi";//显示名字
if(SendTos!=""||CcTos!="")
{
//用户名(取发送邮箱的@前面的部分,即ustbwuyi1
stringMailUserName=FromMail.Substring(0,FromMail.IndexOf("@"));
//密码
stringMailPassword="ustbwuyi";
System.Web.Mail.MailMessagemailmessage=newMailMessage();
mailmessage.From=FromMail;
mailmessage.Subject=Title;
mailmessage.Body=Body;
//添加附件
ArrayListFileNames;
//如果存在附件
if(FileNames.Count>=1)
{
//添加附件
stringFilename;
for(intk=0;k<FileNames.Count;k++)
{
Filename=FileNames[k].ToString();
mailmessage.Attachments.Add(newMailAttachment(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(intj=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(Exceptionex)
{
Response.Write("<scriptlanguage='javascript'>alert('邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!')</script>");
}
}
}
上面的例子是利用163的SMTP邮件服务器来发送邮件,当然,如果你有自己的邮件服务器更好。
其次,是利用jmail组件来发送,现在jmail组件的版本很多,在这里我个人推荐jmail4.4pro版本,因为如果你要收邮件的话,必须用pro版本,另外,个人经过测试了其它几个版本,发现只有这个版本不会出现附件丢失的情况,其他几个版本都会出现附件丢失或者损坏的情况,这个对txt文件来说没有影响,但是对于传送图片或者其他的一些压缩文件,会发现从pop服务器上下过来的附件有一些损坏,从而不能正常打开文件。下面是jmail发送邮件的代码。
jmail.MessageClassMyMail=newjmail.MessageClass();
stringSendTos=SendTo.Text.Trim(); //发送人
stringCcTos=CcTo.Text.Trim(); //抄送人
string[]Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");//总收件人
stringFromMail="ustbwuyi1@163.com";//发件人
stringTitle="你好";//邮件主题
stringBody="附件里是重要文档,请查收!";//邮件主体
stringShowName="ustbwuyi";//显示名字
//取email的@前面部分为用户名,即ustbwuyi1,当然也可以自己设置.
stringMailUserName=FromMail.Substring(0,FromMail.IndexOf("@"));
stringMailPassword="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;
ArrayListFileNames;
//如果存在附件
if(FileNames.Count>=1)
{
//添加附件
stringFilename;
for(intk=0;k<FileNames.Count;k++)
{
Filename=FileNames[k].ToString();
MyMail.AddAttachment(Filename,false,HttpUtility.UrlDecode(Filename.Substring(Filename.LastIndexOf(".")+1,3)));
}
}
try
{
//循环发送
for(inti=0;i<Receiver.Length;i++)
{
MyMail.AddRecipient(Receiver[i],"","");
MyMail.Send("Mail.rshi.cn",false);
}
}
catch(Exceptionex)
{
Response.Write("<scriptlanguage='javascript'>alert('邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!')</script>");
}
}
好了,现在我们来看看接收邮件的问题。一般来说,接收邮件主要分为两部分,一是将接收到的邮件的信息保存到数据库,如邮件的
主题,内容,发送人,发送时间等。其次是对邮件附件的处理,主要将邮件附件从POP服务器上下载下来并保存到数据库,然后将附件
信息保存到数据库,如附件的路径,附件对应的邮件编号等信息。这一点.NET自带的似乎并不太好处理,没有jmail组件处理方便,
当然关于.NET自带的我并没有深入研究,个人经过比较还是推荐jmail,当然前面说过关于jmail几个版本在这方面的差异,所以个人
还是推荐jmail4.4pro版本。下面是收邮件的代码:
publicvoidReceiveMails(stringUsername)
{
jmail.MessageMsg=newjmail.Message();
jmail.POP3jpop=newjmail.POP3();
jmail.Attachmentsatts;
jmail.Attachmentatt;
//username为用户名,该方法通过用户名获取该用户的pop设置,即用户的POP用户名,密码,POP服务器地址以及端口号这四个参数,这四个参数是连接POP服务器的必用参数.
SqlDataReaderdataReader=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(inti=1;i<=jpop.Count;i++)
{
Msg=jpop.Messages[i];
atts=Msg.Attachments;
//取数据库中邮件信息中的最大发送时间,即最近接收到的一封邮件的时间
Databasedbase=newDatabase();
DataTabledata=dbase.GetDataTable("selectmax(MailSendDate)asMailSenderDatefromTabMailListwhereMailTypeFlag='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(intk=0;k<atts.Count;k++)
{
att=atts[k];//获得附件
stringattname=att.Name;
try
{
RandomTempNameInt=newRandom();
stringNewMailDirName=TempNameInt.Next(100000000).ToString();
Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(".")+"//AttachFiles//"+Username+"//"+NewMailDirName);
stringmailPath="//AttachFiles//"+Username+"//"+NewMailDirName+"//"+attname;
att.SaveToFile(System.Web.HttpContext.Current.Server.MapPath(".")+mailPath);
//获取该封邮件在数据库的ID,以便和附件信息相对应,取邮件表中的最大ID即可
intmailID=this.GetMailID();
//将附件信息存入数据库
this.AttExtSend(mailID,attname,att.Size,mailPath,Msg.From);
}
catch(Exceptionex)
{
thrownewException(ex.Message);
}
}
}
}
}
}
//删除服务器上的邮件
jpop.DeleteMessages();
//断开连接
jpop.Disconnect();
}
}
}
至于将邮件信息和附件信息如何存入数据库,就看你自己对表的设计了,我就不多说了,经过上面就可以完全将你POP服务器上的
邮件完全接收到你的本地了。
分享到:
相关推荐
使用控件 通过短信猫 接收、发送短信 使用控件 通过短信猫 接收、发送短信
c 撑 语言是微软新近推 出的基于 . NE T平台的一种可视化编程工具 , 由于 c 撑 具有强大的功能、 友好的界面和简单易学 ·等特点, 深受广大编程爱好者的青昧。本文是笔者在实际工作中用c 撑 语言开发的一个收发...
标题中的“用Google Talk打固定电话和接发语音邮件”是指使用Google Talk这款即时通讯工具进行电话拨打和语音邮件的收发。虽然Google Talk本身并未直接支持这些功能,但通过第三方服务Gtalk2Voip,用户可以实现这些...
根据提供的信息,我们可以总结出以下关于“Excel 发邮件抄送给多人”的相关知识点: ### 1. 使用 Excel VBA 发送带有抄送功能的邮件 在实际工作中,有时我们需要通过 Excel 自动发送邮件,并且需要同时抄送给多个...
2. **附件管理**:用户可以轻松添加、查看和管理邮件附件,无论文件大小,工具都能有效处理,特别适合处理大型文件的传输,比如报告、图片或视频文件。 3. **超大邮件显示**:对于超过普通邮件大小限制的超大邮件,...
在本文中,我们将深入探讨如何使用C#进行串口通信,特别是在Windows Forms(Winform)环境中。这个主题基于提供的标题"C#串口收发数据Dome,winfrom串口收发数据测试,vs2010开发"以及描述中提到的源码。串口通信是...
【MQ单项接发消息】是基于消息队列(Message Queue,简称MQ)技术实现的一种通信方式,主要用于在分布式系统中实现可靠的数据传输。MQ是一种中间件,它允许应用程序之间通过发送和接收消息来异步通信,提高了系统的...
铁路教学非正常接发列车作业标准PPT课件.pptx
铁路单双线半自动接发列车作业标准.pdf铁路单双线半自动接发列车作业标准.pdf铁路单双线半自动接发列车作业标准.pdf铁路单双线半自动接发列车作业标准.pdf铁路单双线半自动接发列车作业标准.pdf
双线自动闭塞接发列车作业是铁路交通中一项关键的操作流程,主要应用于有两条平行线路的铁路系统,采用先进的自动闭塞技术确保列车的安全运行和高效调度。该作业涉及车站值班员、信号员和助理值班员三个主要岗位,...
2. 手动信号显示:在信号系统故障时,工作人员需要学习和掌握手动显示信号的方法,如使用信号旗或手信号灯,以指导列车的进站和出站。 3. 调度命令:非正常接发车时,调度中心会发布特别的调度命令,明确列车运行的...
2. 开放信号:根据列车到站时间,值班员需准确计算开放信号的时间,确保列车在规定距离内能看到信号。信号的开放必须严格按照规定执行,避免错误信号导致事故。助理值班员需在信号开放后确认其显示正确无误。 3. ...
### 51单片机接发相关知识点 #### 一、51单片机引脚说明 51单片机是一种广泛使用的8位微控制器,因其价格低廉、资源丰富而被广泛应用于各种嵌入式系统设计中。下表列出了51单片机的一些关键引脚及其功能: | 引脚...
在文件"TCP网络异步通信_文件接发"中,我们可以预见到会有关于如何在TCP连接上发送和接收文件的示例代码。在C#中,我们可以将文件内容读取为字节数组,然后使用TcpClient的GetStream方法获取网络流,将字节数组写入...
为方便接发任务开发的一款方便使用的小软件!
2. 初始化USART:设置USART的工作模式(同步/异步)、波特率、数据位数、奇偶校验和停止位数。这通常通过调用相应的初始化函数完成,如在STM32 HAL库中,可以使用`HAL_USART_Init()`函数。 3. 配置中断:为了实时...
2. 技术规格:详细列出设备的技术参数,如传输速度、接口类型、电源需求、尺寸和重量等,这些信息对于网络规划和设备选型至关重要。 3. 工作原理:解释设备如何接收、转换并发送信号,可能包括其内部电路设计和信号...
2. **通信协议**:根据应用需求,接发机可能需要支持多种通信协议,如TCP/IP、UART、SPI、I2C、CAN总线等。理解并实现这些协议是设计的关键部分。 3. **硬件设计**:包括电路设计,如模拟前端(AFE)处理、微控制器...
USART2—RS232接发是STM32微控制器中的一个重要通信功能,它涉及到STM32的通用同步/异步收发传输器(USART)的使用,特别是USART2实例,以及通过RS232接口进行双机通信的实现。在STM32系列MCU中,USART是一个强大的...
2. 准备进路:列车进路是列车在车站进出或通过所经过的线路。准备进路是指车站值班员或相关人员操作道岔,确保列车进路上的所有道岔均开通并锁定,以保证列车安全行驶。 3. 布置进路:车站值班员通过口头命令或指示...