zoukankan      html  css  js  c++  java
  • 使用.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邮箱的密码需要使用授权码

     

  • 相关阅读:
    【Python开发】Lambda表达式使用
    【Python开发】Python 适合大数据量的处理吗?
    【Python开发】Python 适合大数据量的处理吗?
    【Python开发】matplotlib绘图不显示问题解决plt.show()
    【Python开发】matplotlib绘图不显示问题解决plt.show()
    【C/C++语言】指针常量与常量指针的区别
    【C/C++语言】指针常量与常量指针的区别
    【Qt开发】【计算机视觉】OpenCV在Qt-MinGw下的编译库
    【Qt开发】【计算机视觉】OpenCV在Qt-MinGw下的编译库
    【并行计算-CUDA开发】从零开始学习OpenCL开发(一)架构
  • 原文地址:https://www.cnblogs.com/phasd/p/7439696.html
Copyright © 2011-2022 走看看