2017-02-09 3 views
0

Я начал использовать @jstedfast Mimekit/Mailkit library, что, кстати, здорово тянет undeliverables, используя строку темы для поиска. Я попытался использовать message.to, message.resentto.получить недостижимый адрес электронной почты в библиотеке mimekit/mailkit

как получить эту информацию. Моя первая попытка сегодня. Я смог получить список и тело, но мне просто нужен адрес электронной почты. Я попытался использовать s22.imap, но больше нет поддержки, и я обнаружил это. Я знаю, что вы здесь активны. @jstedfast. Мне нужно, чтобы вы помогли. В вашем github нет вкладки для обсуждения.

Заранее спасибо

+0

Не могли бы вы подробно рассказать о том, что вы пытаетесь сделать? Не удалось отправить сообщение, которое вы пытались отправить, и теперь вы пытаетесь получить, какой адрес электронной почты вызвал сбой SMTP-сервера? Или? – jstedfast

+0

@jstedfast Вот сценарий.Я отправлю массовое электронное письмо, а затем, когда недопустимо, приложение должно проверить, какие электронные письма являются неподходящими. Я смог вытащить эти письма с помощью тематического поиска. как получить адрес электронной почты этих писем? спасибо, сэр – CyberNinja

+0

выглядит как единственный способ получить это поиск в теле. есть ярлык с вашей библиотекой.? как поиск по теме ?? просто интересно .. спасибо – CyberNinja

ответ

4

Если посмотреть на сырье источника сообщения, делает значение Content-Type заголовка матча что-то вдоль линий multipart/report; report-type=delivery-status? Если это так, очень вероятно, что это сообщение будет иметь подчасти с заголовком Content-Type со значением message/delivery-status. Это должно быть быть второй дочерней частью multipart/report (первая часть должна быть понятным для человека объяснением).

Если это так, вы можете нанести message/delivery-statusMimeEntity на экземпляр MessageDeliveryStatus. Вы заметите, что класс MessageDeliveryStatus имеет свойство StatusGroups, которое представляет собой список нескольких коллекций заголовков (например, список объектов HeaderList).

Каждый HeaderList содержит информацию о конкретном получателе, который не прошел. Я думаю, что вы хотите сделать, это посмотреть на Final-Recipient заголовок, который будет содержать 2 порции информации:

  1. Адресное типа (как правило, должны быть "rfc822")
  2. почтовый ящик получателя (который является то, что вы хочу)

к сожалению, 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

Надежда, что помогает.

+0

спасибо, сэр .. Я закончил ... используя bodypart и выберите второй элемент. поскольку он имеет тег «конечный получатель». – CyberNinja

0

это то, что я сделал

foreach (var uid in inbox.Search(query)) 
     { 
      var message = inbox.GetMessage(uid); 
      // Console.WriteLine("Subject: {0}", message.Subject); 
      //Console.WriteLine("Subject: {0}", message.Headers); 
      // Console.WriteLine("Subject: {0}", message.BodyParts); 
      var text = message.BodyParts; 
      string src = text.ElementAt(1).ToString(); 
      int srcStart = src.IndexOf("RFC822;",0); << i used final-recipient intially 
      int srcEnd = src.IndexOf("Action", 0); 
      Console.WriteLine("Email:" + src.Substring(srcStart + 8, srcEnd - (srcStart + 8))); 
      Console.WriteLine(src); 


      //foreach (var part in message.BodyParts) 
      //{ 
      // Console.WriteLine(part); 
      // // do something 
      //} 

     } 

дайте мне знать, если может быть problem..will я получаю rfc822, если почтовый ящик получателя заполнен? я не могу проверить это. Я протестировал с помощью электронной почты с несуществующим доменом, почтовый ящик не существует .. с live.com, randomdomain.com, yahoo.com и gmail. gmail, с другой стороны, не возвращает никаких недоставок.

+0

Я бы рекомендовал использовать что-то более близкое к моему коду выше, потому что оно будет менее подверженным ошибкам. Текст «RFC822»; могут появляться в других местах сообщения в некоторых случаях. Не все SMTP-серверы отправят вам уведомление при сбое доставки. GMail, например, не потому, что это их намерение подорвать спамеры, пытающиеся использовать эту систему для обнаружения адресов электронной почты с помощью грубой силы. – jstedfast

+0

благодарит за информацию. я буду умножать двойной фильтр, используя final-recipeint, а затем rfc822. im using office365.com – CyberNinja

+0

Почему бы не использовать класс MessageDeliveryStatus от MimeKit? Вот для чего это. Вызов 'ToString()' на 'MimeEntity' является дорогостоящим и ненужным. – jstedfast

Смежные вопросы