web-dev-qa-db-ja.com

Wp_mail()で添付ファイル付きのHTMLメールを送信する

これは簡単なはずですが、わかりません。 HTML形式の電子メールを送信したいのですが、添付ファイルもあります。添付ファイルは正しく送信されていますが、メッセージは次のようにプレーンテキストとして配信されます。

<p>Hello!</p>
<p>&nbsp;</p>
<p>Some text.</p>
<p>&nbsp;</p>
<p>Best wishes,</p>
<p>Team</p>

添付ファイルのないEメールの場合は、 here のようにヘッダーを変更してHTMLを送信するように強制します。しかし今、私はコンテンツタイプをマルチパート/ミックスにする必要があります(そうでしょう?)。だから私の質問は:私はどうやってwp_mail()に自分のメッセージをhtmlとして送って添付ファイルを含めるよう説得するのか?

1
Maija Vilkina

参照リンク ここをクリック

以下のコードを使用すると、HTML形式でメールを送信できます。

$to = '[email protected]';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );

// For attachment 

$attachments = array( WP_CONTENT_DIR . '/uploads/file_to_attach.Zip' );
$headers = 'From: My Name <[email protected]>' . "\r\n";

wp_mail( '[email protected]', 'subject', 'message', $headers, $attachments );
2
Naveen

私はあなたの特定のケースでの答えはリンクされたスレッドに記載されているバグを含まないと信じています。やりたいことを実現するためにカスタムヘッダーを設定する必要はありません。

代わりに$phpmailer->AltBodyを使って代替ボディをテキストとして設定するだけです。これは自動的にtoコンテンツタイプmultipart/alternative(multipart/mixedではない)を設定し、あなたはphpmailerクラスがカスタムヘッダを手動で設定する必要がある残りの{without}の世話をすることを可能にします。

add_action('phpmailer_init','wp_mail_set_text_body');
function wp_mail_set_text_body($phpmailer) {
     $phpmailer->AltBody = strip_tags($phpmailer->Body);
}

$to = '[email protected]';
$headers = array();
$attachments = array(dirname(__FILE__).'/test.txt');
wp_mail($to,$subject,$message,$headers,$attachments);

添付ファイルを追加すると、全体のコンテンツタイプは自動的にmultipart/mixedとなり、そのwchiの中にmultipart/alternativetext/plaintext/htmlの部分を含み、その後に添付ファイルが続きます。

画像などのmultipart/related(インライン)添付ファイルをwp_mail経由で$attachementsに渡すことで(5番目のパラメータを 'inline'として)、またはHTML本体自体の中で宣言することもできます。私が知る限り、これらはテキスト版にはアクセスできないでしょう。

1
majick

あなたが投稿した リンクに記載されているように

デフォルトのコンテンツタイプは 'text/plain'です。これはHTMLの使用を許可しません。ただし、 'wp_mail_content_type'フィルタを使用してメールのコンテンツタイプを設定できます。

wp_mail_content_type に記載されているように、これをfunctions.phpに追加します。

add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
    return 'text/html';
}

トリックをするべきです。

0
flero