c# 接发邮件2

By | 04月19日
Advertisement

最近因为项目需要,研究了一下邮件的发送和接收,发现现在这方面的问题很多.虽然网上这方面的资料很多,但是真正应用起来
仍然会发现不少问题,而且很多人都抱怨书上或者网上的一些代码应用起来是失败的,并且针对附件方面的处理不太完善,针对这种情况我把最近研究所得做一个小小的总结,希望能对大家有所帮助。
首先来谈谈发送邮件的问题。

发送邮件现在应用得最多的两种情况就是利用.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("@"));
c# 接发邮件2

c# 接发邮件2
//密码
c# 接发邮件2
string MailPassword="ustbwuyi";
c# 接发邮件2
System.Web.Mail.MailMessage mailmessage=new MailMessage();
c# 接发邮件2
mailmessage.From=FromMail;
c# 接发邮件2
mailmessage.Subject=Title;
c# 接发邮件2
mailmessage.Body=Body;
c# 接发邮件2

c# 接发邮件2
//添加附件
c# 接发邮件2

c# 接发邮件2
ArrayList FileNames;
c# 接发邮件2
//如果存在附件
c# 接发邮件2
if(FileNames.Count>=1)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
//添加附件
c# 接发邮件2
string Filename;
c# 接发邮件2
for(int k=0;k<FileNames.Count;k++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
Filename=FileNames[k].ToString();
c# 接发邮件2
mailmessage.Attachments.Add(new MailAttachment(Filename));
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
mailmessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1);
c# 接发邮件2
mailmessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername",MailUserName);
c# 接发邮件2
mailmessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword",MailPassword);
c# 接发邮件2

c# 接发邮件2

c# 接发邮件2
//向收件人和抄送人循环发送
c# 接发邮件2
for(int j=0;j<Receiver.Length;j++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
mailmessage.To=Receiver[j].ToString();
c# 接发邮件2
System.Web.Mail.SmtpMail.SmtpServer="smtp.163.com";
c# 接发邮件2
try
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
System.Web.Mail.SmtpMail.Send(mailmessage);
c# 接发邮件2
}
c# 接发邮件2
catch(Exception ex)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
Response.Write("<script language='javascript'>alert('邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!')</script>");
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2

上面的例子是利用163的SMTP邮件服务器来发送邮件,当然,如果你有自己的邮件服务器更好。

其次,是利用jmail组件来发送,现在jmail组件的版本很多,在这里我个人推荐jmail4.4pro版本,因为如果你要收邮件的话,必须用pro版本,另外,个人经过测试了其它几个版本,发现只有这个版本不会出现附件丢失的情况,其他几个版本都会出现附件丢失或者损坏的情况,这个对txt文件来说没有影响,但是对于传送图片或者其他的一些压缩文件,会发现从pop服务器上下过来的附件有一些损坏,从而不能正常打开文件。下面是jmail发送邮件的代码。

c# 接发邮件2
jmail.MessageClass MyMail = new jmail.MessageClass();
c# 接发邮件2

c# 接发邮件2
string SendTos=SendTo.Text.Trim();  //发送人
c# 接发邮件2
string CcTos=CcTo.Text.Trim();    //抄送人
c# 接发邮件2
string[] Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,","); //总收件人
c# 接发邮件2
string FromMail="[email protected]";//发件人
c# 接发邮件2
string Title="你好"; //邮件主题
c# 接发邮件2
string Body="附件里是重要文档,请查收!"; //邮件主体
c# 接发邮件2
string ShowName="ustbwuyi";//显示名字
c# 接发邮件2
//取email的@前面部分为用户名,即ustbwuyi1,当然也可以自己设置.
c# 接发邮件2
string MailUserName=FromMail.Substring(0,FromMail.IndexOf("@"));
c# 接发邮件2
string MailPassword="ustbwuyi";
c# 接发邮件2
if(SendTos!="" || CcTos!="")
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2

