C# 如何实现发email

主要是用到了System.Web.Mail命名空间,用到了此空间的三个类,分别是:
●MailMessage类,用于构造电子邮件
●MailAttachment类,用于构造电子邮件附件
●SmtpMail类,用于发送电子邮件及其附件

1、MailMessage类构造电子邮件
此类主要有以下属性和方法
★From     发件人的地址
★To       以分号分隔的收件人的地址列表
★Cc       以分号隔开的抄送的收件人的邮件地址列表
★Subject  电子邮件的主题
★Body     电子邮件的正文
★BodyFormat 电子邮件的正文内容类型,由MailFormat枚举值指定,MailFormat.Text或MailFormat.Html
★Attachments 电子邮件附件集合
★Priority  电子邮件的优先级,由MailPriority枚举值指定,可以是MailPriority.Low ,MailPriority.Normal或MailPriority.High三者之一

Bodyencoding --  指定消息的编码方式编码(主要有Base64,UUencode)
其他几个不重要的省略。

顺便提到密送和抄送的区别:密送就是你群发邮件时收邮件的人无法看到你发给了多少人以及他们的邮件地址,抄送就是群发邮件时收邮件的人则可以看到你发给了多少人以及他们的邮件地址。


2、Attachment用来构造电子邮件附件.用此类构造了电子邮件附件然后添加到MailMessage对象的Attachments集合即可


3、使用SmtpMail类发送电子邮件,可以通过系统本身的SMTP邮件服务或者其它SMTP服务器来发送,发送电子邮件首先需要设置SmtpMail类的SmtpServer属性,然后使用Send方法发送就可以了
下面做个简单的邮件发送例子:
using System.Web.Mail;

MailMessage MyEmilMessage=new MailMessage();
string attachFile;        //用于构造附件的字符串变量

MyEmailMessage.From="Writer@sadf.com";
MyEmailMessage.To="Geter@dff.com;tome@asd.com";
MyEmailMessage.Subject="邮件发送的一个简单例子";
MyEmailMessage.body="猫王呼叫耗子,收到请回答!!!";
MyEmailMessage.BodyFormat=MailFormat.Text;
MyEmailMessage.Priority=MailPriority.High;

//构造添加附件
attachFile=@"D:\test\test.txt";
MailAttachment mailAttach=new MailAttachment(attachFile);
MyEmailMessage.Attachments.Add(mailAttach);

//发送电子邮件
SmtpMail.SmtpServer="发送电子邮件的SMTP地址或者IP";// 指定smtp服务器
SmtpMail.Send(MyEmailMessage);//发送电子邮件

================================================

 说到发送邮件发送,先提一下SMTP(呵呵,高手就跳过这一段吧!)。 SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。(引用1)

 
SmtpMail类的Send方法,它的目的就是发送邮件,有两个重载方法。
1.   SmtpMail.Send("发送邮件的地址","接受邮件的地址","邮件的标题","邮件消息的内容")

    这个方法很简单,不适合发送带附件的邮件。

2.   SmtpMail.Send(MailMessage)

    此方法复杂、灵活,适合发送附件,而且可以设置MailMessage对象的各种属性值。

    如果我们用ASP.NET写一个邮件发送的程序,那么首先应该如何得到SMTP。有两种方法:第一种方法调用目前知名的邮件服务提供商的SMTP,比如新浪、搜狐、网易的免费电子邮箱的SMTP;第二种方法是自己装一个SMTP虚拟服务器,这个在安装IIS时一起装上去的(安装过程就省略了:-) )。

一、在ASP.NET利用知名的邮件服务提供商的SMTP来发送邮件
    首先需要去他们的邮件站点上注册免费邮箱,因为你要使用邮件服务提供商的SMTP,他们需要对身份进行验证,这样可以避免产生大量的垃圾邮件。假设我们在新浪的邮件站点(mail.sina.com.cn)上注册了一个免费电子邮件,用户名是mysina,密码是chenjie.该帐号为虚构的,请使用自己注册的用户名称和密码代替。我们在新浪的邮件站点获知它的SMTP地址是:smtp.sina.com.cn。我们需要向scucj@126.com(我的邮箱地址)发送邮件。

    那么利用ASP.NET(C#)发送邮件的核心代码如下:

//核心代码开始
using System.Web.Mail;

MailMessage objMailMessage;
MailAttachment objMailAttachment;

// 创建一个附件对象
objMailAttachment = new MailAttachment( "d:\\test.txt" );//发送邮件的附件
// 创建邮件消息
objMailMessage = new MailMessage();
objMailMessage.From = "mysina@sina.com";//源邮件地址
objMailMessage.To = "scucj@126.com";//目的邮件地址,也就是发给我哈
objMailMessage.Subject = "邮件发送标题:你好";//发送邮件的标题
objMailMessage.Body = "邮件发送标内容:测试一下是否发送成功!";//发送邮件的内容
objMailMessage.Attachments.Add( objMailAttachment );//将附件附加到邮件消息对象中

//接着利用sina的SMTP来发送邮件,需要使用Microsoft .NET Framework SDK v1.1和它以上的版本

//基本权限
objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
//用户名
   objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "mysina") ;
//密码
   objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "chenjie");

//如果没有上述三行代码,则出现如下错误提示:服务器拒绝了一个或多个收件人地址。服务器响应为: 554 : Client host rejected: Access denied

//SMTP地址
SmtpMail.SmtpServer = "smtp.sina.com.cn";

//开始发送邮件
SmtpMail.Send( objMailMessage );

//核心代码结束

二、在ASP.NET利用本机的SMTP虚拟服务器的SMTP来发送邮件

首先说一下SMTP配置。

