2014-09-04 21 views
5

Napisałem prosty skrypt w języku Python, który wykorzystywał MIMEMultipart i SMTPLib do wysyłania wiadomości do tablicy odbiorców. Kod wygląda mniej więcej tak:Python mail umieszcza niezaszeregowane miejsce w temacie wiadomości Outlooka

import smtplib 
import sys 

from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 

sender='[email protected]' 
recipients='[email protected]' 
subject='A pretty long subject line which looks like this' 
mail_server='microsfot_exchange_server_ip' 
msg = MIMEMultipart('alternative') 
body='Body of the Email' 
msg['Subject'] = subject 
msg['from'] = sender 
msg['to'] = ", ".join(recipients) 
s = smtplib.SMTP(mail_server) 
s.sendmail(sender, recipients, msg.as_string()) 
s.quit() 

Ten wysyła wiadomość pomyślnie, ale temat jak klient poczty Outlook wygląda mniej więcej tak:

A pretty long subject line which looks  like this 
+0

Byłoby pomocne, gdyby można było dołączyć odpowiednie nagłówki wiadomości utworzonej przez Python (wyjście z 'msg.as_string()') i wiadomości e-mail odebranych przez klienta (Outlook). –

+0

Również: z której wersji Pythona korzystasz? –

+0

Oto jak to wygląda w nagłówkach: 'Temat: A dość długi wiersz tematu, który wygląda \t jak this' używam Python 2.7 – screwgoth

Odpowiedz

6

Wygląda na to, że uderzyłeś Issue #1974:

Długie nagłówki e-mail powinny być zawijane. Ten proces nazywa się "składaniem nagłówków" i jest opisany w RFC822. Jednak RFC822 wydaje się być nieco niejednoznaczny, jak dokładnie powinno się składać nagłówek.

Python w wersjach wcześniejszych niż 2.7/3.1 zrobił to w sposób, który spowodował wysłanie, które opisałeś dla niektórych klientów pocztowych (przy użyciu tabulatora \t jako znaku kontynuacji).

W naszym raporcie nastąpiło workaround zasugerował: Dokonaj temacie obiektu nagłówek tak:

from email.header import Header 

# ... 

msg['Subject'] = Header(subject) 

Właśnie weryfikowanym to, i to rzeczywiście nie używać spacji zamiast zakładek jako znaki uzupełniające, który powinien rozwiązać twój problem.

+2

+1. Na marginesie: RFC2822 (który zastępuje RFC822) opisuje jednoznacznie składanie i rozwijanie nagłówków. –

+0

Wielkie dzięki @ lukas-graf. "Nagłówek" rozwiązał mój problem – screwgoth

+0

Innym możliwym obejściem byłoby kodowanie nagłówka przez RFC2047. – tripleee

2

linii przedmiotem jest dłuższy niż 78 chars, i jest dzielony przez .as_string(). Pierwsze kilka znaków znajduje się na linii tematu, a pozostałe znaki są na jednej lub kilku liniach kontynuacji.

Gdy program Outlook rekonstruuje oryginalny wiersz tematu, robi to niepoprawnie.

Można spróbować tego uniknąć poprzez unikanie linii kontynuacja tak:

from StringIO import StringIO 
from email.generator import Generator 
def my_as_string(msg): 
    fp = StringIO() 
    g = Generator(fp, mangle_from_=False, maxheaderlen=0) 
    g.flatten(msg) 
    return fp.getvalue() 

... 

s.sendmail(sender, recipients, my_as_string(msg)) 

Referencje:

+0

screwgoth: Zostawię moją odpowiedź w przypadku, gdy ma wartość dla potomnych . Ale powinieneś preferować odpowiedź Lukasa. –

+0

Tak. Twoje rozwiązanie prawdopodobnie też by działało. Ale myślę, że jest to trochę runda. Doceniam jednak wprowadzenie mnie do klasy "Generator". – screwgoth

Powiązane problemy