通过 phpMailer 发送包含来自数据库的图像的电子邮件的最常见方式是什么?
What is the most common way to send email that contains an image from a database via phpMailer?
我可以使用 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()
or addStringAttachment()
。提供文件名 and/or 指定 MIME 类型对这些至关重要,否则它无法猜测类型(因为它可以从文件中猜测),因此不会充当图像。
例如(从会话变量中获取图像数据):
$mail->addStringAttachment($_SESSION['image'], 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
$mail->addStringEmbeddedImage($_SESSION['image'], 'image', 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
使用编码为 base64 的图像对我有用的解决方案。
$image_data = explode(',', $_SESSION['icon_data']);
$image_data = base64_decode($image_data[1]);
$icon = $image_data;
之前,我只是尝试解码整个列单元格;我没有意识到我需要使用 explode 拆分的数据中有一个逗号,并且只使用第二个索引,它是实际的 base64 数据。
从这里开始,我只使用了 addStringEmbeddedImage:
$w_mail->addStringEmbeddedImage($icon, 'img', '', 'base64', "image/png");
目前有效。感谢大家的反馈和帮助
如果你 $_SESSION['image']
是 base64 encoded.so 当你将它传递给 addStringEmbeddedImage
你应该先解码它
$w_mail->addStringEmbeddedImage(base64_decode($image_data), 'image', 'image.png');
我可以使用 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()
or addStringAttachment()
。提供文件名 and/or 指定 MIME 类型对这些至关重要,否则它无法猜测类型(因为它可以从文件中猜测),因此不会充当图像。
例如(从会话变量中获取图像数据):
$mail->addStringAttachment($_SESSION['image'], 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
$mail->addStringEmbeddedImage($_SESSION['image'], 'image', 'image.png', PHPMailer::ENCODING_BASE64, 'image/png');
使用编码为 base64 的图像对我有用的解决方案。
$image_data = explode(',', $_SESSION['icon_data']);
$image_data = base64_decode($image_data[1]);
$icon = $image_data;
之前,我只是尝试解码整个列单元格;我没有意识到我需要使用 explode 拆分的数据中有一个逗号,并且只使用第二个索引,它是实际的 base64 数据。
从这里开始,我只使用了 addStringEmbeddedImage:
$w_mail->addStringEmbeddedImage($icon, 'img', '', 'base64', "image/png");
目前有效。感谢大家的反馈和帮助
如果你 $_SESSION['image']
是 base64 encoded.so 当你将它传递给 addStringEmbeddedImage
你应该先解码它
$w_mail->addStringEmbeddedImage(base64_decode($image_data), 'image', 'image.png');