ちょうどいい感じのPHPメール送信関数 jp_send_mail()

概要

PHPでメールを送信する方法はいくつかあり、Webで検索すればサンプルコードはいくらでも出てくるのですが、お問い合わせフォーム程度の仕組みに使うには PHPMailer では重厚すぎ、でもPHP標準の mail()mb_send_mail() 関数では、メールアドレスに日本語のラベル付けたりファイルを添付しようとした途端に煩雑な追加処理を書く必要が出てきて、そのために調べたりテストしたりと時間がかかる割にトラブル確率の高いパートでもあります。

そこで、こんな風にシンプルに書ける軽いメール送信関数があったらいいなーと思っていました。

<?php
$result = jp_send_mail([
    'to'      => '㈱あてさき様 <to@mail.com>',
    'from'    => 'おくりもと <from@mail.com>',
    'subject' => 'お問い合わせありがとうございました。',
    'body'    => file_get_contents('mail-thanks.php'),
    'files'   => ['スケジュール①.pdf'=>'/xxx/schedule.pdf'],
]);

このシンプルな書き方で、文字エンコードとか色々気にせずメールがさくっと送れるというものです。
追加ライブラリなどにいっさい依存せず、やれ new しろだのやれ throw しろだのも無く、 単なるメール送信関数として実行し処理成功したかどうかだけ返すこの jp_send_mail() 関数が使えたら、いろいろと便利なシーンも多いのではないでしょうか。

...と、いうわけで作りました。😃

PHPダウンロード

ソースコードが思いのほか長くなってしまったので GitHub に上げました。本当は短くして記事中に掲載したかったのですが、無理に短くするとあまりに可読性が悪くなると思ったので・・。
本体は1ファイルのみです。以下のリンクを右クリック保存してください。

仕様

  • PHP5.3以降で利用可能。
  • 送り先、件名に日本語ラベルが使用可能。( なまえ <xxx@yyy.zzz> のパターン)
  • エンコーディング ISO-2022-JP-MS を標準で扱うように。(UTF-8 じゃなくても丸数字「①」や「㈱」が「?」にならない)
  • 複数ファイル添付が可能。
  • Reply先とか -f とかちゃんと指定できるように。
  • SMTP送信機能は無し(内部で mail() で送るため)
  • メールアドレスの@以降のホストが実在しない場合は送信しない。(DNSチェック)
  • 設定値をPHPとして実行することも可能

使い方

上記でダウンロードしたファイルを require して jp_send_mail() 呼ぶだけです。

require 'jp_send_mail.php';

jp_send_mail([
    'from'    => 'from@xx.jp',
    'to'      => 'to@xx.jp',
    'subject' => '件名',
    'body'    => '本文',
]);

最小はこれだけです。
PHP5.3の場合は、配列定義は [] じゃなく array() に置き換えてくださいね。意外と忘れがち。
以下、引数の説明を記載します。

引数説明

引数のキー 引数の値 値の例
to 宛先メールアドレス。日本語ラベルや複数配列の指定も可能。
aaa@bbb.ccc
from 送り元メールアドレス。日本語ラベル使用可能。
山田花子 <zzz@bbb.ccc>
cc CC先メールアドレス。日本語ラベルや複数配列の指定も可能。 [
 'cc@bbb.ccc',
 'CC2 <cc2@bbb.ccc>'
]
bcc BCC先メールアドレス。日本語ラベルや複数配列の指定も可能。 bcc@bbb.ccc
reply Reply先メールアドレス。日本語ラベル使用可能。
山田次郎 <reply@bbb.ccc>
subject メールの件名。 【サンプル】お問い合わせありがとうございます
body メール本文。 こんにちは <?= $name ?> さん

~~~~

