通过 Mailgun API 作为 MIME 发送,没有 Mailgun 库

Sending via Mailgun API as MIME, without Mailgun library

我正在使用 PHPMailer 将电子邮件构建为 MIME 字符串,我想通过 Mailgun API 发送它,使用 curl 连接到 /v3/[mydomain]/messages.mime端点。

Mailgun documentation 表示 MIME 字符串必须作为 message 参数发送,并且您必须使用 multipart/form-data 将其作为文件上传发送。

libcurl documentation表示如果给CURLOPT_POSTFIELDS选项一个数组,Content-type会被设置为multipart/form-data.

我试过这个:

curl_setopt($ch, CURLOPT_POSTFIELDS, ["message" => $mimeData]);

但是 Mailgun API 回答如下:

{ "message": "'message' parameter is not a file" }

我设法通过首先创建一个临时文件让它工作:

$mimeFile = tmpfile();
fwrite($mimeFile, $mimeData);

并将其传递给 CURLFile:

$mime = new \CURLFile(stream_get_meta_data($mimeFile)['uri']);

在此之后,我收到一条新的错误消息,'to' parameter is missing,所以我最终不得不从 PHPMailer 获取收件人地址(它们已经在 MIME 字符串中,但 API 没有'我似乎没有意识到):

curl_setopt($ch, CURLOPT_POSTFIELDS, [
    "to" => implode(", ", array_keys($this->getAllRecipientAddresses())),
    "message" => $mime
]);