c# 接发邮件2
// 字符集
c# 接发邮件2
MyMail.Charset = "GB2312";
c# 接发邮件2
//附件的编码格式
c# 接发邮件2
MyMail.Encoding = "BASE64";
c# 接发邮件2
c# 接发邮件2
/**/////是否将信头编码成iso-8859-1字符集
c# 接发邮件2
MyMail.ISOEncodeHeaders = false;
c# 接发邮件2
//发送人邮件地址
c# 接发邮件2
MyMail.From = FromMail;
c# 接发邮件2
//发送人姓名
c# 接发邮件2
MyMail.FromName = ShowName;
c# 接发邮件2
// 邮件主题
c# 接发邮件2
MyMail.Subject =Title;
c# 接发邮件2
//身份验证的用户名
c# 接发邮件2
MyMail.MailServerUserName = MailUserName;
c# 接发邮件2
//用户密码
c# 接发邮件2
MyMail.MailServerPassWord = MailPassword;
c# 接发邮件2
//邮件内容
c# 接发邮件2
MyMail.Body = Body;
c# 接发邮件2
ArrayList FileNames;
c# 接发邮件2
//如果存在附件
c# 接发邮件2
if(FileNames.Count>=1)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
//添加附件
c# 接发邮件2
string Filename;
c# 接发邮件2
for(int k=0;k<FileNames.Count;k++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
Filename=FileNames[k].ToString();
c# 接发邮件2
MyMail.AddAttachment(Filename,false,HttpUtility.UrlDecode(Filename.Substring(Filename.LastIndexOf(".")+1,3)));
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2
try
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
//循环发送
c# 接发邮件2
for(int i=0;i<Receiver.Length;i++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
MyMail.AddRecipient(Receiver[i],"","");
c# 接发邮件2
MyMail.Send("Mail.rshi.cn",false);
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2

c# 接发邮件2
}
c# 接发邮件2
catch(Exception ex)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
Response.Write("<script language='javascript'>alert('邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!')</script>");
c# 接发邮件2

c# 接发邮件2
}
c# 接发邮件2
}

好了,现在我们来看看接收邮件的问题。一般来说,接收邮件主要分为两部分,一是将接收到的邮件的信息保存到数据库,如邮件的
主题,内容,发送人,发送时间等。其次是对邮件附件的处理,主要将邮件附件从POP服务器上下载下来并保存到数据库,然后将附件
信息保存到数据库,如附件的路径,附件对应的邮件编号等信息。这一点.NET自带的似乎并不太好处理,没有jmail组件处理方便,
当然关于.NET自带的我并没有深入研究,个人经过比较还是推荐jmail,当然前面说过关于jmail几个版本在这方面的差异,所以个人
还是推荐jmail4.4pro版本。下面是收邮件的代码:

c# 接发邮件2
public void ReceiveMails(string Username)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2

c# 接发邮件2
jmail.Message Msg=new jmail.Message();
c# 接发邮件2
jmail.POP3 jpop = new jmail.POP3();
c# 接发邮件2
jmail.Attachments atts;
c# 接发邮件2
jmail.Attachment att;
c# 接发邮件2

