0

我正在尝试使用 Mailgun API 发送带有附件的电子邮件。我可以使用 curl 轻松实现此目的:

curl -V -s --user 'XXX' \
    https://api.eu.mailgun.net/v3/XXX/messages \
    -F from='Excited User <YOU@YOUR_DOMAIN_NAME>' \
    -F to='XXXX' \
    -F subject='Hello' \
    -F text='Testing some Mailgun awesomness!' \
    --form-string html='<html>HTML version of the body</html>' \
    -F attachment=@files/example.csv

使用 python 的 requests 库也是如此。但是当我尝试使用 httpx 库做同样的事情时:

build_request_kwargs: dict = {
    "url": "/messages",
    "method": "POST",
    "data": {
        "template": "template_name",
        "from": from_,
        "to": to,
        "subject": subject,
        "h:X-Mailgun-Variables": json.dumps(template_data),
    },
    "files": [("file", ("file", io.BytesIO(b"<file content>")))]
}

client = httpx.AsyncClient(base_url=base_url, auth=("api", api_key))
async with client:
    request = client.build_request(**build_request_kwargs)
    response = await client.send(request)
    response.raise_for_status()

电子邮件已发送,但没有任何附件。我试图将每个文件编码设置为,application/octet-stream但它也不起作用。我不确定 curl 或 requestsmultipart/form-data请求和 httpx 之间有什么区别。

4

1 回答 1

0

我刚刚意识到我需要将每个文件作为“附件”表单名称发布。这个例子应该工作:

build_request_kwargs: dict = {
    "url": "/messages",
    "method": "POST",
    "data": {
        "template": "template_name",
        "from": from_,
        "to": to,
        "subject": subject,
        "h:X-Mailgun-Variables": json.dumps(template_data),
    },
    "files": [("attachment", ("file.txt", io.BytesIO(b"<file content>")))]
}

client = httpx.AsyncClient(base_url=base_url, auth=("api", api_key))
async with client:
    request = client.build_request(**build_request_kwargs)
    response = await client.send(request)
    response.raise_for_status()
于 2021-08-06T06:15:56.730 回答