使用.net 内置的SmtpClient来实现邮件的发送

  前言  

  发送邮件的方式有很多种,比如通过.net框架内置的SmtpClient来实现邮件发送,使用开源项目LumiSoft.Net等,这里就讲一下如何使用System.Net.Mail命名空间下的SmtpClient来发送邮件。

  一、邮件发送过程

  例如A使用163邮箱发送邮件给B(qq邮箱)。首先A会把邮件通过SMTP(Simple Mail Transfer Protocol)协议传输到163的Smtp服务器上,163的Smtp服务器会根据B的邮箱账号,把邮件通过Smtp协议发给QQ邮箱的Smtp服务器。QQ的Smtp服务器接收到邮件消息后会将之存储在QQ邮箱的邮件存储设备上。当B登陆QQ邮箱后,如果有新邮件,POP3服务器就会从QQ邮箱的邮件存储设备上读出邮件并通过POP3/IMAP服务发送给邮件客户端的B。

  原理图

  

  二、前置工作

  1.准备两个测试用的邮箱(这里使用qq邮箱)

  2.为邮箱开启POP3/SMTP服务 和 IMAP / SMTP服务(qq邮箱 需要在设置->账户下开启)

  

 三、开始coding

  1.创建MailMessage对象来编辑邮件正文,并指明发送者和接收者

  2.创建SmtpClient对象来发送邮件,需要指明邮件发送者的的账号和密码(qq邮箱要使用授权码)

  3.示例代码

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Net;
 5 using System.Net.Mail;
 6 using System.Security;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9
10 namespace MailTest
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             string fromMail = "[email protected]";
17             string toMail = "[email protected]com";
18             MailMessage mailMessage = new MailMessage
19             {
20                 //发件人
21                 From = new MailAddress(fromMail)
22             };
23
24             //收件人 可以添加多个收件人
25             mailMessage.To.Add(new MailAddress(toMail));
26
27             //mailMessage.CC 获取包含此电子邮件的抄送(CC)收件人的地址集合
28             //邮件主题
29             mailMessage.SubjectEncoding=Encoding.UTF8;
30             mailMessage.Subject = "Hello";
31
32             //邮件正文
33             mailMessage.BodyEncoding = Encoding.UTF8;
34             mailMessage.Body = "<p style=‘color:red;font-size:14px;‘>邮件测试</p>";
35
36             //如果要发送html格式的消息,需要设置这个属性
37             mailMessage.IsBodyHtml = true;
38
39             //邮件内容即消息正文中中显示图片
40             //需要为图片指明src=‘cid:idname(资源id)‘
41             AlternateView htmlBody = AlternateView.CreateAlternateViewFromString("<img src=‘cid:zfp‘/>", null, "text/html");
42
43             //然后在LinkedResource加入文件的绝对地址,和ContentType 例如image/gif,text/html...与http请求的响应报文中的ContentType一致
44             LinkedResource lr = new LinkedResource("1.gif","image/gif");
45
46             //绑定上文中指定的idname
47             lr.ContentId = "zfp";
48
49             //添加链接资源
50             htmlBody.LinkedResources.Add(lr);
51
52             mailMessage.AlternateViews.Add(htmlBody);
53
54             //发送附件 指明附件的绝对地址
55             Attachment attachment = new Attachment("1.txt");
56             mailMessage.Attachments.Add(attachment);
57
58
59             //创建邮件发送客户端
60             try
61             {
62                 //这里使用qq邮箱 需要在设置->账户下开启POP3/SMTP服务 和 IMAP / SMTP服务
63                 //qq邮箱的发件服务器smtp.qq.com  端口25
64                 SmtpClient sendClient = new SmtpClient("smtp.qq.com", 25)
65                 {
66                     //指定邮箱账号和密码
67                     //在第三方客户端登陆qq邮箱时,密码是授权码
68                     //登陆qq邮箱在设置->账户下可以生成授权码
69                     Credentials = new NetworkCredential(fromMail, "xmxyldrmtvnrddfe")
70                 };
71
72                 //指定如何发送电子邮件
73                 sendClient.DeliveryMethod = SmtpDeliveryMethod.Network;
74
75                 //指定使用使用安全套接字ssl加密的链接
76
77                 sendClient.EnableSsl = true;
78                 sendClient.Send(mailMessage);
79             }
80             catch
81             {
82                 throw;
83             }
84
85
86             Console.WriteLine("ok!");
87             Console.ReadKey();
88
89         }
90     }
91 }

  四、可能出现的异常

  1.System.Net.Mail.SmtpException:“操作已超时。”

  这个异常可能是邮件服务器的ip与端口出错

  2.System.Net.Mail.SmtpException:“参数或变量中有语法错误。服务器响应为:mail from address must be same as authorization user”

  这个异常一般是邮件发送者的账号与密码设置错误,这里再次提示一下,qq邮箱的密码需要使用授权码

 

