Отправка нескольких вложенных файлов с помощью Mailgun на Python

Пожалуйста, рассмотрите этот пример из документации Mailgun, расположенной здесь: http://documentation.mailgun.com/api-sending.html#examples

def send_complex_message():
return requests.post(
    "https://api.mailgun.net/v2/samples.mailgun.org/messages",
    auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
    files=MultiDict([("attachment", open("files/test.jpg")),
                     ("attachment", open("files/test.txt"))]),
    data={"from": "Excited User <[email protected]>",
          "to": "[email protected]",
          "cc": "[email protected]",
          "bcc": "[email protected]",
          "subject": "Hello",
          "text": "Testing some Mailgun awesomness!",
          "html": "<html>HTML version of the body</html>"})

Это не работает для меня. Когда письмо приходит, оно имеет только одно вложение. Я использую объект MultiDict в бутылке python. Я открыл только словарь файлов, чтобы изучить его следующим образом:

files=MultiDict([("attachment", ("file1.txt", "text file 1"),
                 ("attachment", ("file2.txt", "text file 2")])

Когда вы делаете files.values(), у него есть только одна запись «file2.txt». Это имеет смысл. Я вижу такое же поведение, если я также пытаюсь добавить () запись. если «Ключ» тот же (в данном случае «вложение»), он перезаписывает существующую запись.

Если я даю ему уникальные ключи, такие как вложение-1 и вложение-2, API принимает сообщение, однако почта доставляется без вложений.

Итак, я предполагаю, что мои вопросы:

1) Есть ли разница в объекте MultiDict в бутылке, которая вызывает сбой? Казалось бы, нельзя иметь несколько записей в словаре с одним и тем же ключом?

2) Есть ли что-то недокументированное, что я должен сделать, чтобы отправить несколько файлов в mailgun? или это невозможно сделать?


person fossfool    schedule 21.01.2014    source источник
comment
Вы работали с mailgun webapi для отправки вложений? Если вы можете помочь   -  person therealprashant    schedule 22.03.2016


Ответы (3)


На самом деле вы можете использовать список кортежей в параметре файла и устранить необходимость в Multidict. Вот как это будет выглядеть:

import requests

print requests.post("https://api.mailgun.net/v2/samples.mailgun.org/messages",
                    auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
                    files=[("attachment", open("files/test.jpg")),
                           ("attachment", open("files/test.txt"))],
                    data={"from": "Excited User <[email protected]>",
                          "to": "[email protected]",
                          "cc": "[email protected]",
                          "bcc": "[email protected]",
                          "subject": "Hello",
                          "text": "Testing some Mailgun awesomness!",
                          "html": "<html>HTML version of the body</html>"})

Отказ от ответственности: я работаю на Mailgun!

person Travis Swientek    schedule 22.01.2014
comment
Спасибо, Трэвис, лампочка погасла, когда ты сказал Список парочек. для всех остальных В то время как mailgun принимает MultiDict, он также принимает список кортежей для файлов. Вот как вы можете прикрепить несколько файлов. - person fossfool; 23.01.2014
comment
Возможно, есть способ назвать эти файлы в представлении? Я заметил, что после отправки они отображаются как «вложение». - person Stephn_R; 06.06.2014
comment
У меня тот же вопрос, что и у Stephn_R, как мне назвать эти файлы во время отправки? - person Colorado Techie; 15.10.2014
comment
@ColoradoTechie: согласно это сообщение, второй элемент кортежа файлов сам может быть кортежем: attachment: (FileName1.ext, open(FILE_PATH_1, 'rb'))` - person Paul Wolf; 06.08.2017
comment
Я использую тот же метод, но он говорит: кодек utf-8 не может декодировать байт 0x89 в позиции 0: неверный начальный байт из-за формата файлов после того, как я заключил их в open (file_path) - person abhinav1602; 01.04.2019
comment
это сработало для меня после изменения режима открытия. вот так: files=[(attachment, open(files/test.jpg, 'rb')), (attachment, open(files/test.txt, 'rb'))], - person abhinav1602; 01.04.2019

Я знаю, что на этот вопрос уже дан ответ, однако я решил опубликовать, как у меня это работает с несколькими вложениями.

Вот моя функция Python, параметр вложений — это список путей к файлам.

import requests


def send_complex_message(to, email_from, subject, html_body, attachments=None):
    '''
    to, email_from, subject, and html_body should be self explanatory.
    attachments is a list of file paths, like this:

    ['/tmp/tmp5paoks/image001.png','/tmp/tmp5paoks/test.txt']
    '''

    data={"from": email_from,
          "to": [to,""],
          "subject": subject,
          "html": html_body}

    files = None      
    if attachments:
        files = {}
        count=0
        for attachment in attachments:
            with open(attachment,'rb') as f:
                files['attachment['+str(count)+']'] = (os.path.basename(attachment), f.read())    
            count = count+1

    return requests.post("https://api.mailgun.net/v2/mydomain.com/messages",
        auth=(USER, PASSWORD),
        files=files,
        data=data)

Я знаю, что это немного многословно, однако это работает :-).

Я получил идею о том, как создать словарь файлов отсюда: https://gist.github.com/adamlj/8576660

Спасибо~!

person Colorado Techie    schedule 14.10.2014
comment
Пожалуйста, как вы используете httplib2 вместо запроса на отправку вложений с помощью Mailgun - person Isaac; 17.02.2017
comment
Я не мог заставить это работать как есть, но у меня сработало следующее: os.path.basename(attachment), f.read()))) Ключ для вложений должен быть "attachment". Назвать их «приложение-X» не сработало. - person dgundersen; 28.04.2017

Вы можете добавить несколько вложений и/или встроенных изображений с именами файлов следующим образом:

import requests

print requests.post("https://api.mailgun.net/v2/samples.mailgun.org/messages",
                    auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
                    files=[("attachment", ("test.pdf", open("files/test.pdf"))),
                           ("attachment", ("test.txt", open("files/test.txt"))),
                           ("inline", ("test.jpg", open("img/test.txt")))],
                    data={"from": "Excited User <[email protected]>",
                          "to": "[email protected]",
                          "cc": "[email protected]",
                          "bcc": "[email protected]",
                          "subject": "Hello",
                          "text": "Testing some Mailgun awesomness!",
                          "html": "<html>HTML version of the body with an image <img src=\"cid:test.jpg\"></html>"})

Надеюсь, это поможет всем вам.

person webpositive    schedule 02.03.2015