2017-02-09 1 views
0

J'ai commencé à utiliser @jstedfast Mimekit/Mailkit library, ce qui est génial, en fait, de tirer les non-livrables en utilisant sa ligne d'objet pour la recherche. J'ai essayé d'utiliser le message.to, message.resentto.obtenir l'adresse e-mail non livrable avec la bibliothèque mimekit/mailkit

comment puis-je obtenir cette information. Mon premier essai aujourd'hui. J'ai pu obtenir la liste et le corps mais j'ai juste besoin de l'email. J'ai essayé d'utiliser s22.imap mais il n'y a plus de support alors j'ai découvert ça. Je sais que vous êtes actif ici @jstedfast J'ai besoin de votre aide ... il n'y a pas d'onglet de discussion dans votre github.

Merci à l'avance

+0

Pourriez-vous préciser ce que vous essayez de faire exactement? Un message que vous avez essayé d'envoyer a-t-il échoué et maintenant vous essayez d'obtenir quelle adresse électronique a provoqué l'échec du serveur SMTP? Ou? – jstedfast

+0

@jstedfast Voici le scénario.J'enverrai l'email de masse alors quand il n'y a pas de livrable l'application est censée vérifier quels emails sont non livrables. J'ai été en mesure de tirer ces e-mails en utilisant la recherche par sujet. comment puis-je obtenir l'adresse e-mail de ces e-mails? Merci monsieur – CyberNinja

+0

ressemble à la seule façon d'obtenir c'est la recherche dans le corps. Y at-il un raccourci avec votre bibliothèque? comme recherche par sujet ?? Je me demandais juste .. merci – CyberNinja

Répondre

4

Si vous regardez la source de message brut, fait la valeur de quelque chose de correspondance d'en-tête Content-Type le long des lignes de multipart/report; report-type=delivery-status? Si tel est le cas, il est très probable que ce message comporte une sous-partie avec un en-tête Content-Type d'une valeur de message/delivery-status. Il devrait être la deuxième partie de l'enfant du multipart/report (la première partie devrait être une explication lisible par l'homme).

Si tel est le cas, vous pouvez convertir le message/delivery-statusMimeEntity en instance d'un MessageDeliveryStatus. Vous remarquerez que la classe MessageDeliveryStatus possède une propriété appelée StatusGroups qui est une liste de plusieurs collections d'en-têtes (par exemple, une liste d'objets HeaderList). Chaque HeaderList contient des informations sur un destinataire particulier qui a échoué. Je pense que ce que vous voulez faire est de regarder l'en-tête Final-Recipient qui contiendra 2 informations:

  1. L'adresse de type (doit généralement être "rfc822")
  2. La boîte aux lettres du destinataire (qui est ce que vous veulent)

Malheureusement, MimeKit n'a pas d'outils pour analyser l'en-tête Final-Recipient, mais il devrait être trivial pour localiser la fin du paramètre address-type de la valeur d'en-tête en utilisant IndexOf (';') et vous pouvez utiliser quelque chose comme MailboxAddress.TryParse() pour l'analyser (ou vous pourriez probablement juste Substring() la valeur sans analyse syntaxique).

Ainsi, la façon dont cela pourrait regarder dans le code est le suivant:

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(); 
} 

Pour plus d'informations sur message/delivery-status, voir https://tools.ietf.org/html/rfc3464

espoir qui aide.

+0

merci monsieur .. J'ai fini par .. en utilisant bodypart et sélectionnez le 2ème élément. car il a cette étiquette "destinataire final". – CyberNinja

0

ce que je l'ai fait

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 
      //} 

     } 

laissez-moi savoir s'il pourrait y avoir un problem..will je reçois le rfc822 si la boîte de réception du destinataire est pleine? il n'y a aucun moyen que je peux tester cela .. J'ai testé avec des e-mails avec un domaine inexistant, la boîte aux lettres n'existe pas..avec live.com, randomdomain.com, yahoo.com et gmail. gmail, par contre, ne renvoie pas de livrables.

+0

Je recommanderais d'utiliser quelque chose de plus proche de mon code ci-dessus à la place parce que ce sera moins sujette aux erreurs. Le texte "RFC822;" peut apparaître dans d'autres endroits du message dans certains cas. Tous les serveurs SMTP ne vous enverront pas de notification lorsque la livraison échoue. GMail, par exemple, ne le fait pas parce que c'est leur intention de subvertir les spammeurs qui essaient d'exploiter ce système pour découvrir des adresses e-mail par force brute. – jstedfast

+0

merci pour l'info. je prolly double filtre en utilisant final-recipeint puis le rfc822. im using office365.com – CyberNinja

+0

Pourquoi ne pas utiliser la classe MessageDeliveryStatus de MimeKit? C'est ce qu'il y a là-bas. Appeler 'ToString()' sur un 'MimeEntity' est cher et inutile. – jstedfast