PHPでメール送信

フレームワークだと大抵組み込まれてるからいいんだけど、お問い合わせ等のメール送信だけなのにフレームワーク使うのは・・・ってときに。

PHP/mail関数でメール:メールの文字コードをUTF-8で送信

PHPファイルの文字コード:UTF-8
改行コード:CRLF

<?php
mb_language("uni");
mb_internal_encoding("utf-8");

$subject = '件名です。';
$body = "本文です。
本文ですよ
本文
";

$from = 'from@example.com';
$from_name = '差出人';
$to = 'to@example.com';

$headers = [];
$headers[] = 'Content-Type: text/plain; charset=UTF-8';
$headers[] = 'Content-Transfer-Encoding: 8bit';
$headers[] = 'Mime-Version: 1.0';
$headers[] = 'From: %s<%s>', $from, $from_name;

$add_headers = implode("\n", $headers);
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP-MS');

mail($to, $subject, $body, $add_headers);

PHP/mail関数でメール:メールの文字コードをiso-2022-jpで送信

PHPファイルの文字コード:UTF-8
改行コード:CRLF

<?php
mb_language("uni");
mb_internal_encoding("utf-8");

$subject = '件名です。';
$body = "本文です。
本文ですよ
本文
";

$from = 'from@example.com';
$from_name = '差出人';
$to = 'to@example.com';

$headers = [];
$headers[] = 'Content-Type: text/plain; charset="iso-2022-jp"';
$headers[] = 'Content-Transfer-Encoding: 7bit';
$headers[] = 'Mime-Version: 1.0';
$headers[] = 'From: ' . mb_encode_mimeheader($from_name, 'ISO-2022-JP-MS', 'UTF-8') . '<' . $from . '>';

$add_headers = implode("\n", $headers);
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP-MS', 'UTF-8');

$body = mb_convert_encoding($body, 'ISO-2022-JP-MS', 'UTF-8');

mail($to, $subject, $body, $add_headers);

PHPメール送信ライブラリPHPMailerでGmail経由でメール送信

https://github.com/PHPMailer/PHPMailer

一昔前ならPEAR::MailだったけどイマドキはComposerだね。

// Composerでライブラリ追加

$ composer require phpmailer/phpmailer

// ディレクトリ構成
[project]
┣ vendor/
┣ composer.json
┣ composer.lock
┗ sample.php

PHPファイルの文字コード:UTF-8
改行コード:CRLF

sample.php

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
    // サーバ設定
    // デバッグモード( 0:OFF / 1:クライアントメッセージ / 2:クライアント&サーバメッセージ )
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '*****@gmail.com';
    $mail->Password = '*****';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // 差出人
    $from_name = mb_encode_mimeheader('差出人', "ISO-2022-JP-MS", "UTF-8");
    $mail->setFrom('from@example.com', $from_name);
    // 送信先
    $to_name = mb_encode_mimeheader('送信先', "ISO-2022-JP-MS", "UTF-8");
    $mail->addAddress('to@example.com', $to_name);
    // 返信先
    $reply_name = mb_encode_mimeheader('返信先', "ISO-2022-JP-MS", "UTF-8");
    $mail->addReplyTo('reply@example.com', $reply_name);
// CC
//    $mail->addCC('cc@example.com');
// BCC
//    $mail->addBCC('bcc@example.com');

// 添付ファイル
//    $mail->addAttachment('/var/tmp/file.tar.gz');
//    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');

    //Content
    $mail->isHTML(false);
    $mail->Subject = mb_encode_mimeheader('これは件名です。', "ISO-2022-JP-MS", "UTF-8");
    $mail->Body    = "これは本文\nです。\n";

    $mail->send();
    echo '送信完了';
} catch (Exception $e) {
    echo '送信失敗:', $mail->ErrorInfo;
}