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