.netframework 中發送郵件的api主要是使用SmtpClient 類,到了.netcore,官方並不推薦使用SmtpClient API,詳情可查看官方說明:https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=net-5.0,因此這里我使用第三方郵件發送庫:MailKit 來進行郵件的發送。
配置QQ郵箱
- 登錄QQ郵箱,選擇設置->賬戶->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
開啟POP3/SMTP服務以及IMAP/SMTP服務。
POP3服務開啟流程
1.開啟POP3服務![]
(https://www.lovecoding.com.cn:99//5596824483738550145.png)
2.POP3服務開啟成功后如下圖所示,會彈出一個框,注意:不是用這個框里的密碼進行發送郵件
3.生成用於發送郵件的授權碼
IMAP服務開啟流程
開啟流程和POP3開啟流程類似。
創建郵件發送接口
- 安裝nuget包MailKit
- 添加IMailService接口
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace CommonLib.Email { public interface IMailService { Task SendEmailAsync(MailRequest mailRequest); } }
- 創建郵件信息相關實體類
using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Text; namespace CommonLib.Email { public class MailRequest { //收件地址 public string ToEmail { get; set; } //郵件標題 public string Subject { get; set; } //郵件內容,支持html public string Body { get; set; } //要發送的附件 public List<IFormFile> Attachments { get; set; } } }
- 創建郵箱配置信息實體類
using System; using System.Collections.Generic; using System.Text; namespace CommonLib.Email { public class MailSettings { //用於發送郵件的郵箱賬號 public string Mail { get; set; } //顯示名稱 public string DisplayName { get; set; } //用於發送郵件的郵箱賬號的授權碼 public string Password { get; set; } //用於發送郵件的郵箱服務器,QQ郵箱是:smtp.qq.com public string Host { get; set; } //用於發送郵件的郵箱服務器端口,QQ郵箱的端口是25 public int Port { get; set; } } }
- 創建實現具體郵件發送邏輯的類,並實現IMailService接口
using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; namespace CommonLib.Email { public class MailService : IMailService { private readonly MailSettings _mailSettings; public MailService(IOptions<MailSettings> mailSettings) { _mailSettings = mailSettings.Value; //這里這個密碼是QQ郵箱授權碼 _mailSettings.Password = mailSettings.Value.Password; } public async Task SendEmailAsync(MailRequest mailRequest) { var email = new MimeMessage(); //一定要使用下面這句代碼添加發送人郵箱信息,否則QQ收件箱那邊無法看到發送人的郵箱信息。 email.From.Add(MailboxAddress.Parse(_mailSettings.Mail)); email.Sender = MailboxAddress.Parse(_mailSettings.Mail); email.To.Add(MailboxAddress.Parse(mailRequest.ToEmail)); email.Subject = mailRequest.Subject; var builder = new BodyBuilder(); if (mailRequest.Attachments != null) { byte[] fileBytes; foreach (var file in mailRequest.Attachments) { if (file.Length > 0) { using (var ms = new MemoryStream()) { file.CopyTo(ms); fileBytes = ms.ToArray(); } builder.Attachments.Add(file.FileName, fileBytes, MimeKit.ContentType.Parse(file.ContentType)); } } } builder.HtmlBody = mailRequest.Body; email.Body = builder.ToMessageBody(); using (var smtp = new SmtpClient()) { smtp.Connect(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.StartTls); smtp.Authenticate(_mailSettings.Mail, _mailSettings.Password); await smtp.SendAsync(email); smtp.Disconnect(true); } } } }
打開appsettings.Development.json文件,加入發送郵件所用到的郵箱賬號、郵箱服務器等信息。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"MailSettings": {
"Mail": "2782815239@qq.com",
"DisplayName": "陳新",
"Password": "xxx",
"Host": "smtp.qq.com",
"Port": 25
},
"urls": "http://*:80"
}
到這里,基本配置工作已經完成,但是需要注意的是將代碼發布到雲服務器上(如騰訊雲)時需要注意解封25端口,否則無法正常發送郵件。
騰訊雲25端口開放方法請參見:https://cloud.tencent.com/document/product/213/40436