使用.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.示例代码

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Security;
using System.Text;
using System.Threading.Tasks;

namespace MailTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string fromMail = "27***7200@qq.com";
            string toMail = "137***126@qq.com";


            SendMail(fromMail, toMail);

            Console.WriteLine("ok!");
            Console.ReadKey();

        }

        static void SendMail(string fromMail, string toMail)
        {
            MailMessage mailMessage = new MailMessage
            {
                //发件人
                From = new MailAddress(fromMail)
            };

            //收件人 可以添加多个收件人
            mailMessage.To.Add(new MailAddress(toMail));

            //mailMessage.CC 获取包含此电子邮件的抄送(CC)收件人的地址集合
            //邮件主题
            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Subject = "Hello";

            //邮件正文
            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.Body = "<p style='color:red;font-size:14px;'>邮件测试</p>";

            //如果要发送html格式的消息,需要设置这个属性
            mailMessage.IsBodyHtml = true;

            //邮件内容即消息正文中中显示图片 
            //需要为图片指明src='cid:idname(资源id)'
            AlternateView htmlBody = AlternateView.CreateAlternateViewFromString("<img src='cid:zfp'/>", null, "text/html");

            //然后在LinkedResource加入文件的绝对地址,和ContentType 例如image/gif,text/html...与http请求的响应报文中的ContentType一致
            LinkedResource lr = new LinkedResource("1.gif", "image/gif");

            //绑定上文中指定的idname
            lr.ContentId = "zfp";

            //添加链接资源
            htmlBody.LinkedResources.Add(lr);

            mailMessage.AlternateViews.Add(htmlBody);

            //发送附件 指明附件的绝对地址
            Attachment attachment = new Attachment("1.txt");
            mailMessage.Attachments.Add(attachment);


            //创建邮件发送客户端
            try
            {
                //这里使用qq邮箱 需要在设置->账户下开启POP3/SMTP服务 和 IMAP / SMTP服务
                //qq邮箱的发件服务器smtp.qq.com  端口25
                SmtpClient sendClient = new SmtpClient("smtp.qq.com", 25)
                {
                    //指定邮箱账号和密码
                    //在第三方客户端登陆qq邮箱时,密码是授权码
                    //登陆qq邮箱在设置->账户下可以生成授权码
                    Credentials = new NetworkCredential(fromMail, "xmxyldrmtvnrddfe")
                };

                //指定如何发送电子邮件
                sendClient.DeliveryMethod = SmtpDeliveryMethod.Network;

                //指定使用使用安全套接字ssl加密的链接

                sendClient.EnableSsl = true;
                sendClient.Send(mailMessage);
            }
            catch
            {
                throw;
            }
        }
    }
}
View Code

 

  四、可能出现的异常

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

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

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

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM