2016-10-18 3 views
1

TLSでpython 3.5.2 smtplibを使用してバイナリの添付ファイルを送信しようとしています。私のプラットフォームはOSXで、私は自作ソフトからインストールされたPythonを使用しています。python 3 smtplib:gnupgがアクティブなとき、バイナリの添付ファイルがフラスコ内で正しくエンコードされない

添付ファイルを受け取ったとき、エンコードが混乱しているようです。

5c75 6463 6666 5c75 6463 6438 5c75 6463 6666 5c75 6463 6530 0010 4a46 4946 0001 

i.e., \udcff\udcd8\udcff\udce0^@^PJFIF 

これはかなりある失敗した最小限の場合、次のとおりです。

ffd8 ffe0 0010 4a46 4946 0001 0100 0001 

i.e., <FF><D8><FF><E0>^@^PJFIF^@^A^A 

受け取ったとして、私の添付ファイルの開始Hexはいくつかの奇妙なbase64で残り物を持っています代わりにこの六角で始まる元のファイルの

import gnupg 
gpg = gnupg.GPG('/path/to/gpg') 

import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.image import MIMEImage 

def send_my_email(): 
    msg = MIMEMultipart() 
    msg['Subject'] = 'subject' 
    msg['From'] = '[email protected]' 
    msg['To'] = '[email protected]' 
    with open('/tmp/image.jpg', mode='rb') as image_file: 
     image = MIMEImage(image_file.read()) 
    msg.attach(image) 
    s = smtplib.SMTP('smtp.gmail.com', 587) 
    s.starttls() 
    s.login('[email protected]', 'password') 
    s.send_message(msg) 
    s.quit() 
:まさにTLSロジック とGnuPGのの追加を除いて、公式ドキュメントであり、多くの3210は、ここで別の質問に基づいて、私の代わりに send_message()のこれを試してみましたが、それも失敗しました:

s.sendmail('[email protected]', ['[email protected]'], msg.as_string()) 

を私はまた、明示的に、私はMIMEImageを初期化するとき、_subtype='jpg'を追加Content-Transfer-Encodingヘッダを付加し、Content-Dispositionヘッダとなしを追加しようとしています違いを生みだしたようだ。

他のクライアントからbase64でエンコードされた添付ファイルを受け取ったときにメールクライアントに問題がないことを確認しました。

smtplibソースを見て、smtplibが行区切り文字を処理する方法がちょっと変わっていることに気付きました。これがおそらく関連しているかどうか疑問に思っています。 (参照:https://bugs.python.org/issue14645

私は別のものをエンコードする必要がありますか、自分のプラットフォームに特別なものを設定する必要がありますか、これは不具合ですか?ありがとう!


アップデート:この問題は、私はフラスコを実行しているときに存在するとフラスコの外で発生しません。私はFlask環境内で問題を分離しようとしています。私はそれがフラスコのメールかもしれないと思ったが、それを取り除いても問題は解決しなかった。以下のコードは私のシステム上でFlaskから実行すると失敗しますが、同じ仮想環境と同じPythonバイナリからシェルスクリプトから実行すると失敗します。私は複雑さのためにこの時点で何の答えも期待していませんが、後者のためにこれを開いたままにしておきます。

更新2:私はhttps://github.com/isislovecruft/python-gnupg/からgnupgライブラリとのやり取りにこの問題を絞り込んだ。私はこれを反映するために私の最小限の例を更新しました。 codecs.register_error('strict', codecs.replace_errors)

+1

ファイルはPythonの文字列(ユニコード)に読み込まれていると、UTF-8、その文字列を符号化した後に連載されているように見えます。私はMIMEImageにいくつかの助けが必要だと思っていますが、私はemail.mimeコードを3.xで使っていないので、問題を直接指摘することはできません。 – cco

+0

ああ、ファイルを読むときに何か別のことをする必要があるかどうかがわかります。ありがとう! – mirth23

+0

'app.open_resource()'を 'open()'に変換した後、あなたのプログラムは完璧に動作します。問題を示す短い**完全な**プログラムを提供できますか?詳細は[mcve]を参照してください。 –

答えて

1

これは、gnupgとsmtplib + MIMEの間の悪い対話のために発生しました。これはpython-gnupugのpythonコーデックの猿パッチです。 gnupgはcodecs.register_error('strict', codecs.replace_errors)を呼び出します。これは、他のパッケージによって実行されるエンコードを妨げます。

REF:https://github.com/isislovecruft/python-gnupg/issues/49

関連する問題