5

python requests を使用してリクエストを投稿しています。添付パラメータにASCII以外の文字が含まれている場合は例外が発生し、ASCIIデータのみが存在する場合はすべて問題ありません。

ここで例外を確認できます

response = requests.post(url="https://api.mailgun.net/v2/%s/messages" % utils.config.mailDomain,
                auth=("api", utils.config.mailApiKey),
                data={
                        "from" : me,
                        "to" : recepients,
                        "subject" : subject,
                        "html" if html else "text" : message
                    },

                files= [('attachment', codecs.open(f.decode('utf8'))) for f in attachments] if attachments and len(attachments) else []                                
                )

編集: ファイル名をutf8でデコードした後、例外は発生しませんが、ファイルは添付されていません。名前にASCII文字のみを含むファイルを添付してリクエストをデバッグしました。リクエストヘッダーのリクエストビルドは次のとおりです。

{'Content-Type': None, 'Content-Location': None, 'Content-Disposition': u'form-data; name="attachment"; filename="Hello.docx"'}

これは成功し、添付ファイル付きのメールが届きます。

ただし、ヘブライ文字を含むファイルを使用する場合、リクエストのヘッダーは次のようになります。

{'Content-Type': None, 'Content-Location': None, 'Content-Disposition': 'form-data; name="attachment"; filename*=utf-8\'\'%D7%91%D7%93%D7%99%D7%A7%D7%94.doc'}

メールを受け取りましたが、ファイルが添付されていません。何か案は?

4

1 に答える 1

3

ファイル名に非 ASCII が含まれている場合、要求ライブラリは標準のRFC 2231に従ってファイルをエンコードします。フォーマットはご覧の通りです: filename*=utf-8''....... MailGun はこの標準をサポートしていないようです。その結果、ASCII 以外のファイル名が失われました。MailGun に連絡して、Unicode ファイル名に期待される形式を確認してください。

完全ではない回避策として、ASCII 以外の文字を次のように置き換えることができます。

def replace_non_ascii(x): return ''.join(i if ord(i) < 128 else '_' for i in x) 

また、リクエストを呼び出すときにファイル名を明示的に指定します (attachmentsユニコードベースのファイル名のリストであると仮定します):

files= [('attachment', (replace_non_ascii(f), codecs.open(f))) for f in attachments] ...

編集

ヘッダー形式をカスタマイズする場合は、(標準の RFC 2231 ではなく) MailGun がこの種の形式を受け入れることができると仮定しましょう。

filename="%D7%91%D7%93%D7%99%D7%A7%D7%94.doc"

次に、ファイル名を次のようにカスタマイズできます。

import urllib
def custom_filename(x): return urllib.quote(x.encode('utf8'))

files= [('attachment', (custom_filename(f), codecs.open(f))) for f in attachments] ...

MailGun の応答によっては、requests代わりに低レベル ライブラリ (urllib2) のコードを微調整するか使用する必要がある場合があります。うまくいけば、彼らはRFC 2231をサポートできます

于 2014-06-25T07:21:01.993 に答える