簡體   English   中英

如何使用 MailKit 庫獲取我對 email 的回復?

[英]How to Get My Replies on an email using MailKit library?

我正在使用 MailKit 庫從 IMAP 服務器獲取消息。

我試圖根據其主題獲取 email,但它只返回客戶端消息的 ID,而沒有我的回復

var uidsX = client.Inbox.Search (SearchQuery.SubjectContains ("Message\'s Subject"));

從 Gmail 獲取消息 ID 標頭的值后,我還嘗試對其進行硬編碼,但我收到了一個空列表!

const string myReplyId = @"<CAAWrOQmJib_RHUn+3vB9GqATim165zq_Upn_8OTatZZMYGtf5w@mail.gmail.com>";
var myReply = client.Inbox.Search(SearchQuery.HeaderContains("Message-ID", myMessageId));

我什至嘗試查看是否可以在“已發送文件夾”而不是“收件箱”中找到我的回復,但我得到的是一個空列表。

那么有人可以幫助我嗎?

首先,我需要確保我正確理解當您說您正在嘗試獲得“對電子郵件的答復”時的意思。

我假設您現在的意思是有人向您發送了一條消息(讓我們稱他為 Joe)並且您回復了他,並且您想編寫一個程序來連接到 IMAP 服務器並將您的回復下載回給 Joe。

讓我們假設消息的主題是“飲料?”

換句話說:

From: Joe <joe@example.com>
To: Malek <malek@example.com>
Subject: drinks?
Message-Id: <msgid-1@example.com>

Hey Malek, wanna grab drinks after work tonight?

……你回復他:

From: Malek <malek@example.com>
To: Joe <joe@example.com>
Subject: Re: drinks?
Message-Id: <msgid-2@example.com>
References: <msgid-1@example.com>
In-Reply-To: <msgid-1@example.com>

Can't tonight, but how about after work Friday?

您正在自己的收件箱文件夾中搜索包含“回復:飲料?”的消息。 最終沒有匹配? 並且您還嘗試使用 Message-Id 值在收件箱中搜索消息但沒有匹配項?

最有可能的是,這將不起作用,因為您用來發送回復的任何客戶端都可能沒有出現在收件箱中,它很可能出現在 Sent 文件夾中(或位於硬盤驅動器上的本地 Sent 文件夾中)。

您提到您還嘗試搜索 Sent 文件夾,但仍然沒有匹配項,這向我表明該消息不存在。 如果您使用桌面郵件客戶端發送它,它可能在您的硬盤驅動器上(通常桌面客戶端可以配置為將發送的消息保存在服務器上,但有時它們默認為本地硬盤驅動器)。

如果您使用 MailKit 的 SmtpClient 發送消息(或 System.Net.Mail 的 SmtpClient),那么該消息將不會保存在任何地方 - 因此它也不在您的 Sent 文件夾中。

當 SMTP 服務器收到要發送的郵件時,它不會將其復制到您的已發送文件夾中。 這必須使用 IMAP 來完成。

下面是我使用 MailKit 的方式。 msg替換為您想要回復的收件箱文件夾消息。


MessageSummaryItems pullSummaries = MessageSummaryItems.Envelope | MessageSummaryItems.Flags | MessageSummaryItems.InternalDate | MessageSummaryItems.Size | MessageSummaryItems.UniqueId | MessageSummaryItems.GMailLabels | MessageSummaryItems.BodyStructure;

//Open the sent mailbox
await ((ImapFolder)Client.GetFolder(SpecialFolder.Sent)).OpenAsync(FolderAccess.ReadOnly, CancelToken.Token);

//Query the message by the InReplyTo header
var replMsg = await SentFolder.SearchAsync(SearchQuery.HeaderContains("In-Reply-To", msg.Envelope.MessageId));
if (replMsg.Count() > 0)
{
   var replFetch = await SentFolder.FetchAsync(replMsg, pullSummaries);
   foreach (var sentItem in replFetch)
   {
      MimeMessage RepliedEmail = await SentFolder.GetMessageAsync(sentItem.Index);
      Console.WriteLine($"{RepliedEmail.Subject} from {string.Join(",", RepliedEmail.From.OfType<MailboxAddress>().Select(f => $"{f.Name} <{f.Address}>").ToArray())}");
      Console.WriteLine($"{RepliedEmail.GetTextBody(MimeKit.Text.TextFormat.Plain)}");
   }
                            
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM