我正在使用MailKit Library从IMAP服务器获取消息。
我试图根据其主题获取电子邮件,但它只返回客户端消息的id而没有我的回复
var uidsX = client.Inbox.Search (SearchQuery.SubjectContains ("Message's Subject"));
我也试图硬编码我的消息id头的值后,从Gmail得到它,但我收到一个空列表!
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?
您正在自己的收件箱文件夹中搜索包含"Re: drinks?"最后找不到匹配对象?您还尝试使用message - id值在Inbox中搜索消息,但没有找到匹配项?
最有可能的是,这将不起作用,因为无论你用什么客户端发送回复很可能没有结束在收件箱,它可能结束在发送文件夹(或在本地发送文件夹位于你的硬盘驱动器)。
你提到你也试着搜索发送文件夹和仍然没有得到匹配,这表明我的消息不在那里。如果你使用桌面邮件客户端发送它,它可能在你的硬盘驱动器上(通常桌面客户端可以配置为将发送的消息保存在服务器上,但有时它们默认为本地硬盘驱动器)。
如果你使用了MailKit的SmtpClient来发送消息(或System.Net。邮件的SmtpClient),那么消息将不会保存在任何地方-因此它也不在您的发送文件夹中。
当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)}");
}
}