2010-10-27 26 views
12

J'essaye de lire un email utilisant la gemme de courrier de ruby. Mais mail.body.decoded me renvoie non seulement le message du corps. Comment puis-je nettoyer ce corps du message et de supprimer le texte non désiré comme:Mail gem - comment nettoyer la chaîne de corps

-20cf30433c9a437cc304939017ef\nContent-Type: text/plain; charset=ISO-8859-1\nContent-

message = $stdin.read 
mail = Mail.read_from_string(message) 
puts mail.body.decoded 

--20cf30433c9a437cc304939017ef\nContent-Type: text/plain; charset=ISO-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n REAL BODY TEXT \\n\n--20cf30433c9a437cc304939017ef\nContent-Type: text/html; charset=ISO-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n<br clear=3D\"all\">--20cf30433c9a437cc304939017ef--

Comment puis-je nettoyer ce message corps e-mail extraire uniquement le texte du corps réel sans entête ?

Je crée un système de tickets simple basé sur Ruby on Rails, et un ticket est créé lorsqu'un email est reçu par [email protected] Mais lorsque le message est au format HTML, le texte du corps est entouré du texte HEADERs.

Répondre

8

Si vous avez un email correctement formaté, vous pouvez utiliser des méthodes d'aide Mail:

mail = Mail.new(email_string) 
mail.text_part # finds the first text/plain part 
mail.html_part # finds the first text/html part 

Cela ne signifie pas toujours travailler si vous avez par exemple messages en une seule partie (texte seulement) ou recevoir des courriels de l'Internet en général, car vous ne pouvez pas compter sur le formatage de chaque client là-bas. Croyez-moi, j'ai appris à la dure.

8

semble que vous avez un email multipart, vous pouvez utiliser mail.parts [0] .body.decoded Ces viendra probablement à portée de main aussi: mail.multipart?
mail.parts.length

La documentation de pierres précieuses à github est assez bonne

+0

Cest exactement ce que je cherchais! Merci beaucoup. – newx

0

Ajoutez la gem mail et utilisez le format de corps de l'e-mail avec mail.parts [1] .body.decoded.

0

Avec la gemme mail, vous pouvez le faire:

text = mail.multipart? ? mail.text_part.decoded : mail.body.decoded`