当前位置: 首页 > 知识库问答 >
问题:

如何使用带有Mailgun的python httplib2发送电子邮件附件

百里景山
2023-03-14

我正在使用httplib2和Mailgun API发送我使用Google Drive下载的电子邮件附件,该电子邮件正在发送,但没有附件。。下面是我的代码。。

DRIVE = discovery.build('drive', 'v3', http=http_auth)

        request = DRIVE.files().export_media(fileId=file_id, mimeType='application/pdf')

        fh = io.BytesIO()
        downloader = MediaIoBaseDownload(fh, request)

        done = False
        while done is False:
            status, done = downloader.next_chunk()
            logging.info("Download %d%%." % int(status.progress() * 100))

        messages = {
            "from": sender,
            "to": recipient,
            "subject": 'Attachment Mail from Mailgun',
            "text": 'Testing',
            "attachment": fh.getvalue()
        }

         url = URL

        data = {
            "from": messages['from'],
            "to": messages['to'],
            "subject": messages['subject'],
            "text": messages['text'],
            "attachment": messages['attachment']
        }

        pl = urllib.urlencode(data)

        http = httplib2.Http()
        http.add_credentials('api', API)

        resp, content = http.request(
            url, 'POST', pl,
            headers={"Content-Type": "application/x-www-form-urlencoded"})

共有3个答案

马庆
2023-03-14

不过现在已经晚了。。。我很久以前就解决了这个问题。。下面是我所做的:

import io
import base64
from google.appengine.api import urlfetch
from libs.poster.encode import multipart_encode, MultipartParam

from oauth2client.appengine import AppAssertionCredentials
from googleapiclient.http import MediaIoBaseDownload
from apiclient.discovery import build
from httplib2 import Http

request = drive.files().export_media(fileId=spreadsheet_id, mimeType='application/pdf')

        fh = io.BytesIO()
        downloader = MediaIoBaseDownload(fh, request)

        done = False
        while done is False:
            status, done = downloader.next_chunk()

        message = {
            'from': 'noreply',
            'to': 'recipient',
            'subject': mail_subject,
            'text': text,
            'filename': filename,
            'attachment': fh.getvalue()
        }

        # send email using mailgun
        resp = send_attachment_email(message)


# Compose an email with an attachment
def send_attachment_email(messages):

url = 'mailgun_api_url'
api = 'api-key'

load = {
    "from": messages['from'],
    "to": messages['to'],
    "subject": messages['subject'],
    "text": messages['text'],
    "attachment": MultipartParam(
        "attachment",
        filename=messages['filename'],
        filetype='application/pdf',
        value=messages['attachment'])
}

payload, hd = multipart_encode(load)

hd['Authorization'] = 'Basic %s' % (base64.b64encode(api),)

resp = urlfetch.fetch(url=url, payload="".join(payload), method='POST',
                      headers=hd, validate_certificate=True)
logging.info(resp.status_code)
logging.info(resp.content)

return resp.status_code
谷梁子濯
2023-03-14

defsend_mailgun(to, subject, html, file,file_name, cc, bcc):

邮筒https://api.mailgun.net/v3/DOMAIN/messages'MAILGUN_KEY='KEY-secret'

data={"subject": subject,"from":"FROM_EMAIL","to": to,"html": html}

如果抄送=“”:数据[“cc”]=cc

如果是密件抄送=“”:数据[“密件抄送”]=密件抄送

如果文件名和文件名=“”:resp=请求。post(MAILGUN_URL,auth=(“api”,MAILGUN_键),files=[(“附件”,“文件名,文件))],data=data)else:resp=requests。post(MAILGUN\u URL,auth=(“api”,MAILGUN\u键),data=data)

张兴旺
2023-03-14

我们使用的军邮API发送电子邮件使用AppEngine和读取从云存储,相同的原则将适用于谷歌驱动器

我建议的第一件事是调查StringIO。它允许您以比BytesIO更简单的方式模拟使用appengine沙箱中的文件,但两者都会生成python所称的支持文件对象。read()所以这两种方法都可以。

一旦您将文件作为类似于文件的对象,您只需将其正确地传递给API即可。下面的示例使用requests库,因为它非常容易使用文件发布,并且与appengine兼容。

请注意,在本例中,open(FILE_PATH_1,'rb')是一个类文件对象,您只需将其替换为文件对象:

def send_complex_message():
    return requests.post("https://api.mailgun.net/v2/DOMAIN/messages",
          auth=("api", "key-SECRET"),
          files={
              "attachment[0]": ("FileName1.ext", open(FILE_PATH_1, 'rb')),
              "attachment[1]": ("FileName2.ext", open(FILE_PATH_2, 'rb'))
          },
          data={"from": "FROM_EMAIL",
                "to": [TO_EMAIL],
                "subject": SUBJECT,
                "html": HTML_CONTENT
          })

 类似资料:
  • 我正在将Mailgun集成到我的iOS应用程序中,并尝试发送带有附件的电子邮件。电子邮件已发送,但附件似乎已被忽略。有什么想法吗?代码如下。我使用的是AFNetworking 2,我没有使用本机的Mailgun Objective-C SDK,因为它似乎没有得到维护。 我可以使用curl发送附件,例如:

  • 我无法正确发送带有附件的电子邮件。我正在使用Gradle和Spring 5。一切都设置正确,因为我已经发送了文本和html电子邮件。过了一段时间,我发送给客户的文本要求超过了电子邮件的限制,所以我需要将纯文本提取到CSV文件中,并将其作为附件发送到电子邮件中。看起来我只得到了所附文件的一部分,而不是完整的文件? 代码: 电子邮件正文无法正确发送。这是我在电子邮件收件箱中收到的原始邮件: 主题:报表

  • 问题内容: 如何使用Outlook 2010发送带有附件的电子邮件(本地文件或Intranet中的文件)? 似乎不起作用。 问题答案: 不,这根本不可能。协议中对此没有规定,如果可能的话,这将是一个巨大的安全漏洞。 发送文件但让客户端发送我能想到的电子邮件的最佳方法是: 让用户选择一个文件 将文件上传到服务器 上传后让服务器返回随机文件名 在消息正文中建立一个包含上载文件的URL 的链接

  • 问题内容: 我似乎找不到我编写的应该发送带有附件的电子邮件的php函数的问题。我已经为此苦苦挣扎了一段时间了。 编辑 问题是邮件的消息与文件混合在一起并作为附件发送。 问题答案: Artefacto让我更加关注输出,并且找到了解决方法:

  • 问题内容: 我正在尝试在带有附件的codeigniter上发送电子邮件。 我总是成功收到电子邮件。但是,我从未收到带有附件的文件。以下是代码,非常感谢所有评论。 问题答案: $ this- >电子邮件-> attach() 使您可以发送附件。将文件路径/名称放在第一个参数中。注意:使用文件路径,而不是URL。对于多个附件,请多次使用该功能。例如:

  • 有人能告诉我使用phpMailer发送带有附件的电子邮件的步骤吗?我已经准备好了发送电子邮件本身的所有代码,它工作正常,但我不明白如何发送附件。我有表单,如果我从POST上的文件输入中获得值,它只会给我文件名而不是完整路径。我认为为了添加附件,我需要获取文件的完整路径,对吗?我不必将文件存储在服务器上,只需通过电子邮件发送即可。