我目前正在使用以下代码下载邮件,向其添加自定义标题,然后将该邮件添加回邮件文件夹:
using (ImapClient imap = new ImapClient())
{
imap.ServerCertificateValidationCallback = (s, c, h, e) => true;
imap.Connect(host, port, useSSL);
imap.Authenticate(user, password);
IMailFolder mailFolder = imap.GetFolder(folder);
mailFolder.Open(FolderAccess.ReadWrite);
if (mailFolder.Count > 0)
{
MimeMessage message = mailFolder.GetMessage(0);
var header = message.Headers.FirstOrDefault(h => h.Field == "X-SomeCustomHeader");
if (header == null)
{
message.Headers.Add("X-SomeCustomHeader", "SomeValue");
}
mailFolder.SetFlags(0, MessageFlags.Deleted, true);
mailFolder.Expunge();
UniqueId? newUid = mailFolder.Append(message);
mailFolder.Expunge();
var foundMails = mailFolder.Search(SearchQuery.HeaderContains("X-SomeCustomHeader", "SomeValue"));
if (foundMails.Count > 0)
{
var foundMail = mailFolder.GetMessage(new UniqueId(foundMails.First().Id));
Console.WriteLine(foundMail.Subject);
}
mailFolder.Close(true);
}
}
此代码的问题在于,如果我在文件夹中查看电子邮件的来源,则标题不存在且foundMails
的计数为零。
如果我查看message
它包含标题,那么如果我也message.WriteTo(somePath);
,那么标题也会出现。
我做错了什么?
如果我使用Outlook客户端,但是当在gmail上使用它时,此代码可以正常运行。
答案 0 :(得分:0)
问题是在gmail服务器上调用删除实际上并没有删除电子邮件。要解决此问题,请将电子邮件移至“废纸篓”文件夹,然后将其删除。以下帮助程序方法可让您了解如何完成此操作:
protected void DeleteMessage(ImapClient imap, IMailFolder mailFolder, UniqueId uniqueId)
{
if (_account.HostName.Equals("imap.gmail.com"))
{
IList<IMessageSummary> summaries = mailFolder.Fetch(new List<UniqueId>() { uniqueId }, MessageSummaryItems.GMailMessageId);
if (summaries.Count != 1)
{
throw new Exception("Failed to find the message in the mail folder.");
}
mailFolder.MoveTo(uniqueId, imap.GetFolder(SpecialFolder.Trash));
mailFolder.Close(true);
IMailFolder trashMailFolder = imap.GetFolder(SpecialFolder.Trash);
trashMailFolder.Open(FolderAccess.ReadWrite);
SearchQuery query = SearchQuery.GMailMessageId(summaries[0].GMailMessageId.Value);
IList<UniqueId> matches = trashMailFolder.Search(query);
trashMailFolder.AddFlags(matches, MessageFlags.Deleted, true);
trashMailFolder.Expunge(matches);
trashMailFolder.Close(true);
mailFolder.Open(FolderAccess.ReadWrite);
}
else
{
mailFolder.SetFlags(uniqueId, MessageFlags.Deleted, true);
mailFolder.Expunge();
}
}