You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP Mailer发送带嵌入Logo的邮件失败求助

解决PHPMailer与PHP mail函数嵌入图片不显示的问题

我来帮你搞定这个内嵌Logo不显示的问题!不管是用PHPMailer还是原生PHP mail函数,直接在邮件内容里写图片路径肯定不行——邮件是独立于你的服务器的,得把图片作为内嵌附件,再通过CID(Content-ID)关联到HTML内容里,客户端才能正确加载显示。

一、PHPMailer 解决方案

PHPMailer已经封装好了内嵌图片的方法,比原生函数简单太多,按下面步骤改就行:

  1. 首先确保开启HTML模式(这是基础,不然HTML标签和图片都不生效)
  2. 用addEmbeddedImage()方法添加内嵌图片,指定唯一的CID
  3. 在邮件Body的<img>标签里用cid:你的CID引用图片

修改后的代码示例:

// 假设你已经完成PHPMailer的初始化(服务器配置、发件人设置等)
$mail->isHTML(true); // 必须开启HTML模式,否则图片和HTML都不生效
$mail->Subject = "面试通知";
$mail->setFrom('your-hr-email@company.com', 'HR Team');
$mail->addAddress('applicant@example.com'); // 应聘者邮箱

// 添加内嵌Logo:参数依次是「服务器上的图片绝对路径」「自定义CID」「图片文件名」
$mail->addEmbeddedImage('/var/www/html/company-logo.png', 'company_logo_cid', 'logo.png');

// 构建邮件内容,用cid引用内嵌图片
$mail->Body = "Dear Mr/Mrs. $appname<br><br>
CONGRATULATIONS!<br><br>
We are very interested by your previous experiences. We will hold an interview with you next Tuesday at 10 a.m<br><br>
<img src='cid:company_logo_cid' alt='Company Logo' style='width:150px;'><br><br>
Best regards,<br>
HR Team";

// 最后发送邮件
if(!$mail->send()) {
    echo '发送失败: ' . $mail->ErrorInfo;
} else {
    echo '邮件发送成功';
}

注意:图片路径一定要用服务器上的绝对路径,确保PHP有读取该文件的权限;CID可以随便命名,但要保证在邮件里唯一。

二、原生PHP mail函数解决方案

原生mail函数需要手动构建MIME多部分邮件结构,稍微麻烦点,但原理和PHPMailer一样——通过CID关联HTML和内嵌图片:

$to = 'applicant@example.com';
$subject = '面试通知';
$appname = 'Panji Pratama'; // 假设变量已赋值

// 生成唯一的MIME边界字符串,用来分隔邮件的不同部分
$boundary = md5(uniqid(time()));

// 邮件头:指定多部分关联类型
$headers = "From: HR Team <your-hr-email@company.com>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/related; boundary=\"$boundary\"\r\n\r\n";

// 第一部分:HTML邮件内容
$html_content = "--$boundary\r\n";
$html_content .= "Content-Type: text/html; charset=UTF-8\r\n\r\n";
$html_content .= "Dear Mr/Mrs. $appname<br><br>
CONGRATULATIONS!<br><br>
We are very interested by your previous experiences. We will hold an interview with you next Tuesday at 10 a.m<br><br>
<img src='cid:company_logo_cid' alt='Company Logo' style='width:150px;'><br><br>
Best regards,<br>
HR Team\r\n";

// 第二部分:内嵌图片(读取图片并Base64编码)
$logo_path = '/var/www/html/company-logo.png';
$logo_data = file_get_contents($logo_path);
$logo_base64 = base64_encode($logo_data);

$image_content = "--$boundary\r\n";
$image_content .= "Content-Type: image/png\r\n";
$image_content .= "Content-Transfer-Encoding: base64\r\n";
$image_content .= "Content-ID: <company_logo_cid>\r\n"; // 这里的CID要和HTML里的对应
$image_content .= "Content-Disposition: inline; filename='logo.png'\r\n\r\n";
$image_content .= $logo_base64 . "\r\n";

// 结束边界
$end_boundary = "--$boundary--\r\n";

// 拼接所有部分成完整邮件内容
$message = $html_content . $image_content . $end_boundary;

// 发送邮件
if(mail($to, $subject, $message, $headers)) {
    echo '邮件发送成功';
} else {
    echo '发送失败';
}

小提醒:有些邮件客户端会默认阻止内嵌图片,所以给<img>加上alt文本是个好习惯,就算图片不显示,用户也能知道是什么内容。

内容的提问来源于stack exchange,提问作者Panji Pratama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:13:29