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();
     	}
  	}
}
相关推荐
向宇it5 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
向宇it6 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
坐井观老天11 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
pchmi13 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭15 小时前
C#都可以找哪些工作?
开发语言·c#
boligongzhu17 小时前
Dalsa线阵CCD相机使用开发手册
c#
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
java·开发语言·unity·c#·游戏引擎·里氏替换原则
sukalot1 天前
windows C#-命名实参和可选实参(下)
windows·c#
小码编匠1 天前
.NET 下 RabbitMQ 队列、死信队列、延时队列及小应用
后端·c#·.net