因此,在PHPmailer中,如果使用addStringEmbeddedImage,则可以将64base编码图像添加到邮件正文中;在数据部分中,您可以添加64位编码图像。例如:
$mail->addStringEmbeddedImage(base64_decode($str), "img_".$i, "img_".$i,"base64",$type);
我以base64格式从文本编辑器中获取图像,然后用相应的容器替换图像
<img src=\"cid:img_".$i."\" ".$height. " " .$width. ">"
它工作正常,但出于某种原因,一旦我添加一个图像不止一次,无论是下一个图像还是第一个和最后一个图像,邮件只会保存(?)第一张图片。不是它没有显示它,因为在原始邮件中你可以看到它中只指定了一个容器。
--boundary
Content-Type: image/png; name="img_1"
Content-Transfer-Encoding: base64
Content-ID: <img_1>
Content-Disposition: inline; filename="img_1"
正如你所看到的,每个图像都有不同的id(这是它们在电子邮件中的顺序),它唯一能告诉它的是同一图像是由解码的base64图像所以我真的不知道为什么这个只有当它的图像相同时才会发生。我可以添加img1 ---- img2 ---- img1 ---- img3它会显示img1 ---- img2 ---- | emptycontainer | ---- img3
编辑:所以作为参考,这是我用来提取所有图像的时间
//$body of the mail, all the images i want to replace have that alt"" at the start
while(strstr($body, "<img alt")){
$i++;
$start= strpos($body, "<img alt");
$end= strpos($body,">",$start);
$str = substr($body,$start,$end-$start);
$height = "";
$width = "";
if (strstr($str, "height:")){
$ini = strpos($str, "height:")+7;
$fin = strpos($str,";",$ini);
$height = "height= \"".substr($str,$ini,$fin-$ini-2)."\"";
}
if (strstr($str, "width:")){
$ini = strpos($str, "width:")+6;
$fin = strpos($str,"\"",$ini);
$width = "width= \"".substr($str,$ini,$fin-$ini-2)."\"";
}
//here i replace the whole image with a container
$body= substr_replace($body, "<img src=\"cid:img_".$i."\" ".$height. " " .$width. ">", $start,$end-$start+1);
//get the type after data:
$start= strpos($str, "data:");
$end= strpos($str,";",$start);
$type= substr($str, $start+5, $end-$start-5);
//and this is where i get the base64 string
$start= strpos($str, "base64,");
$end= strpos($str,"\"",$start);
$str = substr($str, $start+7, $end-$start-7);
$mail->addStringEmbeddedImage(base64_decode($str), "img_".$i, "img_".$i,"base64",$type);
}
感谢您的帮助和感谢阅读
答案 0 :(得分:0)
我可以看到为什么你会在消息中使用多个相同的图像,但为什么你会多次连接同一个图像来实现呢? cid
值的重点在于它们允许您从多个位置引用相同的图像,因此如果您在页眉和页脚中都有徽标图像,则可以将其附加一次并从中引用两个地方,减少邮件大小。我怀疑你的问题是你正在尝试解决这个问题并通过附加两个cid值的相同图像数据而失败,但PHPMailer注意到数据是相同的而没有做第二个附件,让你的第二个cid指向什么。您可以通过对两个图像标记使用相同的cid值来修复它。
这应该有你提到的问题:
$img = base64_decode($str);
$mail->addStringEmbeddedImage($img, "img_1", "img_1", "base64", $type);
$mail->addStringEmbeddedImage($img, "img_2", "img_2", "base64", $type);
<img src="cid:img_1">
<img src="cid:img_2">
这应该有效:
$img = base64_decode($str);
$mail->addStringEmbeddedImage($img, "img_1", "img_1", "base64", $type);
<img src="cid:img_1">
<img src="cid:img_1">
代码计算内容的SHA256哈希,并使用它来检查它们是否相同。