SMTP(Simple Mail Transport Protocol)简单邮件传输协议。在.NET Frameword类库中提供SmtpClient类(System.Net.Mail),她提供了一个轻型方法来发送SMTP电子邮件信息。SmtpClient类中的Bcc属性是用来指定此电子邮件抄送的收件人的集合,这就意味着可以为每个邮件制定多个收件地址。Attachmenty属性也是一个集合,可以使用它为邮件添加多个附件。 发送邮件中用的其他类主要还有:
1. Attachment类,表示文件附件,它允许将文本、流、文件附加到电子邮件中。
2. MailAddress类,表示邮件地址。
3. MailMessage类,表示电子邮件。
string host = "smtp.163.com";// 邮件服务器smtp.163.com表示网易邮箱服务器
string userName = "15764226619@163.com"; //发送端账号
string password = "password"; //发送端密码(这个客户端重置后的密码)
SmtpClient mailClient = new SmtpClient(host);
//SmtpClient mailClient = new SmtpClient(host, 25);
//mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
//Credentials登陆SMTP服务器的身份验证.
//mailClient.EnableSsl = false; //不启用ssl加密
mailClient.UseDefaultCredentials = true;
mailClient.Credentials = new NetworkCredential(userName, password);
//test@qq.com发件人地址、test@tom.com收件人地址
MailMessage message = new MailMessage(new MailAddress("test@qq.com"),new MailAddress("test@tom.com"));
//MailMessage message = new System.Net.Mail.MailMessage(); //另外一种方式创建发信连接,可以支持多人收信
//message.From = new MailAddress(userName, "账户名"); //发信邮件账户
//message.From = new MailAddress(userName, "账户名", System.Text.Encoding.UTF8); //发信邮件账户,3个参数分别是发件人邮箱,发件人姓名,编码
//message.To.Add(new MailAddress("11@qq.com")); //收信主送邮件账户,可接受多个邮件地址,用逗号分隔即可,或者反复增加本行也可以接收多个收信人
//message.To.Add(new MailAddress("11@qq.com", "账户名")); //收信主送邮件账户,含账户名
//message.CC.Add(new MailAddress("21@qq.com")); //收信抄送邮件账户,可接受多个邮件地址,用逗号分隔即可,或者反复增加本行也可以接收多个收信人
//message.Bcc.Add(new MailAddress("tst@qq.com")); //可以添加多个收件人,用逗号分隔即可
//message.IsBodyHtml = true;
//message.SubjectEncoding = System.Text.Encoding.UTF8; //邮件主题编码,采用UTF8格式
//message.BodyEncoding = System.Text.Encoding.UTF8;
//message.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312"); //邮件内容编码,采用GB2312格式
//message.Priority = System.Net.Mail.MailPriority.High;
message.Body = "Hello Word! 邮件发送测试"; //邮件内容
message.Subject = "this is a test"; //邮件主题
//Attachment 附件
Attachment att = new Attachment(@"C:/hello.txt");
message.Attachments.Add(att); //添加附件
//Attachment att1 = new Attachment(@"C:/welcome.txt");
//message.Attachments.Add(att1); //继续添加附件
Console.WriteLine("Start Send Mail....");
//发送....
mailClient.Send(message);
Console.WriteLine("Send Mail Successed");
Console.ReadLine();
注意上面的发件人地址和发信人账号要一致,否则通不过验证。OK,这样就可以成功发送邮件了。
该文章在 2017/11/8 11:42:01 编辑过
| |
全部评论4 |
|
admin
2017年11月7日 22:37
//C#多个邮件地址是否合法、重复、以及字符串首尾去逗号代码及其他处理string addresses = ;
AddressList = AddressList.Replace(,, ,).Replace(;, ,).Replace(;, ,).Trim();string[] strArray = AddressList.Split(new char[] );
int length = strArray.Length;
for (int i = 0; i < length; i++)
}
if (addresses.EndsWith(,))
if (addresses.StartsWith(,))
mailMessage.To.Add(addresses);
该评论在 2017/11/7 22:37:55 编辑过
|
|
admin
2017年11月7日 22:44
我今天测试了一下,不管是什么免费邮箱的smtp,一般每天都会有邮件发送数量的上限,163一般为50封,qq一般为100f封,超过了这个上限当天就不允许再发送邮件了。QQ邮箱不是你想进就进的。这种东西不是头脑一热就能成的,期望的与实际相差很远。做什么项目都应该先考虑好,不要盲目的弄。
1.QQ邮箱那边有内容检测,广告、链接、图片尽量少带;
2.IP频繁问题,163会以你自己真实的IP进行发送(猜测,如果是服务器代发,那就和发件人有关);
3.发件人频繁问题(发多了拉黑);
4.域名黑名单,ip黑名单(发多了拉黑,举报核实拉黑);
5.被举报可能被系统拦截(可以点击我的信息->收信查询->查看收件状态);
6.个别短号的QQ邮箱是发不进的,切记。短号的拦截方式和长号的有些区别,如:666222与789456123的拦截方式不同。
其他可以尝试的方法:不借助第三方SMTP服务器,在本机安装SMTP服务器,比如免费的Free SMTP Server。装完之后无需任何设置,启动SMTP服务器,再运行上面的程序,一切正常。但是如果使用本地的SMTP服务器(比如本机IIS的SMTP服务器)发送邮件,会被许多大型网站的邮箱当做垃圾邮件来处理,原因是本地SMTP服务器的地址并不为人所知,发送的邮件理所当然会被当做来历不明的邮件,所以一般要借助一些大型知名网站的SMTP服务器来为我们发送邮件。
该评论在 2017/11/7 23:33:42 编辑过
|
|
admin
2017年11月7日 22:58
//异步执行,带回调效果演示SmtpClientsmtp=newSmtpClient();smtp.Host=mailServer.Host;smtp.Port=25;smtp.EnableSsl=false;smtp.UseDefaultCredentials=false;smtp.DeliveryMethod=SmtpDeliveryMethod.Network;smtp.Credentials=newNetworkCredential(mailServer.Email,mailServer.Pwd);smtp.EnableSsl=true;smtp.SendCompleted+=newSendCompletedEventHandler(smtp_SendCompleted);MailAddressfrom=newMailAddress(mailServer.Email,小王);MailAddressto=newMailAddress(toMail,toMail.Substring(0,toMail.IndexOf(@)));MailMessagemail=newMailMessage(from,to);mail.DeliveryNotificationOptions=DeliveryNotificationOptions.OnFailure;mail.IsBodyHtml=true;mail.Priority=MailPriority.High;mail.ReplyTo=from;mail.Sender=from;mail.Subject=title;mail.Body=content;mail.BodyEncoding=Encoding.Default;smtp.SendAsync(mail,toMail);下面是SendAsync函数的回调函数:voidsmtp_SendCompleted(objectsender,AsyncCompletedEventArgse)elseif(lvMailTo.InvokeRequired)smtp.Dispose();_event.Set();}
该评论在 2017/11/7 23:52:14 编辑过
|
|
admin
2017年11月7日 23:9
使用C#和.Net通过SMTP发送邮件详解
到目前为止,发电子邮件已经不是什么新闻了,.Net中包含邮件客户端并不足为奇。一个老的编程事实任然有效:所有程序将扩大到包括最终发送(接收)的电子邮件。因此,如何增加电子邮件到您的程序?此帖探讨我们如何能够使用System.Mail.SmtpClient发送格式化电子邮件。有许多可供选择的选项,我们将探讨其中的大多数。十五年以后事情变得相当容易.发送电子邮件最直接的就是调用一些基本的库函数和.Net的一些固定的实现。快速发送电子邮件
如果您迫不及待的话,可以使用下面带有4字符串参数的
构造函数创建一个简单的邮件。
// public client.Send(string from,string to,string subject,string body)
using System.Net.Mail;
SmtpClient client = new SmtpClient();
client.Send(martijn@seamana.cn,test@seamana.cn,Testing!,Ifthis break again,.. I won''t know what to do);
在上面的例子中的电子邮件使用系统的NET框架默认设置为发现的发送的。如果你对什么自己系统作为默认的SMTP服务器感到好奇,您可以查询SmtpClient.Host
Console.WriteLine(Default SMTP Server: ,client.Host);
请注意,有可能.NET libraries是无法制订SMTP主机,当您尝试发送电子邮件会失败并出现System.InvalidOperationException ( SMTP主机未指定)的异常。
发送一封合适的邮件
一个基本的电子邮箱是一个发件人,一个或多个收件人的邮件正文和一个或多个附件组成的。当然,电子邮件可能是一种过时的俄罗斯字体的编码。
MailAddress toUser = new MailAddress(martijn@seamana.cn);
MailAddress toUser2 = new MailAddress(martijn@seamana.cn,MartijnDijksterhuis);
MailAddress toUser3 = new MailAddress(martijn@seamana.cn,MartijnDijksterhuis, System.Text.Encoding.UTF8);
名字中不包括任何特殊的字符,所以指定默认的UTF - 8编码。
发送一封只有单一的发送和接收者的电子邮件
如果您的电子邮件只包含一个单一的发送者和一个接收者,MailMessage ( MailAddress From, MailAddress To)构造函数提供了所有您所需要的。它创建一个新的电子邮件的结构,分配发送者和接收者的构造方法。
MailAddress toUser = new MailAddress(myfriend@yahoo.com);
MailAddress fromUser = new MailAddress(aishijie36@hotmail.com);
MailMessage msg= new MailMessage(fromUser,toUser);
增加更多相同的电子邮件的接收者
一个单一的收件人可能是不够的。不要担心,您可以添加许多人到你的电子邮件,只要你想。
msg.To.Add( new MailAddress(second_to@seamana.cn) );
msg.CC.Add( new MailAddress(first_cc@seamana.cn) );
msg.CC.Add( new MailAddress(second_cc@seamana.cn) );
msg.Bcc.Add( new MailAddress(first_bcc@seamana.cn) );
设置电子邮件主题和内容
设置电子邮件的主题,并不难,只需通过Msg.Subject设置它 。如果你可以使用如Unicode的其他方式编码。
msg.Subject = 我的心太乱
msg.SubjectEncoding = Encoding.GetEncoding(big5);
以非常类似的方式来设置邮件正文
msg.Body = Dear Customer, + Environment.NewLine + Environment.NewLine;
msg.Body += Because of repeated violations of our terms and conditions we had no choice but to;
msg.Body += terminate your account with us. + Environment.NewLine + Environment.NewLine;
msg.Body += The Management;
msg.BodyEncoding = System.Text.Encoding.UTF8;
添加附件到电子邮件
电子邮件可以拥有一个以上的附件,每个附件的继承于System.Net.Mail.Attachment类。您可以通过调用 Attachments.Add ( ) 把它们添加到附件容器。
using System.Net.Mime;
Attachment firstAttachment = new Attachment(document.doc,MediaTypeNames.Application.Octet);
MailMessage msg= new MailMessage(fromUser,toUser);
msg.Attachments.Add(firstAttachement);
第一个参数传递给构造函数是包含附件的路径。如果没有完整的路径,给出了当前的工作目录。该文件类型的在System.Net.Mime中定义 -可用选项有:
MediaTypeNamesApplicationOctet
PDF
RTF
Soap
Zip
ImageGif
JPEG
Tiff
TextHTML
Plain
RichText
XML
如果该类型的文件未指定使用MediaTypesNames.Application.Octet ,怎显示数据没有解释。
添加自定义电子邮件标题到您的电子邮箱
Msg.Header属性允许查询和添加.NET框架所设定的电子邮件标题。全新的电子邮件将只包含一个标题: Mine: 1.0 。
MailMessage Msg = new MailMessage(newMailAddress(martijn@seamana.cn),newMailAddress(martijn@seamana.cn));
// Add a custom header to the e-mail
Msg.Headers.Add(X-Header,2.0);
// Display all the message headers.
string[] Keys = Msg.Headers.AllKeys;
foreach (string s in Keys)
Console.WriteLine(: , s,Msg.Headers[s]);
用SmtpClient发送电子邮件
通过the SmtpClient class发送电子邮件的艰巨工作实际只需要下面两行代码:
SmtpClient client = new SmtpClient();
client.Send(Msg);
SmtpFailedRecipientsException: The message could not be delivered to one or more of the recipients in To, CC, or Bcc.
SmtpException : Connection failed, authentication failed or a time-out
ArgumentNullException / ArgumentOutOfRangeException / InvalidOperationException : Something wrong with the input fields of the e-mail
如果您没有指定任何参数,SmtpClient默认构造函数将查找使用.NET环境。
SMTP服务器
您可以通过第二构造方法指定一个特定的服务器和可选端口
SmtpClient client = new SmtpClient(mail.dijksterhuis.org,3000);
上述SmtpClient.Send是阻塞调用-当电子邮件传送时您的应用程序应停止。当然也有一个异步调用: SmtpClient.SendAsync。
使用SmtpClient.SendAsync是多做一点工作。如何做到这一点请看以下示例:
using System;using System.Net.Mail;using System.Threading;using System.ComponentModel;namespace SnmpMailer] Send canceled., token);// Did an error occur during the send?if (arg.Error != null)Console.WriteLine([] , token, arg.Error.ToString());elseConsole.WriteLine(Message sent succesfully!);// Release the main threadmailSendSemaphore.Release();}public static void Main(string[] args),Deliverator.Host);// Specify the call back functionDeliverator.SendCompleted += new SendCompletedEventHandler(MailSendCallback);// For an asyncronous call we can pass a token to help us determine//the message being sendDeliverator.SendAsync(Msg,Msg ID 1212);// Because we have little else to do, we set a semaphore and waitmailSendSemaphore.WaitOne();Console.WriteLine(Mail delivery finished);}}}
该评论在 2017/11/8 0:02:31 编辑过
|