以上
※PHP実行のためには後述の phpable の設定が必要です。
f -f で指定するメールアドレス(未指定ならfromのメールアドレス部分が使用されます。falseにすると無視) ddd@eee.fff
encoding エンコーディングの指定。未指定なら ISO-2022-JP-MS。 UTF-8
files 添付したいファイルを配列で指定。
[
 '/tmp/abcd.pdf',
 'aaa.pdf' => '/bbb/ccc.dat', // 添付ファイル名指定
]
phpable 値をPHPとして評価するかどうか。及び使いたい変数配列を指定。 false 以外を指定すると、メールアドレス・件名・本文がPHPとして評価されます。また、キー=>値の配列を指定することで中で変数が使えるようになります。(サンプル後述)
headers メールヘッダーが追加可能。 [
 'X-Priority' => 3,
 'X-MSMail-Priority' => 'Normal'
]
startline 本文上部の改行数を指定可能。標準は1。 3

to, from, subject, body は必須です。

サンプル集

複数のTO, CC, BCCを指定したい。

require 'jp_send_mail.php';

jp_send_mail([
    'from'    => 'from@xx.jp',
    'to'      => [
        '山田太郎 <tarou@example.com>',
        'to@example.com',
    ],
    'cc'      => [
        '山田花子 <hanako@example.com>',
        'cc@example.com',
    ],
    'bcc'     => [
        '山田次郎 <jirou@example.com>',
        'bcc@example.com',
    ],
    'subject' => '件名',
    'body'    => '本文',
]);

fromreply は複数指定できません。

Reply-toを指定したい

require 'jp_send_mail.php';

jp_send_mail([
    'from'    => 'from@example.com',
    'to'      => 'to@example.com',
    'reply'   => 'reply@example.com',
    'subject' => '件名',
    'body'    => '本文',
]);

エンコードを UTF-8 で送りたい

require 'jp_send_mail.php';

jp_send_mail([
    'encoding' => 'UTF-8',
    'from'     => '😃 <from@example.com>',
    'to'       => '🐶 <to@example.com>',
    'subject'  => '件😺名',
    'body'     => '本🐴文',
]);

メール文章に変数を差し込みたい

require 'jp_send_mail.php';

// 変数セット
$type = $_POST['type']; // タイプが入る(1:お問い合わせ  2:資料請求)
$name = $_POST['name']; // お名前が入る

// 送信
jp_send_mail([
    'from'    => 'from@example.com',
    'to'      => 'to@example.com',
    'subject' => '<?= $type===1 ? "お問い合わせ" : "資料請求" ?>ありがとうございます。',
    'body'    => 'こんにちは <?php echo $name ?> 様',
    'phpable' => compact('type', 'name'), // 設定値をPHPとして実行する。中で展開する変数を指定。
]);

緊急度高いメールヘッダー付けたい

require 'jp_send_mail.php';

jp_send_mail([
    'from'    => 'from@example.com',
    'to'      => 'to@example.com',
    'subject' => '件名',
    'body'    => '本文',
    'headers'  => ['Priority'=>'urgent'], // 緊急度高いメールヘッダー追加
]);

ファイルを添付したい

require 'jp_send_mail.php';

jp_send_mail([
    'from'    => 'from@example.com',
    'to'      => 'to@example.com',
    'subject' => '件名',
    'body'    => '本文',
    'files'   => [
        '/xxx/bbb/cat.jpg', // 「cat.jpg」として添付される
        'いぬ.jpg' => '/xxx/bbb/dog.jpg', // 「いぬ.jpg」として添付される
    ],
]);

最後に

関数じゃなく class で作って Composer に上げたりすることも考えたのですが、多分これが一番フットワークの軽い提供形態なのではないかと思いましたので関数で用意しました。簡単なフォーム案件のために大量のファイルをロードさせたくないこともあるでしょうから。
でも、もしフレームワークに取り込みたいなら独自のクラスのメソッドに組み込んでもいいし、別ファイルにして trait してもいいでしょう。 利用はもちろん自己責任ですが。

ただでさえ面倒な日本語メール送信プログラムが、少しでもラクで楽しいものになりますように。