2017-03-29 21 views
2

現在、Pythonスクリプトからデータベース(名前+電子メールアドレス)から取得した受信者のセットに電子メールを送信しようとしています。その名前がメッセージヘッダーにも含まれるようにメールを送信します。 受信者または送信者の名前でPythonからウムラウトを使用して電子メールを送信

UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 5: ordinal not in range(128) 

しかし、メッセージの内容で

すべてのウムラウトが正しくために交換されています。名前はウムラウト(AOU ...)私のスクリプトがで失敗が含まれている場合でも、(場合に名前内部üがあります)例: üの場合は =C3=BCです。ここ

私は使用例のコードである:

import smtplib 
from email.message import EmailMessage 
from email.headerregistry import Address 
from email.utils import make_msgid 

msg = EmailMessage() 
msg["Subject"] = "Python Test" 
msg["From"] = Address("Max Müller" , addr_spec="[email protected]") 
msg["To"] = Address("Max Möller", ddr_spec="[email protected]") 

msg.set_content("""\ 
This is a test with umlauts. öäü 
--- Max Müller """) 
server = smtplib.SMTP('localhost', 25) 
server.send_message(msg) 
server.quit() 

Iは、Python 3.5.2でそれを試してみました。

送信者は、ほとんどの電子メールクライアントに無用であるb'Max M\xc3\xbcller'に名前を付けるように私は私のメールクライアントになった

msg["From"] = Address("Max Müller".encode("utf-8") , addr_spec="[email protected]") 

によって

msg["From"] = Address("Max Müller" , addr_spec="[email protected]") 

を交換する場合。

どのように受信者のウムラウトを取得し、送信者はメールのコンテンツのようにエンコードされますか?

答えて

1

ほとんどすべて問題ありませんでしたが、send_messageメソッドは実際にはアスキーではないわけではないので、良い古いsendmailを使用する必要があります。問題はsend_messageToFromヘッダーの内容を使用してエンベロープアドレスを作成しようとしていますが、名前部分にあってもASCII以外の文字が含まれているアドレスでは残念です。

あなたはONL 1つの受信者のアドレスを持っているのであれば、あなたのコードは、単に次のようになります。

... 
server.sendmail(msg["From"], msg["To"], msg.as_string()) 

あなたが複数の受信者addresseを処理できるようにしたい場合は、明示的な処理を追加する必要があります。

def enveloppeAddr(header): 
    return [a.addr_spec for a in header.addresses] 

sendmailコマンドは次のようになります。

server.sendmail(msg["From"], enveloppeAddr(msg["To"]), msg.as_string()) 

良い新しいが、それがためにも動作することです単一のdestアドレス...

+0

msg ["To"] 'が複数のアドレスのタプルである場合、これは機能しません。しかし、私はmsg ["To"] 'タプルを反復したくありません。 'send_message'メカニズムを使うと、これはうまくいきます。 –

+1

@ M.K.akaGrisu:そうです、これは複数のアドレスでは機能しませんでした。私の編集を参照してください。 –

関連する問題