C#使用Smtp协议发送邮件

使用Smtp协议发送邮件

发送代码,Mail类

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

namespace Smtp
{
    public class Mail
    {
        private string sender;
        /// <summary>
        /// 发送人
        /// </summary>
        public string Sender
        {
            get
            {
                return sender;
            }
            set
            {
                sender = value;
            }
        }

        private string senderMail;
        /// <summary>
        /// 发送人邮箱
        /// </summary>
        public string SenderMail
        {
            get
            {
                return senderMail;
            }
            set
            {
                senderMail = value;
            }
        }

        private string senderPw;
        /// <summary>
        /// 发送人密码
        /// </summary>
        public string SenderPw
        {
            get
            {
                return senderPw;
            }
            set
            {
                senderPw = value;
            }
        }

        private string smtpServer;
        /// <summary>
        /// smtpServer地址
        /// </summary>
        public string SmtpServer
        {
            get
            {
                return smtpServer;
            }
            set
            {
                smtpServer = value;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender">委托发件人</param>
        /// <param name="sender">委托发件人邮件地址</param>
        /// <param name="senderPw">密码</param>
        /// <param name="ewsUrl">smtpServer地址</param>
        public Mail(string sender, string senderMail, string senderPw, string smtpServer)
        {
            this.sender = sender;
            this.senderMail = senderMail;
            this.senderPw = senderPw;
            this.smtpServer = smtpServer;
        }

        public Mail()
        {
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="title"></param>
        /// <param name="body"></param>
        /// <param name="receiver"></param>
        public void Send(string title, string body, string[] receiver)
        {
            SmtpClient _smtpClient = new SmtpClient();
            _smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
            _smtpClient.Host = this.smtpServer; ;//指定SMTP服务器
            _smtpClient.EnableSsl = true;
            _smtpClient.Port = 587;
            _smtpClient.Credentials = new System.Net.NetworkCredential(this.sender, this.senderPw);//用户名和密码

            for (int i = 0; i < receiver.Length; i++)
            {
                //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
                ServicePointManager.ServerCertificateValidationCallback =
delegate (Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
                MailMessage _mailMessage = new MailMessage(this.senderMail, receiver[i]);
                _mailMessage.Subject = title;//主题
                _mailMessage.Body = body;//内容
                _mailMessage.BodyEncoding = System.Text.Encoding.UTF8;//正文编码
                _mailMessage.IsBodyHtml = true;//设置为HTML格式
                _mailMessage.Priority = MailPriority.High;//优先级
                //Attachment am = new Attachment(attachment, "attachment");
                //_mailMessage.Attachments.Add(am);
                _smtpClient.Send(_mailMessage);
            }

        }
        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            //if (sslPolicyErrors == SslPolicyErrors.None)
            //    return true;
            //else
            //    return true;
            // If there are no errors, then everything went smoothly.
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;

            // Note: MailKit will always pass the host name string as the `sender` argument.
            //var host = (string)sender;
            string host = sender as string;
            if (host == null)
            {
                // Handle the case where sender is not a string
                Console.WriteLine("Sender parameter is not a valid string.");
                return false;
            }
            if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) != 0)
            {
                // This means that there are errors in the certificate chain. You can inspect the chain errors and handle them accordingly.
                foreach (X509ChainStatus chainStatus in chain.ChainStatus)
                {
                    Console.WriteLine("Certificate chain error: " + chainStatus.StatusInformation);
                }
                return false;
            }
            if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != 0)
            {
                // This means that the remote certificate is unavailable. Notify the user and return false.
                Console.WriteLine("The SSL certificate was not available for {0}", host);
                return false;
            }

            if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0)
            {
                // This means that the server's SSL certificate did not match the host name that we are trying to connect to.
                var certificate2 = certificate as X509Certificate2;
                var cn = certificate2 != null ? certificate2.GetNameInfo(X509NameType.SimpleName, false) : certificate.Subject;

                Console.WriteLine("The Common Name for the SSL certificate did not match {0}. Instead, it was {1}.", host, cn);
                return false;
            }

