我可以使用phpMailer发送html电子邮件模板,也可以使用addEmbeddedImage((在html模板中使用静态img。
phpMailer实例
...
$w_mail->addEmbeddedImage(__DIR__ . '/html_templates/noimage2.png', 'noImage');
在html模板文件中:
<html>
...
<td style='padding: 0 20px 20px 0;'>
<img src='cid:image' alt="user photo" />
</td>
...
</html>
本地文件(html_templates/noimage2.png(中的这个静态图像显示在电子邮件中没有问题。
我想转换这个静态图像并使用数据库中的图像。目标是使用登录用户的图标作为图像。
此图像数据存储在会话变量中为:(这是上传的原始图像,数据库中为base64(
$image_data = $_SESSION['icon_data'];
但我不确定我可以使用哪种phpMailer方法将当前的静态设置转换为更动态的设置。静态,我的意思是addEmbeddedImage
采用实际的文件目录。
有没有最好的方法通过phpMailer使用数据库中的电子邮件模板中的图像?
提前谢谢。
编辑:
这是当前尝试使用addStringAttachment和addStringEmbeddedImage方法的phpMailer实例。html与上面相同:
function f_common_send_mail($i_to_addresses, $i_subject = "", $i_body = ""){
$image_data = $_SESSION['icon_data'];
$w_mail = new PHPMailer(true);
try {
$w_mail->CharSet = MAIL_CHARA; // Mail character set
$w_mail->Encoding = MAIL_ENCODIN; // Mail encoding
// Server Settings
$w_mail->isSMTP(); // Set mailer to use SMTP
$w_mail->Host = SMTP_HOST; // Specify main and backup SMTP servers
$w_mail->SMTPAuth = SMTP_AUTH; // Enable SMTP authentication
$w_mail->Username = SMTP_USERNAME; // SMTP username
$w_mail->Password = SMTP_PASSWORD; // SMTP password
$w_mail->SMTPSecure = SMTP_ENCRPT; // Enable TLS encryption
$w_mail->Port = SMTP_PORT; // TCP port to connect to
// Mail Settings
$w_mail->addAddress($i_to_addresses); // To address
$w_mail->setFrom(MAIL_ADDRESS); // From address
$w_mail->Subject = $i_subject; // Subject
$w_mail->isHTML(true); // Email format to HTML
$w_email_body = '';
if($i_body == ""){
$w_email_body = " "; // Email body(Because string empty is Error)
}else{
$w_email_body = $i_body; // Email body
}
// $w_email_body .= c_email_footer;
$w_mail->Body = $w_email_body;
// embedding image ('Logo' is the identifier inside the html file's img tag)
$w_mail->addEmbeddedImage(__DIR__ . '/html_templates/CARTRIDGE_Logo_R.png', 'Logo');
// $w_mail->addEmbeddedImage(__DIR__ . '/html_templates/noimage2.png', 'noImage');
$w_mail->addStringAttachment($image_data, 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
$w_mail->addStringEmbeddedImage($image_data, 'image', 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
if($w_mail->send()) {
// Email sent successfully
$w_mail = null;
return true;
}else{
// Failed to send email.
$w_mail = null;
return false;
}
}
catch (Exception $e) {
// Failed to send email.
$w_mail = null;
return false;
}
}
@msbit是正确的。正确的方法是使用addStringEmbeddedImage()
或addStringAttachment()
。对这些来说,提供文件名和/或指定MIME类型至关重要,否则它无法猜测类型(就像从文件中猜到的那样(,因此不会充当图像。
例如(从会话var获取图像数据(:
$mail->addStringAttachment($_SESSION['image'], 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
$mail->addStringEmbeddedImage($_SESSION['image'], 'image', 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
如果你的$_SESSION['image']
是base64编码的。所以当你把它传给addStringEmbeddedImage
时,你应该先解码
$w_mail->addStringEmbeddedImage(base64_decode($image_data), 'image', 'image.png');
使用编码为base64的图像为我工作的解决方案。
$image_data = explode(',', $_SESSION['icon_data']);
$image_data = base64_decode($image_data[1]);
$icon = $image_data;
之前,我只是尝试解码整个列单元格;我没有意识到数据中有一个逗号,我需要使用爆炸来分割,只使用第二个索引,即实际的base64数据。
从这里开始,我只使用了addStringEmbeddedImage:
$w_mail->addStringEmbeddedImage($icon, 'img', '', 'base64', "image/png");
目前有效。感谢大家的反馈和帮助