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-status
MimeEntity
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:
- L'adresse de type (doit généralement être
"rfc822"
)
- 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.
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
@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
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