(1)右键点击“SMTP虚拟服务器”选择“属性”->在“常规”选项卡中设置“IP地址(P)”,我设置的是192.168.1.100。

(2)选择“访问”选项卡,点击“中继”,选上“仅以下列表”(默认是被选上的),点击“添加”,在“单台计算机”中加入192.168.1.100。

提示,如果没有完成(2),则会出现大家常见的一种错误提示:服务器拒绝了一个或多个收件人地址。服务器响应为: 550 5.7.1 Unable to relay for scucj@126.com

(友情提示一下:错误中的邮件地址有所不同)

然后开始核心代码,其实和方法(一)的差不多。与(一)的主要区别在于:1.SMTP的不同,
2.objMailMessage.From中本方法可以随便填写,但是(一)中别随便填写那么利用ASP.NET(C#)发送邮件的核心代码如下:

//核心代码开始
using System.Web.Mail;

MailMessage objMailMessage;
MailAttachment objMailAttachment;

// 创建一个附件对象
objMailAttachment = new MailAttachment( "d:\\test.txt" );//发送邮件的附件
// 创建邮件消息
objMailMessage = new MailMessage();
objMailMessage.From = "mysina@sina.com";//源邮件地址
objMailMessage.To = "scucj@126.com";//目的邮件地址,也就是发给我哈
objMailMessage.Subject = "邮件发送标题:你好";//发送邮件的标题
objMailMessage.Body = "邮件发送标内容:测试一下是否发送成功!";//发送邮件的内容
objMailMessage.Attachments.Add( objMailAttachment );//将附件附加到邮件消息对象中

//SMTP地址
SmtpMail.SmtpServer = "192.168.1.100";

//开始发送邮件
SmtpMail.Send( objMailMessage );

   以上两种方法介绍到这里。最简单的利用上面方法是在页面添加一个服务器按钮,把除引用的语句放到按钮单击事件中去。当然,别忘记了引用的语句放在最上面。
  

    方法一的测试是完全正确,没有任何问题,但是方法二却导致邮件无法正确收到(***@sina.com),或者收到后也被放到垃圾邮件中去了(发往scucj@126.com)。
  

    希望和大家讨论一下如何改进方法二。

=======================================

首先别忘了导入命名空间
using System.Web.Mail;
using System.Text.RegularExpressions;//提供Regex类

        //邮件发送
        protected void btnTrans_Click(object sender, EventArgs e)
        {
            MailMessage myMail = new MailMessage();
            myMail.To = this.txtDirection.Text;       //收件人邮件地址
            myMail.From = this.txtAddresser.Text;      //发件人邮件地址
            myMail.Subject = this.txtTitle.Text;      //邮件主题
            myMail.Body = this.txtBody.Text;      //邮件内容
            myMail.BodyFormat = MailFormat.Html;      //邮件格式
            myMail.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");      //设置邮件编码类型

            string[] attachs = Regex.Split(this.lbl_showAttach.Text, ";");
            for (int i = 0; i <attachs.Length-1; i++)
            {
                //建立附件对象实例,保存在服务器上
                MailAttachment ma = new MailAttachment(Server.MapPath("upAttach\\") + attachs[i]);
                //添加附件
                myMail.Attachments.Add(ma);
            }
            //需要验证的服务器1 改为 0 后出错(smtp.163.com)
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
            //验证方式:Anonymous=0,Basic=1,NTLM=2
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", this.txtEName.Text.Trim());
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", this.txtEPwd.Text.Trim());
        
            //这里=""表示服务器是本机,你也可以设置ip
           SmtpMail.SmtpServer = this.ddlServer.SelectedValue.ToString();
           
//SmtpMail.SmtpServer = "smtp.163.com";
            SmtpMail.Send(myMail);
            this.show_Meg.Visible = true;
            this.show_Meg.InnerHtml = "您的邮件已经发送成功!";
        }

        //添加附件,可以上传多个文件
        protected void ibtnAdd_Click(object sender, ImageClickEventArgs e)
        {
            //获得上传文件的完全名称
            string fullFilename = this.upAttach.PostedFile.FileName;
            //获得上传文件的文件名+1表示匹配到最后一个字符
            string fileName = fullFilename.Substring(fullFilename.LastIndexOf("\\") + 1);

            g_fileName = fileName;

            this.upAttach.SaveAs(Server.MapPath("upAttach\\") + fileName);
            this.lbl_showAttach.Text += fileName + ";";
        }

界面截图!



           刚开始(不是最终版本),也和很多人一样,看似点击提交后看到了'您的邮件已经发送成功',以为邮件发送成功了,于是在自己的邮箱里查看有没有刚才所发的邮件,当然了,始终没能看到那邮件,原因有两点:
           1、当时不知道有的邮箱支持匿名发送邮件;
           2、你所发送邮件的功能只能通过中转服务器来发送邮件,并不是你的服务器来发送;
           知道了这些,才明白了,如果你要发送邮件,那么你只能登入到自己的邮箱然后在发送邮件,所以添加了下列三行代码(服务器验证)
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", this.txtEName.Text.Trim());
            myMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", this.txtEPwd.Text.Trim());
*:第一行,'1'表示要通过验证,就是发件人必须提供登入邮箱的用户名和密码;
        之前采用匿名的用户发送,没有成功。(主要是大多数服务器不支持)
*:还有值得注意的一点就是图片上面有服务器选择列表,这个主要是对应你自己,也就是发送者邮件地址。
*:    如果选择了163的SMTP服务器,“smtp.163.com”,发件人必须是登录用户的163 email用户地址。
      下拉式列表中:   smtp.163.com
                              smtp.sina.com.cn
原文地址:https://www.cnblogs.com/losesea/p/2506072.html