asp.net core 發送QQ郵件


.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM