.NET自带的邮件发送利用了System.Web.Mail.MailMessage这个类,这是在VS2003的情况下,在VS2005下更多的是利用System.Net.Mail.MailMessage,下面的例子是在VS2003的情况下写的,请在应用的时候自己替换掉里面的参数。

public void SendMails()
...{
    string SendTos=SendTo.Text.Trim();  //发送人
    string CcTos=CcTo.Text.Trim();      //抄送人
    string[] Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");  //总收件人
    string FromMail="mailto:ustbwuyi1@163.com%22;//发件人
    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%22,1);
    mailmessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername%22,MailUserName);
    mailmessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword%22,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发送邮件的代码。

public void SendMails()
...{
    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="mailto:ustbwuyi1@163.com%22;//发件人
    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自带的发送邮件和利用jmail组件来发送邮件。...相关推荐

  1. 解读劳动合同法:仅两种情况辞职要交违约金

    http://www.sina.com.cn 2007年08月24日15:20 北京晚报 本报讯(记者 李莉) 明年1月1日起,<劳动合同法>将开始实施.<劳动合同法>将弥补1 ...

  2. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  3. bartender外部表不是预期格式_批量合并Excel数据时“外部表不是预期格式”或“文件包含损坏数据”的两种情况...

    很多朋友在用Power Query合并(汇总)Excel数据时,碰到过"DataFormat.Error:外部表不是预期格式"或"DataFormat.Error:文件包 ...

  4. 【数字信号处理】周期延拓 ( 周期延拓的两种情况 | L ≥ N | L ≤ N )

    文章目录 一.周期延拓 二.周期延拓分两种情况 一.周期延拓 非周期的信号 通过 周期延拓 可以变为 周期信号 ; 周期延拓 : 非周期序列 构成 周期序列 的过程 ; 非周期序列 x(n)[0,N− ...

  5. 在origin 2018中同时画两个图,带errorbar和不带errorbar两种情况

    在origin 2018中同时画两个图,带errorbar和不带errorbar两种情况 在一个图层里同时画两幅图 两幅图坐标可不一致 ①在当前图层中,选中图层左上角的 1 标志 ②右键 1 →图层内 ...

  6. delete不调用析构函数的两种情况

    1. 所使用的类为预定义类 下面这段函数代码编译运行时没有问题的,不需要CPtr的定义 ---PtrUser.h class CPtr; // 预定义 class CPtrUser { public: ...

  7. Verilog HDL中容易生成锁存器的两种情况

    在Verilog HDL的程序设计中,有两种情况会生成锁存器. 第一种情况 在always块中使用if语句,但是没有else,这会导致当条件不成立时,没有其他语句可执行,使得被赋值的寄存器一直保持不变 ...

  8. 修改db2管理服务器,创建DB2管理服务器的两种情况

    DB2管理服务器在创建时分为创建一个和创建多个两种情况,下面就为您详细介绍这两种创建DB2管理服务器的情况,供您参考学习. 一.创建DB2管理服务器(只能创建一个) 1.首先创建管理服务组用户(可不建 ...

  9. MySQL笔记-解决...mysql.sock (13)(两种情况会产生此问题)

    遇到这个mysql.sock(13)一般是两种情况. 一个是mysql.sock权限不够,最少要个775权限: chmod -R 775 /var/lib/mysql/ 如果嫌烦的话赋予777就可以了 ...

最新文章

  1. 微服务落地,我们在考虑什么?
  2. linux安装java_linux中替换系统自带的OpenJDK
  3. css实现元素水平垂直居中
  4. onchange事件与onpropertychange事件的区别
  5. 请教怎么查询ORACLE的历史操作记录!
  6. c语言累积乘,C语言编程累积2
  7. 微软Windows系统命令和Sysinternals系列工具
  8. Java毕设项目直播购物平台计算机(附源码+系统+数据库+LW)
  9. mybatis之choose标签
  10. 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
  11. hi-3531a:minigui3.2.0移植
  12. 关于STL中vector容器的一些总结
  13. java 线程与线程池详解
  14. webpack之css/js/html文件的压缩
  15. JFFS2文件系统挂载过程(5)
  16. 8000 sentences of oral English(four)
  17. Quantopian 入门系列一
  18. 用dRING设置特定日期提醒
  19. 优秀免费资源300+
  20. 自适应设计:创建流畅的YouTube和Vimeo内容

热门文章

  1. 图论 —— 生成树 —— 曼哈顿距离最小生成树
  2. 图论 —— 环与块 —— 连通块的计数
  3. 天堂里的游戏(51Nod-1417)
  4. 乒乓球(洛谷-P1042)
  5. 信息学奥赛C++语言:换座位
  6. python flask restful api_python之restful api(flask)获取数据
  7. linux内核启动过程2:保护模式执行流程
  8. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(2)
  9. python使用全局变量的坑,要使用global
  10. NativeScaler()与loss_scaler