            // The only other errors left are chain errors.
            Console.WriteLine("The SSL certificate for the server could not be validated for the following reasons:");

            // The first element's certificate will be the server's SSL certificate (and will match the `certificate` argument)
            // while the last element in the chain will typically either be the Root Certificate Authority's certificate -or- it
            // will be a non-authoritative self-signed certificate that the server admin created. 
            foreach (var element in chain.ChainElements)
            {
                // Each element in the chain will have its own status list. If the status list is empty, it means that the
                // certificate itself did not contain any errors.
                if (element.ChainElementStatus.Length == 0)
                    continue;

                Console.WriteLine("\u2022 {0}", element.Certificate.Subject);
                foreach (var error in element.ChainElementStatus)
                {
                    // `error.StatusInformation` contains a human-readable error string while `error.Status` is the corresponding enum value.
                    Console.WriteLine("\t\u2022 {0}", error.StatusInformation);
                }
            }

            return false;
        }
        /// <summary>
        /// 发送邮件,带附件
        /// </summary>
        /// <param name="title"></param>
        /// <param name="body"></param>
        /// <param name="receiver"></param>
        /// <param name="attachment">附件</param>
        public void Send(string title, string body, string receiver, System.IO.Stream attachment)
        {
            SmtpClient _smtpClient = new SmtpClient();
            _smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
            _smtpClient.Host = this.smtpServer; ;//指定SMTP服务器
            _smtpClient.Credentials = new System.Net.NetworkCredential(this.sender, this.senderPw);//用户名和密码

            MailMessage _mailMessage = new MailMessage(this.senderMail, receiver);
            _mailMessage.Subject = title;//主题
            _mailMessage.Body = body;//内容
            _mailMessage.BodyEncoding = System.Text.Encoding.UTF8;//正文编码
            _mailMessage.IsBodyHtml = true;//设置为HTML格式
            _mailMessage.Priority = MailPriority.High;//优先级
            Attachment am = new Attachment(attachment, "attachment");
            _mailMessage.Attachments.Add(am);
            _smtpClient.Send(_mailMessage);
        }
    }
}

测试调用,Program类

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Text;

namespace SendMail
{
    class Program
    {
        static void Main(string[] args)
        {
            Smtp.Mail mail = new Smtp.Mail();
            mail.Sender = "Test";
            mail.SenderMail = "Test@mail.com";
            mail.SenderPw = "Pass@word";
            mail.SmtpServer = "IP地址";
            //收件人列表
            string temp = "test@mail.com;test2@mail.com;";
            string[] res = temp.Split(';');
            string content ="邮件内容";
            for (int i = 0; i < 2; i ++)
            {
                Console.WriteLine("开始发送第" + i.ToString());
                mail.Send("邮件测试  " + i.ToString(), content, res);
            }
            Console.ReadLine();
     	}
  	}
}
相关推荐
William_cl6 小时前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc
tomcsdn419 小时前
SMTPman,smtp服务器高效邮件发送核心指南
服务器·邮件营销·邮件群发·smtp服务器·域名邮箱·邮件服务器·红人营销
c#上位机10 小时前
wpf之命令
c#·wpf
曹牧13 小时前
C#:函数默认参数
开发语言·c#
R-G-B1 天前
【02】C#入门到精通——C# 变量、输入/输出、类型转换
开发语言·c#·c# 变量·c#输入/输出·c#类型转换
星河队长1 天前
C# 软件加密方法,有使用时间限制,同时要防止拷贝
开发语言·c#
Aevget1 天前
DevExpress WinForms v25.1亮点 - PDF Viewer(查看器)等全新升级
pdf·c#·界面控件·winform·devexpress·ui开发
InCerry1 天前
为 .NET 10 GC(DATAS)做准备
性能优化·c#·.net·gc
曹牧1 天前
C#:可选参数
开发语言·c#
Sunsets_Red1 天前
差分操作正确性证明
java·c语言·c++·python·算法·c#