Вы, по сути, вызываете MimePart.ToString()
... и, насколько MimeKit знает, вы хотите MIME в виде строки.
Но это не то, что вы на самом деле хотите.
То, что вы хотите, это фактический текстовый контент.
Вот что вам нужно сделать в цикле:
var html = (TextPart) inbox.GetBodyPart (message.UniqueId, message.HtmlBody);
Mail mail = new Mail();
mail.Date = DateTime.Now;
mail.Note = html.Text;
...
A TextPart
- это подкласс MimePart
, который представляет text/*
MIME-части (включая text/html
) и имеет несколько удобных API, которые можно использовать для получения (или установки) текстового содержимого MimePart
в виде строки вместо того, чтобы иметь дело с потоками - в первую очередь это свойство .Text
.
Это должно ответить на ваш вопрос, но я еще не закончил, потому что ваш код может использовать еще несколько изменений.
Вместо того, чтобы просить MailKit Fetch()
метаданные для каждого отдельного сообщения в вашем почтовом ящике, почему бы не запросить только то, что вам нужно?
Поскольку вам явно не безразличны уже просмотренные сообщения, вы можете воспользоваться функциональностью ПОИСКА IMAP, например:
var uids = inbox.Search (SearchQuery.NotSeen);
if (uids.Count > 0)
{
var messages = inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.Flags | MessageSummaryItems.BodyStructure);
foreach (var message in messages.Where (c => !c.Flags.Value.HasFlag (MessageFlags.Seen))
{
// ...
}
}
Примечание. Вам по-прежнему необходимо использовать фильтр Where()
, поскольку возможно изменение флагов сообщений (другим клиентом) между Search()
и Fetch()
. Я также изменил MessageSummaryItems
на только поля, которые вы фактически используете.
Вы также можете избавиться от своего оператора if (messages.Where(c => c.Flags.Value.HasFlag(MessageFlags.Seen) != true).Count() > 0)
, поскольку он является избыточным и требует полного прохода для возвращаемых данных, когда в следующий раз вы все равно будете зацикливать данные.
А поскольку вы break;
вышли из цикла, как только вы нашли самое первое сообщение, которое еще не было замечено, почему бы не сделать это вместо этого?
var message = messages.FirstOrDefault (x => !x.Flags.Value.HasFlag (MessageFlags.Seen));
if (message != null)
{
var html = (TextPart) inbox.GetBodyPart(message.UniqueId, message.HtmlBody);
Mail mail = new Mail();
mail.Date = DateTime.Now;
mail.Note = html.Text;
mail.Tema = message.Envelope.Subject;
mail.Email = Convert.ToString(message.Envelope.Date);
_context.Add(mail);
await _context.SaveChangesAsync();
}
Конечный результат:
using (var client = new ImapClient())
{
var Emails = _context.Settings.FirstOrDefault();
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(Emails.Imap,Convert.ToInt32(Emails.ImapPort), true);
client.Authenticate(Emails.Login, Emails.Password);
client.Inbox.Open(FolderAccess.ReadOnly);
var inbox = client.Inbox;
var uids = inbox.Search (SearchQuery.NotSeen);
if (uids.Count > 0)
{
var messages = inbox.Fetch (uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.Flags | MessageSummaryItems.BodyStructure);
var message = messages.FirstOrDefault (x => !x.Flags.Value.HasFlag (MessageFlags.Seen));
if (message != null)
{
var html = (TextPart) inbox.GetBodyPart(message.UniqueId, message.HtmlBody);
Mail mail = new Mail();
mail.Date = DateTime.Now;
mail.Note = html.Text;
mail.Tema = message.Envelope.Subject;
mail.Email = Convert.ToString(message.Envelope.Date);
_context.Add(mail);
await _context.SaveChangesAsync();
}
}
client.Disconnect(true);
}
Последнее изменение, которое вам нужно внести в приведенный выше код, - это то, что делать, если в сообщении нет тела HTML. Что, если сообщение имеет только тело text/plain
? Или что, если он вообще не содержит каких-либо text/*
частей?
Вам нужно будет выяснить, что вы хотите сделать, когда это произойдет ...