• C# 邮件发送


    SMTP(Simple Mail Transport Protocol)简单邮件传输协议。在.NET Frameword类库中提供SmtpClient类(System.NET.Mail),提供了一个轻型方法来发送SMTP电子邮件信息。

    1.首先引入命名空间using System.Net.Mail;

    2.将发送的邮件的功能封装成一个类,该类中包含了发送邮件的基本功能:收件人(多人),抄送(多人),发送人,主题,邮件正文,附件等,封装的Email类如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Mail;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Helper
    {
        /// <summary>
        /// 发送邮件辅助类
        /// </summary>
        public class EmailHelper
        {
            /// <summary>
            /// 发送者
            /// </summary>
            public string MailFrom { get; set; }
    
            /// <summary>
            /// 收件人
            /// </summary>
            public string[] MailToArray { get; set; }
    
            /// <summary>
            /// 抄送
            /// </summary>
            public string[] MailCcArray { get; set; }
    
            /// <summary>
            /// 标题
            /// </summary>
            public string MailSubject { get; set; }
    
            /// <summary>
            /// 正文
            /// </summary>
            public string MailBody { get; set; }
    
            /// <summary>
            /// 发件人密码
            /// </summary>
            public string MailPwd { get; set; }
    
            /// <summary>
            /// SMTP邮件服务器
            /// </summary>
            public string Host { get; set; }
    
            /// <summary>
            /// 正文是否是html格式
            /// </summary>
            public bool IsbodyHtml { get; set; }
    
            /// <summary>
            /// 附件,附件的文件路径
            /// </summary>
            public string[] AttachmentsPath { get; set; }
    
            public bool Send()
            {
                //使用指定的邮件地址初始化MailAddress实例
                MailAddress maddr = new MailAddress(MailFrom);
                //初始化MailMessage实例
                MailMessage myMail = new MailMessage();
    
                //向收件人地址集合添加邮件地址
                if (MailToArray != null)
                {
                    for (int i = 0; i < MailToArray.Length; i++)
                    {
                        myMail.To.Add(MailToArray[i].ToString());
                    }
                }
                //向抄送收件人地址集合添加邮件地址
                if (MailCcArray != null)
                {
                    for (int i = 0; i < MailCcArray.Length; i++)
                    {
                        myMail.CC.Add(MailCcArray[i].ToString());
                    }
                }
                //发件人地址
                myMail.From = maddr;
                //电子邮件的标题
                myMail.Subject = MailSubject;
                //电子邮件的主题内容使用的编码
                myMail.SubjectEncoding = Encoding.UTF8;
    
                //电子邮件正文
                myMail.Body = MailBody;
                //电子邮件正文的编码
                myMail.BodyEncoding = Encoding.Default;
    
                myMail.Priority = MailPriority.High;
                myMail.IsBodyHtml = IsbodyHtml;
    
                //在有附件的情况下添加附件
                try
                {
                    if (AttachmentsPath != null && AttachmentsPath.Length > 0)
                    {
                        Attachment attachFile = null;
                        foreach (string path in AttachmentsPath)
                        {
                            attachFile = new Attachment(path);
                            myMail.Attachments.Add(attachFile);
                        }
                    }
                }
                catch (Exception err)
                {
                    throw new Exception("在添加附件时有错误:" + err);
                }
    
                SmtpClient smtp = new SmtpClient
                {
                    EnableSsl = true,
                    UseDefaultCredentials = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
    
                    //设置SMTP邮件服务器
                    Host = Host,
                    //指定发件人的邮件地址和密码以验证发件人身份
                    Credentials = new System.Net.NetworkCredential(MailFrom, MailPwd),
    
                };
    
                try
                {
                    //将邮件发送到SMTP邮件服务器
                    smtp.Send(myMail);
                    return true;
                }
                catch (SmtpException ex)
                {
                    throw ex;
                }
            }
        }
    }
    View Code

     注意:一定要先设置 EnableSsl和UseDefaultCredentials,再实例化Credentials 

    3、调用发送邮件的类

     [TestMethod]
            public void TestEmail()
            {
                LogModel log = new LogModel()
                {
                    ProjectName = ProjectName.Helper,
                    MethodName = "TestEmail",
                    Meassage = ""
                };
                bool result = false;
                try
                {
                    string info = "摄像头005异常。上次状态正常时间是:" + DateTime.Now.AddDays(-1).ToString();
                    //发邮件
                    EmailHelper email = new EmailHelper
                    {
                        MailFrom = "xxxxx@qq.com",
                        MailPwd = "matxacxgfghnbhhf", //我的qq邮箱授权码
                        MailSubject = "设备异常",
                        MailBody = info,
                        //email.isbodyHtml = true;    //是否是HTML
                        Host = "smtp.qq.com",    //如果是QQ邮箱则:smtp:qq.com,依次类推  genvict不行
                        MailToArray = new string[] { "Ziyouxxx@163.com" },//接收者邮件集合
                        MailCcArray = new string[] { "huxxxxx@163.com" }, //抄送者邮件集合
                        AttachmentsPath=new string[] { @"F:MyZoneWeWeixin.jpg", @"F:learn_newElasticSearch高吞吐ELK实践_携程旅行_吴晓刚_[Remark].pdf" },
                    };
                    result = email.Send();
    
                    //逻辑代码...
                    string isExistStr = result == true ? "成功" : "失败";
                    log.Meassage = $"邮件发送{isExistStr}";
                    FileToELK.WriteLogToELK(log);
                }
                catch (Exception ex)
                {
                    log.logType = LogType.Error;
                    log.Meassage = ex.ToString();
                    FileToELK.WriteLogToELK(log);
                    result = false;
                }
                Assert.IsTrue(result);
            }
    View Code

    问题1:Smpt命令顺序不正确。 服务器响应为: Error: need EHLO and AUTH first !

    原因:未加( EnableSsl  SSL加密连接 )导致的

    问题2:服务器响应为: mail from address must be same as authorization user

    原因:授权码不对。

    QQ邮箱中设置授权码,(其他的邮箱相应设置)

    1、首先在QQ邮箱当中开启“POP3/SMTP服务”

    2、获取“授权码”

      在上一步刚开通后也会提示出“授权码”,单击生成授权码。

  • 相关阅读:
    第五章 Internet协议
    第四章 地址解析协议
    Learn the shell
    Linux学习前的准备
    第三章 链路层
    第二章 Internet 地址结构
    后台数据导出为Excel
    C#开发客户端、JAVA和tomcat开发服务端
    Java基础
    C++学习笔记--(1)
  • 原文地址:https://www.cnblogs.com/peterYong/p/6601609.html
Copyright © 2020-2023  润新知