PHPMailer 发送 base64 图像

Posted

技术标签:

【中文标题】PHPMailer 发送 base64 图像【英文标题】:PHPMailer send base64 image 【发布时间】:2014-10-07 11:47:23 【问题描述】:

我正在尝试通过 phpMailer 从 mysql 数据库中通过电子邮件发送图像。

目前我将图像从数据库中取出,base64_decode 它,然后将所有空格替换为加号:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfEAAAOzCAYAAACoPT8zAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP+lSURBVHhe7P3nc13ZdfaL6m+4X/ix69T9oKpzT5U+dp17zzn9+rUkKlOyZbUty2pn+vVrmbYluyV1juxAEgwIBAkSOedABAIgSIJEIgIzmNlJTcWmuiU1Fewz7vOMscZecy+sDQIgWi3qrNn11DNmWGFvovdvjrnWXvsj/8vX90imTJkyZcqU6f7R+Pi46iMf/UaLZMqUKVOmTJnuH73xxhuqj/yvjw5KpkyZMmXKlOn+0S9+8QvVR/4/jx2RTJkyZcqUKdP9o//6r/9SfeR/e/yoZMqUKVOmTJnuH3nJIJ4pU6ZMmTLdZ/KSQTxTpkyZMmW6z+Qlg3imTJkyZcp0n8lLBvFMmTJlypTpPpOXDOKZMmXKlCnTfSYvGcQzZcqUKVOm+0xeMohnypQpU6ZM95m8ZBDPlClTpkyZ7jN5WSXEb8mNaMP88ht568absjl1G5dv+wvpTO1fvf64/Xsy884dGT+U3r9SffLQj+TG+3pyWt5957bUVKWPT***D227G3Pp9XX...

然后我使用 PHPMailers AddStringAttachment:

$mail->AddStringAttachment($base64image, "Something Something.png", "base64", "image/png")

这发送正常(还有其他设置,但它们不相关)。但是,一旦我收到电子邮件,它就会说文件已损坏。有谁知道在 PHPMailer 中发送 base64 图像的正确例程?

编辑 1

我删除了对图像的所有修改,现在直接从数据库发送它。结果是:

ZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFmRUFBQU96Q0FZQUFBQ29QVDh6QUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBUCBsU1VSQlZIaGU3UDNuYzEzWmRmYUw2bSA0WC9peDY5VDlvS3B6VDVVIGRwMTd6em45IHJVa0tsT3laYlV0eTJwbiB2VnJtYllsdXlWMWp1eEFFZ3dJQkFrU09lZEFCQUlnU0lKRUlnSXptTmxKVGNXbXVpVTFGZXd6N3ZPTXNjWmVjeSBzRFFJZ1dpM3FyTm4xMURObVdHRnZvdmR2anJuV1h2c2ovOHZYOTBpbVRKa3laY3FVNmY3UiBQaTQ2aU1mL1VhTFpNcVVLVk9tVEpudUg3M3h4aHVxai95dmp3NUtwa3laTW1YS2xPbiAwUzkgOFF2VlIvNC9qeDJSVEpreVpjcVVLZFA5by8vNnIvOVNmZVIvZS95b1pNcVVLVk9tVEpudUgzbkpJSjRwVTZaTW1UTGRaL0tTUVR4VHBre***bVc2eiBRbGczaW1USmt5WmNwMG44bExCdkZNbVRKbHlwVHBQcE9YRE9LWk1tWEtsQ25UZlNZdkdjUXpaY3FVS1ZPbSAweGVNb2hueXBRcFU2Wk05NW04WkJEUGxDbFRwa3laN2pONVdTWEViOG1OYU1QODhodDU2OGFic2psMUc1ZHYgd3ZwVE8xZnZmNjQvWHN5ODg0ZEdUIFUzcjlTZmZMUWogVEcgM3B5V3Q1OTU3YlVWS1dQVFZQbkQyMjdHM1BwOVhYVHRndFNjIFVYOHU2dmJmOHM3NzczTSBudlBwVSBQbE9tVEpreS9WN0t5enBCM01xUHJpeW1iUE5CNmFyTUtIaC9JelAzQXZGdGI4cGlBT...

尝试打开时仍然会出错。

分辨率

$base = base64_decode($row['image']);
$resource = base64_decode(str_replace(" ", "+", substr($base, strpos($base, ","))));
$mail->addStringAttachment($resource, "Filename.png", "base64", "image/png");

原来我只进行了一次解码,而我需要进行 2 次才能获取二进制数据。感谢那些评论的人。

如果您附加的文件以前是数据 URI,例如直接从 javascript 作为字符串发布,您可能不需要双重解码:

$base = $_POST['image'];
$resource = base64_decode(str_replace(" ", "+", substr($base, strpos($base, ","))));
$mail->addStringAttachment($resource, "Filename.png");

【问题讨论】:

你在这里做什么?不要乱用图像文件。您可以附加原始图像并发送它。 PHPMailer 为您处理任何所需的编码。 我的图片周围的代码是:$resource = str_replace(" ", "+", base64_decode($row['image'])); 你为什么要这么做?从二进制数据中去除“空格”不会有好的结果。如果数据在 MySQL 中是 base-64 编码的,那么你做错了 - 你应该直接存储不编码的二进制文件。 @Synchro 我使用 Javascript FileReader.readAsDataURL(file) 通过 POST 请求上传数据,然后将其存储在一个 blob 中,然后将其拉出。 这对我有用:$img = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $baseImage)); 和你的$mail->AddStringAttachement($img, "Filename.png", "base64", "image/png"); 谢谢 【参考方案1】:

我现在碰巧遇到了这个问题。反正解决方法是,如果你check the source code of PHPMailer,已经明确说明,函数的第一个参数,是取文件的binary数据。

这意味着,要成功发送图像,如果您已经拥有文件的 base64_encoded 表示,您应该只做base64_decode 而不更改任何内容,然后将其传递进去。它应该可以工作。

您不需要替换长 base64 编码字符串中的任何字符串。 (当然,在没有data:image/png;base64, 标题文本的情况下对其进行解码)。

【讨论】:

可能需要字符串替换。这取决于您的存储和运输引擎。因此,现有系统需要 strreplace。 我明白了。我不确定为什么你会首先获得空间,可能是通过 http 传输的。无论如何,如果它是纯base64编码的,当然你不需要替换任何东西。但是,由于您的 base64 编码字符串在某种程度上已被更改,因此它不是纯字符串,因此您需要在发送之前将其恢复为原始值。 如果我没记错的话,它是作为 urlencoded base64 字符串发送的,因此 + 变成了空格。这是很久以前的事了。 我明白了。谢谢。遇到了同样的问题,因此找到了您的问题,并回答了它,因为我也解决了它:)

以上是关于PHPMailer 发送 base64 图像的主要内容,如果未能解决你的问题,请参考以下文章

PHP下利用PHPMailer

PHP中利用PHPMailer配合QQ邮箱实现发邮件

PHP中利用PHPMailer配合QQ邮箱实现发邮件

PHP中利用PHPMailer配合QQ邮箱实现发邮件

使用 JSON 从 Android 发送 Base64 图像到 php webservice,解码,保存到 SQL

F. PHP中利用PHPMailer配合QQ邮箱实现发邮件(最实用)