通过 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');