2011-07-06 10 views
5

following zawiedzie:Python3: Wysłać wiadomość e-mail zawierającą dane binarne?

>>> a = email.message.Message() 
>>> a.set_payload(b'some data') 
>>> a.as_string() 
TypeError: string payload expected: <class 'bytes'> 

zawiedzie również za pomocą generatora jawnie, i nazywając flatten. Treść komunikatu jest konwertowana na kod ASCII, mimo to stosowane są transporty, a następnie ostatecznie konwertowane na bajty, więc dlaczego nie można ustawić ładunku bajtów?

Co zrobić, aby uzyskać najlepiej nie-MIME wiadomość z bajtowym ładunkiem, który zaakceptuje smtplib.SMTP.send_message?

+1

Prawdopodobnie będziesz musiał zakodować go na łańcuchu. Nie wiem, co jest dostępne w Pythonie, ale zazwyczaj będzie w Base-64. –

+1

Bez względu na to, jak to zrobisz, jeśli możesz to zrobić, poczta nie-ASCII, nie-MIME będzie miała problemy po stronie odbierającej i prawdopodobnie w pośrednich programach do przesyłania poczty. Gdzie "kłopot" oznacza "trudny do interpretacji" lub "odrzucony" lub "odrzucony". – msw

+1

@msw - Śmierć agentom pocztowym, którzy są nadal tylko ASCII! :) – mac

Odpowiedz

2

Pamiętaj: w języku Python 3 ciągi znaków są wszystkie unikod. Skutecznie podajesz obiektowi Python bajty, a następnie mówisz, że chcesz ciąg znaków Unicode, ale nie mówisz, które kodowanie użyć do konwersji obiektu bajtów na ciąg znaków.

Co trzeba zrobić, to zapewnić kodowanie jako drugi parametr na wezwanie set_payload(), tak:

test = email.message.Message() 
test.set_payload(b'some example_data', 'latin1') # use latin-1 for no-op translation 
test.as_string() 

'MIME-Version: 1.0\nContent-Type: text/plain; charset="latin1"\nContent-Transfer-Encoding: base64\n\nc29tZSBleGFtcGxlIGRhdGE=\n' 

To nie daje komunikat typu MIME - miejmy nadzieję, że będzie pracować dla Ciebie.

+0

Czy możesz wyjaśnić swój wybór Latin1? –

+0

latin1 i unicode są takie same dla pierwszych 256 znaków, więc bajty nie zostaną zmienione podczas procesu "dekodowania". –