2022-08-09/2023-05-23

wp_mailのあれこれ

wp_mailのあれこれ

wp_mailはWordpressのメールを送信できる関数です。

テキストメールを送る分にはそのままで良いのですが、少し変わったことをしようとするとどこをどうすれば良いのか分かりづらいです。

そこで今回は実際の使用ケースに合わせたwp_mailの使い方を紹介します。

ファイルを添付する

ファイルを添付するには「wp_mail」の第5引数($attachments)を指定することで可能になります。

下記の例では投稿のサムネイル画像を添付ファイルとしています。

$attachmentsには絶対パスを指定します。また、パスはサーバーパスを使用します。(https://sample.com/のような形ではなく/home/username/の方)

下記の例でも「get_the_post_thumbnail_url」で取得するのではなく、「get_post_thumbnail_id」でサムネイルのattachment_idを取得し、「get_attached_file」でパスを取得しています。

1$to = $mail_to; // 送信先アドレス
2$subject = '件名';
3$body = 'Hello, World';
4$headers = sprintf( 'From: %1$s <%2$s>', get_bloginfo( 'name' ), get_bloginfo( 'admin_email' ) );
5$attachments = [ get_attached_file( get_post_thumbnail_id( $post_id ) ) ];
6wp_mail( $to, $subject, $body, $headers, $attachments );

HTMLメールを使用したい

デフォルトのメールではContent-Typeは「text/plain」になっています。HTMLメールを使用するには「text/html」を使用する必要があります。

wp_mail_content_type」というcontent-type用のフックがありますのでそれを使用します。

1add_filter( 'wp_mail_content_type', 'html_mail' );
2function html_mail( $content_type ){
3 return "text/html";
4}

特定のメールのみHTMLメールに変更したい場合は、wp_mailの前後でフィルターのつけ外しをします。

1add_filter( 'wp_mail_content_type', 'html_mail' );
2
3$to = $mail_to; // 送信先アドレス
4$subject = '件名';
5$body = 'Hello, World';
6$headers = sprintf( 'From: %1$s <%2$s>', get_bloginfo( 'name' ), get_bloginfo( 'admin_email' ) );
7$attachments = [ get_attached_file( get_post_thumbnail_id( $post_id ) ) ];
8wp_mail( $to, $subject, $body, $headers, $attachments );
9
10remove_filter( 'wp_mail_content_type', 'html_mail' );

Cc・Bccを指定したい

Cc・Bccを追加するにはヘッダーを追加するだけです。

1$to = $mail_to; // 送信先アドレス
2$subject = '件名';
3$body = 'Hello, World';
4$headers[] = sprintf( 'From: %1$s <%2$s>', get_bloginfo( 'name' ), get_bloginfo( 'admin_email' ) );
5$headers[] = 'Cc: cc@sample.com';
6$headers[] = 'Bcc: bcc@sample.com';
7$attachments = [ get_attached_file( get_post_thumbnail_id( $post_id ) ) ];
8wp_mail( $to, $subject, $body, $headers, $attachments );

SMTPを使用したい

プラグインの使用に制限がないなら「WP Mail SMTP」等を使用して設定すると簡単です。

自力でSMTP設定を行いたい場合「phpmailer_init」フックを利用します。引数は「」インスタンスが参照渡しとなっています。そのためフィルターフックのように値を返すのではなく、引数のインスタンスのプロパティを直接変更することで設定します。

このフックはメール送信の直前に呼び出されます。むやみに変更を行うとwp_mailの引数で与えた設定を上書きしてしまいますので注意してください。(下記例だと「setFrom」が該当します。)

add_action( 'phpmailer_init', 'mailer_config', 10 );
function mailer_config( $mailer ) {
$mailer->IsSMTP();
$mailer->SMTPAuth = true;
$mailer->Host = 'ホスト名';
$mailer->Port = 'ポート番号';
$mailer->Username = 'ユーザー名';
$mailer->Password = 'パスワード';
$mailer->CharSet = "utf-8";
// $mailer->SMTPDebug = PHPMailer\PHPMailer\SMTP::DEBUG_SERVER;
$mailer->SMTPSecure = 'ssl'; // or tls
// $mailer->setFrom( '送信元アドレス', '送信元名前' );
}

2020 KumaTechLab.