前言
在.NET 中處理郵件收發操作時,MailKit是一個非常強大的庫。
它支持SMTP、POP3、IMAP等多種協議,可以輕松實現發送、接收、以及管理郵件的功能。
下面我們將通過一個詳細的示例,展示如何在.NET 項目中使用MailKit來收發郵件,并對關鍵代碼進行解釋。
獲取QQ郵箱授權碼
打開QQ郵箱,進入?設置->賬號?頁面:
在?POP3/IMAP/SMTP?中開啟?SMTP服務,然后點擊?授權碼復制授權碼:
QQ郵箱服務器的參數如下,詳細內容參考SMTP/IMAP服務:
接收郵件服務器:imap.qq.com,使用SSL,端口號993
發送郵件服務器:smtp.qq.com,使用SSL,端口號465或587
網易郵箱服務器的參數如下,詳細內容參考網易郵箱服務器參數如何設置?:
安裝 MailKit
在項目中安裝 MailKit 庫,可以通過NuGet包管理器安裝它或者使用以下命令:
dotnet?add?package?MailKit
MailKit 是在 MimeKit 之上構建的跨平臺郵件客戶端庫,目標是成為 .NET 的最佳電子郵件框架。
配置郵件服務器信息
配置郵件服務器信息,包括主機、端口、用戶名、密碼等,封裝成 EmailData 類:
///?<summary>
///?郵件數據
///?</summary>
class?EmailData
{
????///?<summary>
????///?發件人
????///?</summary>
????public?string?From?{?get;?set;?}
????///?<summary>
????///?授權碼
????///?</summary>
????public?string?Password?{?get;?set;?}
????///?<summary>
????///?收件人
????///?</summary>
????public?string?To?{?get;?set;?}
????///?<summary>
????///?主題
????///?</summary>
????public?string?Subject?{?get;?set;?}
????///?<summary>
????///?純文本內容
????///?</summary>
????public?string?TextBody?{?get;?set;?}
????///?<summary>
????///?HTML內容
????///?</summary>
????public?string?HtmlBody?{?get;?set;?}
????///?<summary>
????///?發送郵件服務器
????///?</summary>
????public?HostInfo?SMTP?{?get;?set;?}
????///?<summary>
????///?接受郵件服務器
????///?</summary>
????public?HostInfo?IMAP?{?get;?set;?}
}
///?<summary>
///?服務器信息
///?</summary>
class?HostInfo
{
????///?<summary>
????///?服務器地址
????///?</summary>
????public?string?Host?{?get;?set;?}
????///?<summary>
????///?服務器端口
????///?</summary>
????public?int?Port?{?get;?set;?}
}
實現郵件收發方法
郵件收發方法如下,這里只接收最新的10封郵件便于實現交互邏輯:
static?async?Task?SendEmail(EmailData?data)
{
????try
????{
????????//?創建一個新的?MIME?消息對象
????????var?message?=?new?MimeMessage();
????????//?設置發件人
????????message.From.Add(MailboxAddress.Parse(data.From));
????????//?設置收件人
????????message.To.Add(MailboxAddress.Parse(data.To));
????????//?設置主題
????????message.Subject?=?data.Subject;
????????//?創建郵件正文
????????var?builder?=?new?BodyBuilder();
????????builder.TextBody?=?data.TextBody;
????????builder.HtmlBody?=?data.HtmlBody;
????????//?添加附件
????????using?(var?stream?=?new?FileStream("file.txt",?FileMode.Open))
????????{
????????????builder.Attachments.Add("file.txt",?stream);
????????}
????????//?設置正文
????????message.Body?=?builder.ToMessageBody();
????????//?使用?SMTP?客戶端發送郵件
????????using?(var?client?=?new?SmtpClient())
????????{
????????????await?client.ConnectAsync(data.SMTP.Host,?data.SMTP.Port,?SecureSocketOptions.StartTls);
????????????//?注:用戶名和密碼應妥善保管,不要硬編碼到源碼中
????????????await?client.AuthenticateAsync(data.From,?data.Password);
????????????//?發送郵件
????????????await?client.SendAsync(message);
????????????//?斷開與服務器的連接
????????????await?client.DisconnectAsync(true);
????????}
????????Console.WriteLine("郵件已成功發送!");
????}
????catch?(Exception?ex)
????{
????????Console.WriteLine($"郵件發送失敗:{ex.Message}");
????}
}
static?async?Task?GetEmail(EmailData?data)
{
????try
????{
????????//?連接到?IMAP?服務器
????????using?(var?client?=?new?ImapClient())
????????{
????????????await?client.ConnectAsync(data.IMAP.Host,?data.IMAP.Port,?true);?//?通常使用?TLS?加密
????????????//?認證用戶
????????????await?client.AuthenticateAsync(data.From,?data.Password);
????????????//?選擇收件箱
????????????var?inbox?=?client.Inbox;
????????????await?inbox.OpenAsync(FolderAccess.ReadOnly);
????????????//?獲取郵件數量
????????????int?totalMessages?=?inbox.Count;
????????????//?確保開始位置不會小于1
????????????int?start?=?Math.Max(totalMessages?-?5,?1);?
????????????int?end?=?totalMessages;
????????????//?獲取最新的10封郵件的信息
????????????var?messages?=?inbox.Fetch(start,?end,?MessageSummaryItems.Envelope?|?MessageSummaryItems.UniqueId);
????????????//?遍歷郵件信息并打印出來
????????????foreach?(var?summary?in?messages)
????????????{
????????????????var?uid?=?summary.UniqueId;
????????????????var?message?=?await?inbox.GetMessageAsync(uid);
????????????????Console.WriteLine($"Subject:?{message.Subject}");
????????????????Console.WriteLine($"From:?{message.From}");
????????????????Console.WriteLine($"To:?{message.To}");
????????????????Console.WriteLine($"Date:?{message.Date}");
????Console.WriteLine($"HtmlBody:?{message.HtmlBody}");
?????Console.WriteLine($"TextBody:?{message.TextBody}");
????????????}
????????????//?斷開連接
????????????await?client.DisconnectAsync(true);
????????}
????}
????catch?(Exception?ex)
????{
????????Console.WriteLine($"接收郵件失敗:{ex.Message}");
????}
}
注意接受郵件時 message.Body 部分內容需要特殊的解析規則,比如附件部分、歷史郵件部分。
測試郵件收發
使用時關鍵信息替換成自己的:
static?async?Task?Main(string[]?args)
{
????var?data?=?new?EmailData
????{
????????From?=?"qqqqqq@qq.com",
????????Password?=?"**********",
????????To?=?"qqqqqq@qq.com",
????????Subject?=?"來自?.NET?Core?的測試郵件",
????????TextBody?=?"這是純文本消息內容。",
????????HtmlBody?=?"<h1>這是HTML消息</h1><p>這封郵件是通過MailKit從 .NET Core 發送的。</p>",
????????SMTP?=?new?HostInfo()
????????{
????????????Host?=?"smtp.qq.com",
????????????Port?=?587
????????},
????????IMAP?=?new?HostInfo()
????????{
????????????Host?=?"imap.qq.com",
????????????Port?=?993
????????}
????};
????File.WriteAllText("file.txt",?"This?is?a?test?file.");
????await?SendEmail(data);
????await?GetEmail(data);
}
總結
MailKit在.NET 中提供了一個強大而靈活的接口來處理郵件收發操作。無論是通過SMTP發送郵件,還是通過IMAP/POP3接收郵件,MailKit都能輕松實現。
這個示例代碼涵蓋了最常見的郵件處理場景,并且可以直接復制使用。
在實際應用中,你可以根據需要擴展這些功能,例如處理附件、管理郵件文件夾、或實現更復雜的郵件過濾和處理邏輯。
作者:二次元攻城獅
出處:cnblogs.com/timefiles/p/18466070聲明:網絡內容,僅供學習,尊重版權,侵權速刪,歉意致謝!
該文章在 2024/11/6 10:19:45 編輯過