2015-06-24 13 views
7

Sto provando a scrivere uno script python per inviare un messaggio di posta elettronica che utilizza la formattazione html e comporta molti spazi non interrotti. Tuttavia, quando l'eseguo, alcuni dei & stringhe nbsp sono interrotte da spazi che si verificano ogni 171 caratteri, come si può vedere da questo esempio:La posta Python inserisce spazio ogni 171 caratteri

#!/usr/bin/env python 
import smtplib 
import socket 
from email.mime.text import MIMEText 

emails = ["[email protected]"] 
sender = "[email protected]{0}".format(socket.gethostname()) 

message = "<html><head></head><body>" 
for i in range(20): 
     message += "&nbsp;" * 50 
     message += "<br/>" 
message += "</body>" 
message = MIMEText(message, "html") 
message["Subject"] = "Test" 
message["From"] = sender 
message["To"] = ", ".join(emails) 
mailer = smtplib.SMTP("localhost") 
mailer.sendmail(sender, emails, message.as_string()) 
mailer.quit() 

L'esempio dovrebbe produrre un'email vuota che si compone di soli spazi , ma si finisce per guardare qualcosa di simile:

  &nbsp ;          


         &nb sp;      


            & nbsp;   






      &nbs p;         


          &n bsp;   

Edit: Nel caso in cui è importante, sto facendo funzionare Ubuntu 15.04 con Postfix per il client SMTP, e l'utilizzo di python2.6.

risposta

5

Posso replicarlo in un modo ma le interruzioni di riga vengono ogni 999 caratteri. La RFC 821 dice che la lunghezza massima di una linea è di 1000 caratteri, inclusa l'interruzione di riga, quindi probabilmente è questo il motivo.

Questo post fornisce un modo diverso per inviare una email html in python e credo che il tipo mime "multipart/alternative" sia il modo corretto. Sending HTML email using Python

+3

Questo era il problema, quindi è banale aggiungere un \ n dopo ogni
per far sparire questo problema. –

+0

Ma il \ n appare nell'email (almeno come renderizzata in Outlook). Come si può inserire l'interruzione di riga senza che venga vista dal destinatario come \ n? – user3450049

2

Sono lo sviluppatore di yagmail, un pacchetto che tenta di semplificare l'invio di e-mail.

È possibile utilizzare il seguente codice:

import yagmail 
yag = yagmail.SMTP('[email protected]', 'mypassword') 

for i in range(20): 
    message += "&nbsp;" * 50 
    message += "<br/>" 

yag.send(contents = message) 

Si noti che per impostazione predefinita è inviare un messaggio HTML, e che aggiunge anche automaticamente la parte alternativo per i browser non HTML.

Inoltre, si noti che l'omissione dello subject lascerà un oggetto vuoto e senza un argomento to lo invierà a se stesso.

Inoltre, si noti che se si imposta yagmail correttamente, si può semplicemente effettuare il login usando yag.SMTP(), senza dover avere il nome utente & la password nello script (pur essendo sicuro). Omettendo la password verrà richiesto un getpass.

Aggiunta di un allegato è semplice come punta a un file locale, ad es .:

yag.send(contents = [message, 'previously a lot of whitespace', '/local/path/file.zip'] 

impressionante no? Grazie per avermi permesso di mostrare un buon caso d'uso per yagmail :)

Se hai richieste di funzionalità, problemi o idee, fammi sapere allo github.

+0

Questo pacchetto sembra ottimo, ma sfortunatamente non riesco a inserire alcuna dipendenza esterna per il mio script. Grazie comunque. –

+0

@Programman Peccato. Spero che una volta avrai l'opportunità di utilizzarlo :) – PascalVKooten