2015-06-24 39 views
7

Próbuję napisać skrypt Pythona, aby wysłać wiadomość e-mail, która korzysta z formatowania html i zawiera wiele nie łamania spacji. Jednak, kiedy go uruchomić, niektóre & nbsp ciągi są przerywane przez przestrzenie, które pojawia się co 171 znaków, jak widać na tym przykładzie:Python mail wstawia przestrzeń co 171 znaków

#!/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() 

Przykład powinien produkować pusty e-mail, który składa się tylko z przestrzeni , ale kończy się wyglądać mniej więcej tak:

  &nbsp ;          


         &nb sp;      


            & nbsp;   






      &nbs p;         


          &n bsp;   

Edit: W przypadku, ważne jest, używam Ubuntu 15.04 z Postfix dla klienta sMTP, a przy użyciu python2.6.

Odpowiedz

5

Mogę replikować to w pewien sposób, ale moje kreski pojawiają się co 999 znaków. RFC 821 mówi, że maksymalna długość linii wynosi 1000 znaków łącznie z podziałem wiersza, więc pewnie dlatego.

Ten post daje inny sposób wysyłania wiadomości e-mail w języku html w python, i wierzę, że typ mime "multipart/alternative" jest poprawny. Sending HTML email using Python

+3

To był problem, więc łatwo jest dodać \ n po każdym
, aby ten problem zniknął. –

+0

Ale \ n pojawia się w wiadomości e-mail (co najmniej tak jak w Outlooku). Jak wstawić podział wiersza, aby odbiorca nie zobaczył go jako \ n? – user3450049

2

Jestem twórcą pakietu yagmail, który próbuje ułatwić wysyłanie wiadomości e-mail.

można użyć następującego kodu:

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

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

yag.send(contents = message) 

Należy pamiętać, że domyślnie będzie wysyłać wiadomości w formacie HTML, a także dodaje automatycznie alternatywną część dla przeglądarek innych niż HTML.

Należy również zauważyć, że pomijanie obiektu subject spowoduje pozostawienie pustego obiektu i bez argumentu to wyśle ​​go samodzielnie.

Co więcej, jeśli ustawisz poprawnie swój adres e-mail, możesz po prostu zalogować się, używając yag.SMTP(), bez konieczności posiadania w skrypcie nazwy użytkownika & (przy zachowaniu bezpieczeństwa). Pominięcie hasła spowoduje wyświetlenie komunikatu getpass.

Dodawanie przywiązanie jest tak proste, jak wskazuje lokalnego pliku, np .:

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

Niesamowite prawda? Dziękuję za umożliwienie mi pokazania ładnego etui do użycia dla yagmaila :)

Jeśli masz jakieś propozycje nowych funkcji, problemy lub pomysły, daj mi znać pod numerem github.

+0

Ten pakiet wygląda świetnie, ale niestety nie mogę pobrać żadnych zewnętrznych zależności dla mojego skryptu. Dzięki i tak. –

+0

@Programman To szkoda. Mam nadzieję, że kiedyś będziesz miał okazję go wykorzystać :) – PascalVKooten