Problemer med koding i e-poster

stemmer
1

Jeg har en liten python script som trekker e-post fra en POP-postadresse og dumper dem inn i en fil (en fil en e-post)

Deretter et PHP-script går gjennom filene og viser dem.

Jeg har et problem med ISO-8859-1 (Latin-1) kodet epost

Her er et eksempel på teksten jeg får:???? = Iso-8859-1 Q G = EDsli_Karlsson = og Sj = E1um Hva = F0 = F3li er kl = E1r J

Måten jeg trekker e-post er denne koden.

pop = poplib.POP3(server)

mail_list = pop.list()[1]

for m in mail_list:
    mno, size = m.split()
    lines = pop.retr(mno)[1]

    file = StringIO.StringIO(\r\n.join(lines))
    msg = rfc822.Message(file)

    body = file.readlines()

    f = open(str(random.randint(1,100)) + .email, w)
    f.write(msg[From] + \n)
    f.write(msg[Subject] + \n)
    f.write(msg[Date] + \n)

    for b in body:
        f.write(b)

Jeg har prøvd sannsynligvis alle kombinasjoner av kode / dekode innenfor python og php.

Publisert på 23/12/2008 klokken 14:46
kilden bruker
På andre språk...                            


5 svar

stemmer
0

Det er MIME-innhold, og det er hvordan e faktisk ser ut, ikke en bug et sted. Du må bruke en MIME-dekoding bibliotek (eller dekode det selv manuelt) på PHP siden av ting (som, hvis jeg forstått riktig, er det en konstituert som e-post renderer).

I Python ville du bruke mimetools . I PHP, jeg er ikke sikker. Det synes Zend Framework har en MIME parser et sted, og det er sannsynligvis zillions av tekstbiter som flyter rundt.

http://en.wikipedia.org/wiki/MIME#Encoded-Word

Svarte 23/12/2008 kl. 14:50
kilden bruker

stemmer
1

Inntil ganske nylig var vanlig Latin-N eller utf-N ikke tillatt i overskrifter som betyr at de ville komme til å bli kodet av en fremgangsmåte beskrevet først i RFC-1522 , men det har blitt erstattet senere. Aksenter kodes enten i angitte skrivbart eller i Base64, og det er indikert ved? Q? (eller? B? for Base64). Du må dekode dem. Oh og plass er kodet som "_". Se Wikipedia .

Svarte 23/12/2008 kl. 14:53
kilden bruker

stemmer
3

Du kan bruke python epost biblioteket (python 2.5+) for å unngå disse problemene:

import email
import poplib
import random
from cStringIO import StringIO
from email.generator import Generator

pop = poplib.POP3(server)

mail_count = len(pop.list()[1])

for message_num in xrange(mail_count):
    message = "\r\n".join(pop.retr(message_num)[1])
    message = email.message_from_string(message)

    out_file = StringIO()
    message_gen = Generator(out_file, mangle_from_=False, maxheaderlen=60)
    message_gen.flatten(message)
    message_text = out_file.getvalue()

    filename = "%s.email" % random.randint(1,100)
    email_file = open(filename, "w")
    email_file.write(message_text)
    email_file.close()

Denne koden vil få alle meldinger fra serveren din og gjøre dem om til Python Meldingsobjekter deretter flate dem ut i strenger igjen for å skrive til filen. Ved hjelp av e-pakken fra Python standard bibliotek MIME koding og dekoding saker skal håndteres for deg.

Disclaimer: Jeg har ikke testet denne koden, men det skal fungere helt fint.

Svarte 24/12/2008 kl. 01:39
kilden bruker

stemmer
2

Det er den MIME-koding av overskrifter, RFC 2047 . Her er hvordan å dekode det i Python:

import email.Header
import sys

header_and_encoding = email.Header.decode_header(sys.stdin.readline())
for part in header_and_encoding:
    if part[1] is None:
        print part[0],
    else:
        upart = (part[0]).decode(part[1])
        print upart.encode('latin-1'),
print

Mer detaljerte forklaringer (på fransk) i http://www.bortzmeyer.org/decoder-en-tetes-courrier.html

Svarte 24/12/2008 kl. 06:44
kilden bruker

stemmer
2

Det er en bedre måte å gjøre dette på, men dette er hva jeg endte opp med. Takk for hjelp folkens.

import poplib, quopri
import random, md5
import sys, rfc822, StringIO
import email
from email.Generator import Generator

user = "email@example.com"
password = "password"
server = "mail.example.com"

# connects
try:
    pop = poplib.POP3(server)
except:
    print "Error connecting to server"
    sys.exit(-1)

# user auth
try:
    print pop.user(user)
    print pop.pass_(password)
except:
    print "Authentication error"
    sys.exit(-2)

# gets the mail list
mail_list = pop.list()[1]

for m in mail_list:
    mno, size = m.split()
    message = "\r\n".join(pop.retr(mno)[1])
    message = email.message_from_string(message)

    # uses the email flatten
    out_file = StringIO.StringIO()
    message_gen = Generator(out_file, mangle_from_=False, maxheaderlen=60)
    message_gen.flatten(message)
    message_text = out_file.getvalue()

    # fixes mime encoding issues (for display within html)
    clean_text = quopri.decodestring(message_text)

    msg = email.message_from_string(clean_text)

    # finds the last body (when in mime multipart, html is the last one)
    for part in msg.walk():
        if part.get_content_type():
            body = part.get_payload(decode=True)

    filename = "%s.email" % random.randint(1,100)

    email_file = open(filename, "w")

    email_file.write(msg["From"] + "\n")
    email_file.write(msg["Return-Path"] + "\n")
    email_file.write(msg["Subject"] + "\n")
    email_file.write(msg["Date"] + "\n")
    email_file.write(body)

    email_file.close()

pop.quit()
sys.exit()
Svarte 29/12/2008 kl. 10:18
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more