using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net.Mail; using System.Text; using System.Threading.Tasks; using MailKit.Security; using MimeKit; using MimeKit.Text; namespace CK.SCP.Common { public class MyWebSmtpMail { private MailMessage mailMessage; private SmtpClient smtpClient; private string from; private string server; private string username; private string password; private bool enablessl; private bool credentials; private int port; public MyWebSmtpMail() { string From = ConfigurationManager.AppSettings["MailSender"]; string Server = ConfigurationManager.AppSettings["MailServer"]; string UserName = ConfigurationManager.AppSettings["MailUserName"]; string Password = ConfigurationManager.AppSettings["MailPassword"]; int Port = Convert.ToInt32(ConfigurationManager.AppSettings["MailPort"]); this.from = From; this.server = Server; this.password = Password; this.username = UserName; this.enablessl = false; this.port = Port; this.credentials = false; } public void Send(string To, string Body, string Title) { mailMessage = new MailMessage(); mailMessage.To.Add(To); mailMessage.From = new System.Net.Mail.MailAddress(this.from); mailMessage.Subject = "新的邮件通知"; mailMessage.Body = Body; mailMessage.IsBodyHtml = true; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; mailMessage.Priority = System.Net.Mail.MailPriority.Normal; if (mailMessage != null) { smtpClient = new SmtpClient(); if (!credentials) { smtpClient.Credentials = new System.Net.NetworkCredential(username, password); } smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; smtpClient.Host = server; smtpClient.Port = port; smtpClient.EnableSsl = enablessl; try { //是否使用默认凭据,若为false,则使用自定义的证书,就是下面的networkCredential实例对象 smtpClient.UseDefaultCredentials = true; //指定邮箱账号和密码,需要注意的是,这个密码是你在QQ邮箱设置里开启服务的时候给你的那个授权码 System.Net.NetworkCredential networkCredential = new System.Net.NetworkCredential(username, password); smtpClient.Credentials = networkCredential; //发送邮件 smtpClient.Send(mailMessage); } catch (System.Net.Mail.SmtpException ex) { throw new Exception(ex.Message + ex.InnerException?.Message); // Console.WriteLine(ex.Message, "发送邮件出错"); } } } } public class SmtpMailSender { private readonly SmtpClient _client = new SmtpClient(); private MailMessage _message = new MailMessage(); private readonly string _targetName; public SmtpMailSender(string targetName) { _targetName = targetName; } public void BuildClient(string host, int port, bool enableSsl, string username, string password) { _client.Host = host; //587 or 25 _client.Port = port; // This require to be before setting Credentials property _client.UseDefaultCredentials = false; _client.DeliveryMethod = SmtpDeliveryMethod.Network; // you must give a full email address for authentication _client.Credentials = new System.Net.NetworkCredential(username, password); // Set to avoid MustIssueStartTlsFirst exception _client.TargetName = _targetName; // Set to avoid secure connection exception _client.EnableSsl = enableSsl; } public void BuildMessage(EmailAddress fromAddress, List toAddressList, string subject, string body) { _message = new MailMessage() { // sender must be a full email address From = new MailAddress(fromAddress.Address, fromAddress.Name), Subject = subject, IsBodyHtml = true, Body = body, BodyEncoding = Encoding.UTF8, SubjectEncoding = Encoding.UTF8, }; foreach (var emailAddress in toAddressList) { _message.To.Add(new MailAddress(emailAddress.Address, emailAddress.Name)); } } public void Send() { try { _client.Send(_message); Console.WriteLine("Smtp Send Success:" + _message.To[0].Address); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(); } } public async Task SendAsync() { try { await _client.SendMailAsync(_message); Console.WriteLine("Smtp Send Success:" + _message.To[0].Address); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(); } } } public class MailKitMailSender { private readonly MailKit.Net.Smtp.SmtpClient _client = new MailKit.Net.Smtp.SmtpClient(); private MimeMessage _message = new MimeMessage(); private string host;//邮箱服务器 private int port;//端口 private string from;//发送的邮箱 private string password;//密码 private bool enablessl;//是否ssl private string username;//发送名称 private readonly SecureSocketOptions _secureSocketOptions; private MailKitMailSender() { _client.ServerCertificateValidationCallback = (s, c, h, e) => true; } public MailKitMailSender(SecureSocketOptions secureSocketOptions) : this() { _secureSocketOptions = secureSocketOptions; host = ConfigurationManager.AppSettings["MailServer"]; port = Convert.ToInt32(ConfigurationManager.AppSettings["MailPort"]); from = ConfigurationManager.AppSettings["MailSender"]; username = ConfigurationManager.AppSettings["MailUserName"]; password = ConfigurationManager.AppSettings["MailPassword"]; enablessl = false; } public void BuildMessage(List toAddressList, string subject, string body, string model) { _message = new MimeMessage(); _message.Sender = new MailboxAddress(username, from); _message.From.Add(new MailboxAddress(username, from)); _message.Subject = subject; _message.Body = new TextPart(TextFormat.Html) { Text = body }; foreach (var emailAddress in toAddressList) { if (model == "BCC")//抄送模式(抄送模式只发送一个邮件,避免大量发重复邮件) { _message.Bcc.Add(new MailboxAddress(emailAddress.Name, emailAddress.Address)); } else { _message.To.Add(new MailboxAddress(emailAddress.Name, emailAddress.Address)); } } } public void Send() { try { _client.Connect(host, port, _secureSocketOptions); _client.Authenticate(from, password); _client.Send(_message); _client.Disconnect(true); Console.WriteLine("MailKit Send Success:" + _message.To.Mailboxes.First()); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(); } } public async Task SendAsync() { try { await _client.ConnectAsync(host, port, _secureSocketOptions); await _client.AuthenticateAsync(from, password); await _client.SendAsync(_message); await _client.DisconnectAsync(true); Console.WriteLine("MailKit Send Success:" + _message.To.Mailboxes.First()); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(); } } } public class EmailAddress { public EmailAddress(string address, string name) { Address = address; Name = name; } public string Name { get; set; } public string Address { get; set; } } }