LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

全面介绍C#实现简单的SmtpClient及SSL发送带附件邮件---Good!

admin
2017年11月7日 21:12 本文热度 7455

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 (((strArray[i].Contains("@") && strArray[i].Contains(".")) && !addresses.ToLower().Contains((strArray[i] + ",").ToLower())) && (strArray[i].Trim
().ToLower().IndexOf(str.Trim().ToLower()) > 0))
    {
        addresses = addresses + strArray[i] + ",";
    }
}
if (addresses.EndsWith(","))
{
    addresses = addresses.Substring(0, addresses.Length - 1);
}
if (addresses.StartsWith(","))
{
    addresses = addresses.Substring(1, addresses.Length - 1);
}
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
//异步执行,带回调效果演示
SmtpClient smtp = new SmtpClient();
smtp.Host = mailServer.Host;
smtp.Port = 25;
smtp.EnableSsl = false;
smtp.UseDefaultCredentials = false;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(mailServer.Email,mailServer.Pwd);
smtp.EnableSsl = true;
smtp.SendCompleted += new SendCompletedEventHandler(smtp_SendCompleted);
MailAddress from = new MailAddress(mailServer.Email,"小王");
MailAddress to = new MailAddress(toMail,toMail.Substring(0,toMail.IndexOf("@")));
MailMessage mail = new MailMessage(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函数的回调函数:
void smtp_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            string msg = e.UserState.ToString();
            SmtpClient smtp = (SmtpClient)sender;
            if (e.Error == null)//问题出现后,这里的Error并没有错误
            {
                msg+= ",1";//发送成功
            }
            else
            {
                msg += ",0";
                smtp.SendAsyncCancel();
            }
            if (lvMailTo.InvokeRequired)
            {
                lvMailTo.BeginInvoke(new UpdateListDelegate(UpdateList), msg);
            }
            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!","If this break again,.. I won''t know what to do");
在上面的例子中的电子邮件使用系统的NET框架默认设置为发现的发送的。如果你对什么自己系统作为默认的SMTP服务器感到好奇,您可以查询SmtpClient.Host
Console.WriteLine("Default SMTP Server: {0}",client.Host);
请注意,有可能.NET libraries是无法制订SMTP主机,当您尝试发送电子邮件会失败并出现System.InvalidOperationException ( SMTP主机未指定)的异常。

发送一封合适的邮件
一个基本的电子邮箱是一个发件人,一个或多个收件人的邮件正文和一个或多个附件组成的。当然,电子邮件可能是一种过时的俄罗斯字体的编码
MailAddress toUser = new MailAddress("
martijn@seamana.cn");
MailAddress toUser2 = new MailAddress("
martijn@seamana.cn","Martijn Dijksterhuis");
MailAddress toUser3 = new MailAddress("
martijn@seamana.cn","Martijn Dijksterhuis", 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(new  MailAddress("
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("{0}: {1}", 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

  

  class MainClass   

        

   static Semaphore mailSendSemaphore;        

   private static void MailSendCallback(object sender, AsyncCompletedEventArgs arg)  

             

      // Get our unique token for this asynchronous operation.           

     String token = (string) arg.UserState;            

      // Did the user abort the sent ?           

     if (arg.Cancelled)               

        Console.WriteLine("[{0}] Send canceled.", token);         

      // Did an error occur during the send?           

     if (arg.Error != null)                

        Console.WriteLine("[{0}] {1}", token, arg.Error.ToString());              

      else               

        Console.WriteLine("Message sent succesfully!");            

      // Release the main thread           

      mailSendSemaphore.Release();       

            

 

  public static void Main(string[] args)       

            

   mailSendSemaphore = new Semaphore(0,1);   

   // Create the mail message with to &amp;amp;amp;amp;amp;amp;amp;amp; from   

    MailMessage Msg = new MailMessage(new MailAddress("noreply@dijksterhuis.org"), 

                    new MailAddress("martijn@dijksterhuis.org"));            

    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;   

    // Set the subject           

    Msg.Subject = "Termination of service notice"; 

    // Add our own header           

    Msg.Headers.Add("X-Deliverator","Terminator");    

    // Deliver the message in an asynchronous fashion           

    SmtpClient Deliverator = new SmtpClient("mymailserver.com");   

    // Print the default client           

    Console.WriteLine("Default SMTP Server: {0}",Deliverator.Host);  

    // Specify the call back function           

    Deliverator.SendCompleted += new SendCompletedEventHandle(MailSendCallback); 

    // For an asyncronous call we can pass a token to help us determine

    //  the message being send  

    Deliverator.SendAsync(Msg,"Msg ID 1212");   

    // Because we have little else to do, we set a semaphore and wait               

    mailSendSemaphore.WaitOne();            

    Console.WriteLine("Mail delivery finished");       

      

  }

}


该评论在 2017/11/8 0:02:31 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved