9

私は問題があります。

メールに画像を添付し、他のphpで生成されたコンテンツとともにインラインで表示したいと思います。問題は、wp_mailが添付するために使用するファイル添付ファイル配列をインラインで使用する方法が少しもわからないことです。

私の解決策は、base64で画像をエンコードし、次のようにHTMLにインラインで配置することでした。

<img alt="The Alt" src="data:image/png;base64,*etc*etc*etc" />

しかし、問題は、Gmail/Outlookが画像からsrcデータを削除することです。だからそれは

<img alt="The Alt" />

何を変更するか(base64で動作するヘッダー)または添付ファイルを使用してそれらをインラインで埋め込む方法の手がかりはありますか?

4

6 に答える 6

21

wp_mailクラスを使用しPHPMailerます。このクラスには、インライン添付ファイルに必要なすべての機能があります。wp_mail()が電子メールを送信する前にphpmailerオブジェクトを変更するには、フィルターを使用できますphpmailer_init

$body = '
Hello John,
checkout my new cool picture.
<img src="cid:my-cool-picture-uid" width="300" height="400">

Thanks, hope you like it ;)';

これは、メール本文に画像を挿入する方法の例です。

$file = '/path/to/file.jpg'; //phpmailer will load this file
$uid = 'my-cool-picture-uid'; //will map it to this UID
$name = 'file.jpg'; //this will be the file name for the attachment

global $phpmailer;
add_action( 'phpmailer_init', function(&$phpmailer)use($file,$uid,$name){
    $phpmailer->SMTPKeepAlive = true;
    $phpmailer->AddEmbeddedImage($file, $uid, $name);
});

//now just call wp_mail()
wp_mail('test@example.com','Hi John',$body);

それで全部です。

于 2013-08-15T13:35:08.883 に答える
4

予期しないT_FUNCTIONエラーが発生した場合は、PHPバージョン<5.3が原因です。その場合、より伝統的な方法でそれを行うための関数を作成します。

function attachInlineImage() {  
  global $phpmailer;  
  $file = '/path/to/file.jpg'; //phpmailer will load this file  
  $uid = 'my-cool-picture-uid'; //will map it to this UID  
  $name = 'file.jpg'; //this will be the file name for the attachment  
  if (is_file($file)) {  
    $phpmailer->AddEmbeddedImage($file, $uid, $name);  
  }  
}  

add_action('phpmailer_init','attachInlineImage');  
于 2014-05-13T22:58:36.533 に答える
4

1つのステップで複数のメールを送信していて、すべてのメールに同じ埋め込み画像が含まれているとは限らないため、これは少し良い方法で必要でした。だから私はコンスタンティンからこのソリューションを使用していますが、私の変更を加えています:-)

wp_mail('test@example.org', 'First mail without attachments', 'Test 1');

$phpmailerInitAction = function(&$phpmailer) {
    $phpmailer->AddEmbeddedImage(__DIR__ . '/img/header.jpg', 'header');
    $phpmailer->AddEmbeddedImage(__DIR__ . '/img/footer.png', 'footer');
};
add_action('phpmailer_init', $phpmailerInitAction);
wp_mail('test@example.org', 'Mail with embedded images', 'Example <img src="cid:header" /><br /><img src="cid:footer" />', [
    'Content-Type: text/html; charset=UTF-8'
], [
    __DIR__ . '/files/terms.pdf'
]);
remove_action('phpmailer_init', $phpmailerInitAction);

wp_mail('test@example.org', 'Second mail without attachments', 'Test 2');

最初wp_mailは添付ファイルなしになります。2番目wp_mailには埋め込み画像が含まれます。3番目wp_mailは添付ファイルなしになります。

今のところ正常に動作しています

于 2017-08-26T12:44:21.073 に答える
1

このクラスは、メール本文への画像の追加を管理し、それ自体をクリーンアップするために作成しました。

また、を定義するSENDGRID_PASSWORDと、サーバーの代わりにSendgridを使用してメールを送信します

この記事は、ワードプレスを使用してメール本文に画像を埋め込む方法に関するステップバイステップのガイドです

https://codewriteups.com/embed-images-in-email-body-using-wp_mail-and-phpmailer

<?php

/*
 * Send HTML Emails with inline images
 */
class Custom_Mailer
{
    public $email_attachments = [];

    public function send($to, $subject, $body, $headers, $attachments)
    {
        /* Used by "phpmailer_init" hook to add attachments directly to PHPMailer  */
        $this->email_attachments = $attachments;

        /* Setup Before send email */
        add_action('phpmailer_init', [$this, 'add_attachments_to_php_mailer']);
        add_filter('wp_mail_content_type', [$this, 'set_content_type']);
        add_filter('wp_mail_from', [$this, 'set_wp_mail_from']);
        add_filter('wp_mail_from_name', [$this, 'wp_mail_from_name']);
        
        /* Send Email */
        $is_sent = wp_mail($to, $subject, $body, $headers);
        
        /* Cleanup after send email */
        $this->email_attachments = [];
        remove_action('phpmailer_init', [$this, 'add_attachments_to_php_mailer']);
        remove_filter('wp_mail_content_type', [$this, 'set_content_type']);
        remove_filter('wp_mail_from', [$this, 'set_wp_mail_from']);
        remove_filter('wp_mail_from_name', [$this, 'wp_mail_from_name']);

        return $is_sent;
    }

    public function add_attachments_to_php_mailer(&$phpmailer)
    {
        $phpmailer->SMTPKeepAlive=true;
        
        /* Sendgrid */
        if (defined('SENDGRID_PASSWORD')) {
            $phpmailer->IsSMTP();
            $phpmailer->Host="smtp.sendgrid.net";
            $phpmailer->Port = 587;
            $phpmailer->SMTPAuth = true;
            $phpmailer->SMTPSecure = 'tls';
            $phpmailer->Username="apikey";
            $phpmailer->Password = SENDGRID_PASSWORD;   /* api key from sendgrid */
        }

        /* Add attachments to mail */
        foreach ($this->email_attachments as $attachment) {
            if (file_exists($attachment['path'])) {
                $phpmailer->AddEmbeddedImage($attachment['path'], $attachment['cid']);
            }
        }
    }

    public function set_content_type()
    {
        return "text/html";
    }
    
    public function set_wp_mail_from($email)
    {
        //Make sure the email is from the same domain
        //as your website to avoid being marked as spam.
        return strip_tags(get_option('admin_email'));
    }

    public function wp_mail_from_name($name)
    {
        return get_bloginfo('name');
    }
}

使用法:

/* Set mail parameters */
$to = 'test@example.com';
$subject = 'Inline Img';
$body = '<h1>Image:</h1> <img src="cid:my_img_cid"/>';
$headers = "";
$my_attachments = [
    [
        "cid" => "my_img_cid", /* used in email body */
        "path" => plugin_dir_path(__FILE__) . '/my_img.png',
    ],
];

$custom_mailer = new Custom_Mailer();
$custom_mailer->send($to, $subject, $body, $headers, $my_attachments);
于 2020-12-04T09:40:10.373 に答える
0

AddEmbeddedImageは2つのパラメーターのみを受け入れるため、例のように$nameパラメーターを含めないようにしてください。

于 2018-02-27T13:00:37.557 に答える
0

以下のコードをfunctions.phpに追加して、すべてのメールに画像を含めます(署名ロゴなど)。

function attachInlineLogo() {
    global $phpmailer;
    if (!( $phpmailer instanceof PHPMailer )) {
        require_once ABSPATH . WPINC . '/class-phpmailer.php';
        require_once ABSPATH . WPINC . '/class-smtp.php';
        $phpmailer = new PHPMailer(true);
    }
    $strFilePath = 'ABSOLUTE LOGO PATH';
    $strFileUID  = 'UNIQUE-UID'; //UID TO USE IN HTML TEMPLATE
    $strFileName = 'LOGO NAME';
    if (is_file($strFilePath)) {
        $phpmailer->SMTPKeepAlive = true;
        $phpmailer->AddEmbeddedImage($strFilePath, $strFileUID, $strFileName);
    }
}

add_action('phpmailer_init', 'attachInlineLogo');

HTMLコード内

<img src='cid:UNIQUE-UID' />
于 2018-09-24T09:27:35.837 に答える