使用PHP Mailer发送带嵌入Logo的邮件失败求助
解决PHPMailer与PHP mail函数嵌入图片不显示的问题
我来帮你搞定这个内嵌Logo不显示的问题!不管是用PHPMailer还是原生PHP mail函数,直接在邮件内容里写图片路径肯定不行——邮件是独立于你的服务器的,得把图片作为内嵌附件,再通过CID(Content-ID)关联到HTML内容里,客户端才能正确加载显示。
一、PHPMailer 解决方案
PHPMailer已经封装好了内嵌图片的方法,比原生函数简单太多,按下面步骤改就行:
- 首先确保开启HTML模式(这是基础,不然HTML标签和图片都不生效)
- 用
addEmbeddedImage()方法添加内嵌图片,指定唯一的CID - 在邮件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
相关产品推荐
相关产品推荐

