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 图像的主要内容,如果未能解决你的问题,请参考以下文章