2010-09-08 7 views
1

Je récupère du texte brut (y compris l'en-tête et le message) d'un serveur POP. Je dois capturer tout après l'en-tête qui se termine par une ligne vide entre lui et le message de l'utilisateur.Modèle Regex pour extraire des données de messagerie électronique

En même temps je veux ignorer n'importe quoi des messages originaux si c'est une réponse. Le début d'une réponse pour les courriels que je suis parsing départ avec

------Original Message------ 

Un email exemple pourrait ressembler à ceci

Return-Path: ...
...
Plus Email Métadonnées: ...

Bonjour à partir de terres regex, je suis heureux d'avoir des nouvelles de vous.
------ ------ Original Message
Metadata: ...
...

Hey mec regex, tu peux me aider? Merci!

Cordialement, Me.

J'ai besoin d'extraire "Bonjour de la terre regex, je suis heureux d'avoir de vos nouvelles." et tout autre texte/lignes avant le message original.

J'utilise cette regex maintenant (C# en mode multiligne) et il semble fonctionner sauf qu'il capture ------ Original Message ------ si le corps est vide. Je préfère avoir une chaîne vide à la place.

^\s*$\n(.*)(\n------Original Message------)? 

Modifier
Je n'ai pas voté vers le bas tout le monde et si vous arrivez à downvote, il est généralement utile d'inclure des commentaires.

Répondre

0

Pourquoi n'utilisez-vous pas DotnetOpenMail? Utiliser une regex pour faire cela est une mauvaise approche, vous feriez mieux d'utiliser un gestionnaire de messagerie dédié à la place ....

+0

J'utilise un client POP3 que je disais à utiliser et au lieu de récupérer des messages sous forme d'objets (comme je le ferais Je préfère), je ne peux récupérer que du texte brut pour chaque message. Sinon, ce ne serait pas un problème. – jlafay

+0

Euhhh ... cela n'a pas vraiment de sens d'utiliser regex pour ça ... quel client pop3 utilises-ce client pop3 devrait s'occuper de la gestion du corps du message etc ... sinon regex ne serait pas nécessaire!! – t0mm13b

+0

Merci d'avoir essayé d'aider tommie. Mettons-le dans cette perspective alors. J'ai le code du client de messagerie PO3 et je l'étend pour instancier un objet MailMessage pour chaque message récupéré du serveur POP. Maintenant, j'écris des méthodes pour extraire des parties du texte brut pour hydrater les propriétés de l'objet. – jlafay

0

La raison en est que vous avez un \n supplémentaire dans la parenthèse. Si le corps est vide, il n'y a pas de retour à la ligne supplémentaire. Par conséquent, essayez ceci:

^\s*$\r\n(.*)(^------Original Message------$)? 

Si vous ne voulez pas que la nouvelle ligne à la fin du corps, vous pouvez toujours utiliser string.Trim() de la part adaptée.

Remarque: Cela suppose que l'entrée utilise les terminaisons de ligne \r\n (ce qui est obligatoire dans les en-têtes de messagerie selon la norme MIME).

+0

Cela produit les mêmes résultats. – jlafay

+0

@jlafay: Oui, désolé. Il devrait être '\ r \ n' au lieu de simplement' \ n'. Mise à jour de la réponse – Timwi

-1

Vous devez remplacer (\n------Original Message------) avec (?=(\n------Original Message------)) Lookahead ne pas retourner cette partie, juste pour vous assurer qu'il est là

+0

C'est mieux. Le problème est qu'il ne tient pas compte des courriels qui ne contiennent pas de «message original». Beaucoup plus près cependant, merci. – jlafay

+0

Quels sont les autres terminateurs autres que 'original message'? –

+0

Je veux juste qu'il arrête de capturer avant la ligne de message d'origine. Tous les emails n'auront pas cette ligne, la plupart d'entre eux le font. Donc, si cette ligne n'existe pas, c'est un nouvel email et non une réponse. Je veux que tout cela soit capturé. – jlafay

Questions connexes