9

Requestsライブラリを使用するPythonアプリから、MailgunAPIを使用して複数のインラインメッセージを送信する方法を理解するのに問題があります。現在、私は(HerokuでホストされているWebフレームワークとしてテンプレートとフラスコにjinja2を使用しています):

def EmailFunction(UserEmail):
    Sender = 'testing@test.co.uk'
    Subject = 'Hello World'
    Text = ''
    name = re.sub('@.*','',UserEmail)
    html = render_template('GenericEmail.html', name=name)
    images = []
    imageloc = os.path.join(dirname, 'static')
    images.append(open(os.path.join(imageloc,'img1.jpg')))
    images.append(open(os.path.join(imageloc,'img2.jpg')))
    send_mail(UserEmail,Sender,Subject,Text,html,images)
    return html

def send_mail(to_address, from_address, subject, plaintext, html, images):
    r = requests.\
        post("https://api.mailgun.net/v2/%s/messages" % app.config['MAILGUN_DOMAIN'],
            auth=("api", app.config['MAILGUN_KEY']),
             data={
                 "from": from_address,
                 "to": to_address,
                 "subject": subject,
                 "text": plaintext,
                 "html": html,
                 "inline": images
             }
         )
    return r

したがって、電子メールは正常に送信されますが、最後に画像が電子メールに含まれていません。クリックしてダウンロードしても表示されません。画像は、mailgun APIに従ってHTMLで参照されます(もちろん簡略化されています)。

<img src="cid:img1.jpg"/>
<img src="cid:img2.jpg"/>
etc ...

明らかに私は何か間違ったことをしていますが、requests.filesオブジェクトを使用してこれらを添付しようとしましたが、メールも送信されず、エラーも発生しなかったため、これはまったく正しい方法ではないと思います。

悲しいことに、これに関するドキュメントはかなりまばらです。

HTMLがサーバー側の画像を直接指すようにする方がよいでしょうか?ただし、サーバー側のイメージは一般に静的ではないため、これは理想的ではありません(静的なものもあれば、そうでないものもあります)。

4

2 に答える 2

18

インライン画像の送信については、こちらをご覧ください。

HTMLでは、次のように画像を参照します。

<html>Inline image here: <img src="cid:test.jpg"></html>

次に、Multidictを定義して、ファイルをAPIに投稿します。

files=MultiDict([("inline", open("files/test.jpg"))])

開示、私はMailgunで働いています。:)

于 2013-03-08T20:29:32.907 に答える
6

2020年現在、実際のドキュメントは次のとおりです:https ://documentation.mailgun.com/en/latest/api-sending.html#examples

私の例:

response = requests.post(
    'https://api.mailgun.net/v3/' + YOUR_MAILGUN_DOMAIN_NAME + '/messages',
    auth=('api', YOUR_MAILGUN_API_KEY),
    files=[
        ('inline[0]', ('test1.png', open('path/filename1.png', mode='rb').read())),
        ('inline[1]', ('test2.png', open('path/filename2.png', mode='rb').read()))
    ],
    data={
        'from': 'YOUR_NAME <' + 'mailgun@' + YOUR_MAILGUN_DOMAIN_NAME + '>',
        'to': [adresat],
        'bcc': [bcc_adresat],
        'subject': 'email subject',
        'text': 'email simple text',
        'html': '''<html><body>
            <img src="cid:test1.png">
            <img src="cid:test2.png">
            </body></html>'''
    },
    timeout=5  # sec
)
于 2020-06-23T16:03:51.407 に答える