时间: 2024-08-06 16:04:29

使用.net 内置的SmtpClient来实现邮件的发送的相关文章

C#发送内置图片的html格式邮件的代码

将写内容过程经常用的内容段备份一次,下面的内容是关于C#发送内置图片的html格式邮件的内容,应该对码农们也有用处.MailMessage m = new MailMessage();m.Subject = "html email with embedded image coming!"; string htmlBody = "<html><body><h1>Picture</h1><br><img src=&

内置函数

内置函数思维导图: 惊喜不断哟~~~~~~~

Nginx内置变量以及日志格式变量参数详解

Nginx内置变量以及日志格式变量参数详解 $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为空字符串 $uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html". $d

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

maven内置属性

Maven共有6类属性: 内置属性(Maven预定义,用户可以直接使用) ${basedir}表示项目根目录,即包含pom.xml文件的目录; ${version}表示项目版本; ${project.basedir}同${basedir}; ${project.baseUri}表示项目文件地址; ${maven.build.timestamp}表示项目构件开始时间; ${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,

maven的两种可运行jar打包方式。1、内置依赖,2、外部依赖。

maven打可运行jar包的两种方式 maven常用的普通打包方式分为pom,jar,war等,至于这些打包类型就不介绍啦. 如果不进行特殊配置,那么打包出来的jar包是不可运行的.只能当作普通依赖包使用. 下面就介绍两种maven打可运行jar包的方式: 方式一:内置打包法 <plugins> <!-- 内置打包法 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 

Jsp 内置对象

JSP内置对象是 Web 容器创建的一组对象 JSP内置对象的名称是 JSP 的保留字 JSP内置对象是可以直接在 JSP 页面使用的对象,无需使用 “new” 获取实例 -request 对象:用于处理客户端请求,主要方法如下: String getParameter(String name) 根据页面表单组件名称获取页面提交数据 String[ ] getParameterValues(String name) 获取一个页面表单组件对应多个值时的用户的请求数据 void setCharact

jsp的9个内置对象

1)面试时经常问:有哪些内置对象? 对象名                 类型                                        备注 request                  HttpServletRequest            请求对象 response               HttpServletResponse           响应对象 session                  HttpSession            

使用Karabiner为Mac内置键盘、HHKB进行映射

使用Karabiner为Mac内置键盘.HHKB进行映射 Table of Contents 1. 引言 2. 什么是Karabiner和配置方法的基本说明 3. 内置键盘设置 4. HHKB设置 5. 通用设置 6. 待完善内容 1 引言 自从使用了Mac后,经过一系列折腾: 买了个HHKB Pro 2 TypeS,感觉手感确实不错,比内置键盘好多了,就是稍微有些硬. 编辑软件从Vim转为了Emacs 使用iTerm2作为常用Terminal 一些常用软件等等 现在使用Mac办公已经毫无压力.