c# 接发邮件2
//username为用户名,该方法通过用户名获取该用户的pop设置,即用户的POP用户名,密码,POP服务器地址以及端口号这四个参数,这四个参数是连接POP服务器的必用参数.
c# 接发邮件2
SqlDataReader dataReader = this.ExtGetSetting(Username);
c# 接发邮件2
if(dataReader.Read())
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
if(dataReader["PopServer"].ToString()!=""&&dataReader["PopUsername"].ToString()!="")
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
//连接POP服务器
c# 接发邮件2
jpop.Connect(dataReader["PopUsername"].ToString(),dataReader["PopPassword"].ToString(),dataReader["PopServer"].ToString(),Int32.Parse(dataReader["PopPort"].ToString()));
c# 接发邮件2
//如果服务器上有邮件
c# 接发邮件2
if(jpop.Count>=1)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
for(int i=1;i<=jpop.Count;i++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2

c# 接发邮件2
Msg = jpop.Messages[i];
c# 接发邮件2
atts=Msg.Attachments;
c# 接发邮件2

c# 接发邮件2
//取数据库中邮件信息中的最大发送时间,即最近接收到的一封邮件的时间
c# 接发邮件2
Database dbase=new Database();
c# 接发邮件2
DataTable data=dbase.GetDataTable("select max(MailSendDate) as MailSenderDate from TabMailList where MailTypeFlag='1'");
c# 接发邮件2

c# 接发邮件2
//对服务器上的邮件的发送时间和数据库最近一封邮件的时间进行比较,如果大那么证明该邮件还未被收取,是一封新邮件,这样避免重复收取邮件入库
c# 接发邮件2
if(Msg.Date>Convert.ToDateTime(data.Rows[0][0].ToString()))
c# 接发邮件2

c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
//将这封新邮件的信息保存到数据库
c# 接发邮件2
this.SaveExtMail(Msg,Username,dataReader["Email"].ToString(),jpop.GetMessageUID(i));
c# 接发邮件2

c# 接发邮件2
//获取附件上传到服务器并且将信息存入数据库
c# 接发邮件2
if(atts.Count>=1)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
for(int k=0;k<atts.Count;k++)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2

c# 接发邮件2
att=atts[k];//获得附件
c# 接发邮件2

c# 接发邮件2
string attname=att.Name;
c# 接发邮件2
try
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2

c# 接发邮件2
Random TempNameInt = new Random();
c# 接发邮件2
string NewMailDirName = TempNameInt.Next(100000000).ToString();
c# 接发邮件2
Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(".")+"//AttachFiles//"+Username+"//"+NewMailDirName);
c# 接发邮件2

c# 接发邮件2
string mailPath="//AttachFiles//"+Username+"//"+NewMailDirName+"//"+attname;
c# 接发邮件2

c# 接发邮件2
att.SaveToFile(System.Web.HttpContext.Current.Server.MapPath(".")+mailPath);
c# 接发邮件2

c# 接发邮件2
//获取该封邮件在数据库的ID,以便和附件信息相对应,取邮件表中的最大ID即可
c# 接发邮件2
int mailID=this.GetMailID();
c# 接发邮件2
//将附件信息存入数据库
c# 接发邮件2
this.AttExtSend(mailID,attname,att.Size,mailPath,Msg.From);
c# 接发邮件2
}
c# 接发邮件2
catch(Exception ex)
c# 接发邮件2
c# 接发邮件2
c# 接发邮件2
{
c# 接发邮件2
throw new Exception(ex.Message);
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2
//删除服务器上的邮件
c# 接发邮件2
jpop.DeleteMessages();
c# 接发邮件2
//断开连接
c# 接发邮件2
jpop.Disconnect();
c# 接发邮件2
}
c# 接发邮件2

c# 接发邮件2
}
c# 接发邮件2
}
c# 接发邮件2

至于将邮件信息和附件信息如何存入数据库,就看你自己对表的设计了,我就不多说了,经过上面就可以完全将你POP服务器上的
邮件完全接收到你的本地了。

Similar Posts:

  • a标签 打电话 发邮件

    打电话<a href="tel:010-13220163333″>13220163333</a> 发邮件<a href="mailto:[email protected]">发送邮件给sb</a>

  • ios9.3上面使用苹果自带的发邮件类库,发送邮件到企业邮箱结果失败了

    我用这段代码在ios8上面能正常发送邮件到企业邮箱,但是到了ios9上面邮件就发送失败了,是不是用在ios9上面发邮件还需要什么设置丫 MFMailComposeViewController *mailPickerVc = [[MFMailComposeViewController alloc] init]; mailPickerVc.mailComposeDelegate = self; [mailPickerVc setSubject:PROJECT_NAME];//邮件主题 [mailPi

  • 关于不能往yahoo,sina等地址发邮件的问题

    该问题是由于反垃圾邮件软件引起的,已经和sina 确认过,他们最近部署了一套反垃圾邮件的系统在默认条件下,邮件服务器在发出helo命令与远端的邮件服务器通过25端口建立会话时还会送出自己的FQDN名字.目前流行的一些反垃圾邮件软件可能会通过邮件服务器送出的FQDN名字对其进行反向解析,对于反向解析失败的连接将断开该连接. 反向解析失败的原因如下: 在国内,很多管理员在做域名解析时没严格按要求做,认为通了就行.建议的做法是:对域名abc.com要做这些解析(根据需要增减) 1.主机A记录abc.c

  • jmail组件发邮件总是有乱码出现是什么原因?

    通过Jmail组件发邮件总是有乱码,PHP下有好的发邮件的组件么? --cut-- redhairboy在2011-07-27 13:24:30回答到: php下有mail函数 ,直接可以调用,用不着调用jmail

  • 打电话,发短信,发邮件,app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739"]; [[UIApplication sharedApplication] openURL:url]; } - (IBAction)callPhone2:(id)sender { NSURL *url = [NSURL URLWithString:@"telprompt://185004

  • Linux 命令行发邮件sendmail,mailutils,mutt msmtp

    本文环境:Ubuntu 14.04全新安装 [1.sendmail] 发邮件 [2.mailutils] 发邮件 [3.mutt msmtp] 发邮件 [1.sendmail] #sudo apt-get install sendmail 然后通过ps查看是否有sendmail进程,如果存在,则安装成功: #ps -ef|grep sendmail root 1282 1 0 13:39 ? 00:00:00 sendmail: MTA: accepting connections [email protected]

  • iOS 打电话 发邮件

    // 打电话 // 弊端:使用该方法进行拨号之后,当电话挂断之后不会返回应用程序, 会停留在通话记录界面 // NSURL *url = [NSURL URLWithString:@"tel://13261936021"]; // [[UIApplication sharedApplication] openURL:url]; // 在拨打电话之后会提示用户是否拨打, 当电话挂断之后会返回应用程序 if (_webView == nil) { _webView = [[UIWebVie

  • 支持发邮件的课程表应用

    本项目是一个关于课程表的项目源码,主界面只有一个我的课程界面,点击任意表格可以填写周一到周五的课程,每天最多8节.保存的时候邮箱会验证合法性,一开始的邮箱正则验证有问题我纠正了一下,另外发邮件界面弹不出输入法框来比较蛋疼,其余的功能还算正常,项目不大,比较简单,注释较多,项目编码GBK 默认编译版本2.3.3有需要的朋友可以下载研究一下. <ignore_js_op> 可以直接发邮件的简洁课程表项目源码运行截图 <ignore_js_op> 可以直接发邮件的简洁课程表项目源码运行截

  • ActiveMQ JMS 在发邮件中的使用

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位. 主要特点: 1. 多种语言和协议编写客户端.语言: Java, C, C++, C#, Ruby, Perl, Python, PHP.应用协议: OpenWire,Stomp REST,WS Notification,XMPP,A

  • 存储过程发邮件

    create or replace procedure ASCM_MATERIELCHANGESENDEMAIL IS pMailBodyCn clob;--VARCHAR2(32765); -- 用参数 pMailBodyEn clob;--VARCHAR2(32765); -- 用参数 pMailHead VARCHAR2(200); -- 用参数 V_MAILRESULT VARCHAR2(2000); -- 回值 系统根据 件发 回值 业务处理 LINKMAN VARCHAR2(100)

  • 转_用路由器上网不能发邮件附件的解决2

    最近不少用户反映发邮件不能上传附件,如果已经确定附件大小没有超过邮箱规定,可参考下文修改MTU值,可能可以解决问题 用户请求一个网页时,个人计算机与放置网页的Web服务器之间进行客户机/服务器协商,以确定一个最大的MTU尺寸.进行协商的个人计算机的默认MTU大小为1500个字节(Windows 3x, 9x, NT,ME等),所以Web服务器经协商确定的MTU大小为1500字节.因此,无论您的路由器MTU大小配置为多少,Web服务器所发送的数据包最大字节数仍为1500. 一些网页不能完全下载的原

Tags: