phpmailer 自动包含本地图片

Posted

技术标签:

【中文标题】phpmailer 自动包含本地图片【英文标题】:phpmailer auto include local images 【发布时间】:2013-11-28 21:40:07 【问题描述】:

我目前正忙于使用 phpmailer,想知道如何使用脚本在我的电子邮件中自动嵌入本地图像。我的想法是上传一个 html 文件和一个包含图像的文件夹,然后让脚本将 <img src 标签替换为 cid 标签。

现在我得到的是:

$mail = new PHPMailer(true);
$mail->IsSendmail();
$mail->IsHTML(true);

try 

    $mail->SetFrom($from);
    $mail->AddAddress($to);
    $mail->Subject = $subject;

    $mail->Body = embed_images($message, $mail);
    $mail->Send();

现在我有了这个不完整的函数,它可以扫描 html 正文并替换 src 标签:

function embed_images(&$body, $mailer)

    // get all img tags
    preg_match_all('/<img.*?>/', $body, $matches);
    if (!isset($matches[0])) return;

    $i = 1;
    foreach ($matches[0] as $img)
    
        // make cid
        $id = 'img'.($i++);
        // now ?????
    
    $mailer->AddEmbeddedImage('i guess something with the src here');
    $body = str_replace($img, '<img  src="cid:'.$id.'" style="border: none;" />', $body);

我不确定我应该在这里做什么,你检索 src 并用 cid:$id 替换它吗? 因为它们是本地图像,所以我没有网络 src 链接或其他任何东西的麻烦......

【问题讨论】:

【参考方案1】:

为什么不直接将图片嵌入到 base64 的 HTML 中?

您只需将图像转换为 base64,然后像这样包含它们:

<img src="data:image/jpg;base64,---base64_data---" />
<img src="data:image/png;base64,---base64_data---" />

我不知道这是否与您的情况相关,但我希望它有所帮助。

【讨论】:

我不知道 phpmailer 是否知道如何处理这些东西。当我只是发送带有正文的邮件(提供 mime 类型)时,它不会显示为图片。这就是我选择 phpmailer 的原因 最新版 Gmail 不支持 data:images 这样的。我个人喜欢它,但使用 AddEmbeddedImage 可能会更好【参考方案2】:

你的方法是对的

function embed_images(&$body,$mailer)
    // get all img tags
    preg_match_all('/<img[^>]*src="([^"]*)"/i', $body, $matches);
    if (!isset($matches[0])) return;

    foreach ($matches[0] as $index=>$img)
    
        // make cid
        $id = 'img'.$index;
        $src = $matches[1][$index];
        // now ?????
        $mailer->AddEmbeddedImage($src,$id);
        //this replace might be improved 
        //as it could potentially replace stuff you dont want to replace
        $body = str_replace($src,'cid:'.$id, $body);
    

【讨论】:

【参考方案3】:
function embed_images(&$body, $mailer) 
    // get all img tags
    preg_match_all('/<img[^>]*src="([^"]*)"/i', $body, $matches);

    if (!isset($matches[0]))
        return;

    foreach ($matches[0] as $index => $img) 
        $src = $matches[1][$index];

        if (preg_match("/\.jpg/", $src)) 
            $dataType = "image/jpg";
         elseif (preg_match("/\.png/", $src)) 
            $dataType = "image/jpg";
         elseif (preg_match("/\.gif/", $src)) 
            $dataType = "image/gif";
         else 
            // use the oldfashion way
            $id = 'img' . $index;            
            $mailer->AddEmbeddedImage($src, $id);
            $body = str_replace($src, 'cid:' . $id, $body);
        

        if($dataType)  
            $urlContent = file_get_contents($src);            
            $body = str_replace($src, 'data:'. $dataType .';base64,' . base64_encode($urlContent), $body);
        
    

【讨论】:

以上是关于phpmailer 自动包含本地图片的主要内容,如果未能解决你的问题,请参考以下文章

数据本地缓存(不包含图片缓存)

数据本地缓存(不包含图片缓存)

自动上传本地图片和word图片(word图片需使用从word粘贴功能)

网络爬虫(爬取网站图片,自动保存本地)

Hexo博客:四、本地图片

Springboot读取本地图片并显示