PHPMailer使用msgHTML嵌入本地绝对路径图片的解决方法
PHPMailer 本地绝对路径图片内嵌问题处理
问题描述
我找不到PHPMailer的官方文档,因此自行摸索相关功能。我原本认为调用msgHTML方法时,PHPMailer会自动将邮件内容中的图片转换为内嵌图片,但不知道如何引入本地绝对路径的图片,例如C:\Temp\Test.jpg。
直接编写<img src="C:\Temp\Test.jpg">无法生效,也不清楚$mail->msgHTML($body, ?????, ????的参数该如何填写,因为我不想将图片拷贝到wwwroot目录下。
问题原因
我查阅PHPMailer源码后发现,它不允许传入空的basedir参数,对应源码逻辑如下:
if ( //Only process relative URLs if a basedir is provided (i.e. no absolute local paths) !empty($basedir)
该段逻辑说明仅当提供basedir时才处理相对URL,不支持直接传入本地绝对路径。
解决方案
该问题可通过三种方式解决:
- 将所有图片放到同一目录
- 修改PHPMailer源码
- 自行使用
AddEmbeddedImage方法实现
我采用的自定义实现代码如下:
preg_match_all('~<img.*?src=.([/.a-z0-9:_-]+).*?>~si',$html,$matches); $paths = array(); foreach ($matches[1] as $img) { $img_old = $img; if(strpos($img, "https://") == false) { $content_id = md5($img); $html = str_replace($img_old,'cid:'.$content_id,$html); $pos = strrpos($img, '/'); $name = substr($img, $pos+1); $mail->AddEmbeddedImage($img, $content_id, $name); } } $mail->msgHTML($html); $mail->send();
内容的提问来源于stack exchange,提问作者Georgio
相关产品推荐
相关产品推荐

