Если посмотреть на сырье источника сообщения, делает значение Content-Type
заголовка матча что-то вдоль линий multipart/report; report-type=delivery-status
? Если это так, очень вероятно, что это сообщение будет иметь подчасти с заголовком Content-Type
со значением message/delivery-status
. Это должно быть быть второй дочерней частью multipart/report
(первая часть должна быть понятным для человека объяснением).
Если это так, вы можете нанести message/delivery-status
MimeEntity
на экземпляр MessageDeliveryStatus
. Вы заметите, что класс MessageDeliveryStatus
имеет свойство StatusGroups
, которое представляет собой список нескольких коллекций заголовков (например, список объектов HeaderList
).
Каждый HeaderList
содержит информацию о конкретном получателе, который не прошел. Я думаю, что вы хотите сделать, это посмотреть на Final-Recipient
заголовок, который будет содержать 2 порции информации:
- Адресное типа (как правило, должны быть
"rfc822"
)
- почтовый ящик получателя (который является то, что вы хочу)
к сожалению, MimeKit не имеет каких-либо инструментов для разбора заголовка Final-Recipient
, но это должно быть тривиальной, чтобы найти конец параметра address-type
в значении заголовка, используя IndexOf (';')
, а затем вы можете использовать что-то вроде MailboxAddress.TryParse()
, чтобы разобрать его (или вы могли бы просто Substring()
значение без разбора).
Итак, путь это может выглядеть в коде это:
string[] GetUndeliverableAddresses (MimeMessage message)
{
var report = message.Body as MultipartReport;
if (report == null)
throw new ArgumentException ("This is not a multipart/report!");
MessageDeliveryStatus status = null;
for (int i = 0; i < report.Count; i++) {
status = report[i] as MessageDeliveryStatus;
if (status != null)
break;
}
if (status == null)
throw new ArgumentException ("Did not contain a message/delivery-status!");
var undeliverables = new List<string>();
for (int i = 0; i < status.StatusGroups.Count; i++) {
var recipient = status.StatusGroups[i]["Final-Recipient"];
int semicolon = recipient.IndexOf (';');
var undeliverable = recipient.Substring (semicolon + 1).Trim();
undeliverables.Add (undeliverable);
}
return undeliverables.ToArray();
}
Для получения дополнительной информации о message/delivery-status
см https://tools.ietf.org/html/rfc3464
Надежда, что помогает.
Не могли бы вы подробно рассказать о том, что вы пытаетесь сделать? Не удалось отправить сообщение, которое вы пытались отправить, и теперь вы пытаетесь получить, какой адрес электронной почты вызвал сбой SMTP-сервера? Или? – jstedfast
@jstedfast Вот сценарий.Я отправлю массовое электронное письмо, а затем, когда недопустимо, приложение должно проверить, какие электронные письма являются неподходящими. Я смог вытащить эти письма с помощью тематического поиска. как получить адрес электронной почты этих писем? спасибо, сэр – CyberNinja
выглядит как единственный способ получить это поиск в теле. есть ярлык с вашей библиотекой.? как поиск по теме ?? просто интересно .. спасибо – CyberNinja