PHP で PEAR::Mail を使ってメールにファイルを添付して凄く簡単にメール送信する

自力で mail() 関数を使用してファイルを添付して日本語メールを送ることも可能ですが、ヘッダを自力で書くとかなりの時間がかかりそうです。PEAR に関してはその他のライブラリに比べて導入が大変楽ですから、PEAR を使っての実装をすることにしました。それにあたって下記のページを参考に PEAR で添付ファイル付きメールを送信します。

これらの記事を参考に下記のように配列で値を渡すだけで、日本語メールを送信できるコードを書いてみました。また、ファイルを添付しない場合は PEAR を使わないで自力でメール送信機能付きです。

1
2
3
4
5
6
7
8
9
10
11
12
13
$data = Array(
    'to' => 'info@weble.org',
    'from' => 'info@example.com',
    'name' => '団体名',
    'subject' => 'タイトル',
    'body' => '内容',
    'option' => Array('file' => '/uploads/2012/screenshot-2012-06-03.png')
);
if(mail_post($data)) {
    echo 'メール送信成功';
} else {
    echo 'メール送信失敗';
}

以上の方法でメールを送信できるようにするには、まずサーバーで以下のコマンドを実行するなどして PEAR::Mail と PEAR::Mail_mime をインストールします。ちなみに -a は依存関係を全てインストールするためのオプションです。

1
2
sudo pear install -a Mail
sudo pear install -a Mail_mime

そして下記の関数を使えるようにします。メールの送信に失敗したり、PEAR のライブラリがインストールされていなければ false を返し、メールを送信できれば true が返ってくると思います。細かい検証はしていないので、本番環境で使う際はテストをしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function mail_post($data, $document_root = '/var/www/html')
{
    if(isset($data['option']['file'])) {
 
        $pear_mail = include_once("Mail.php");
        $pear_mail_mime = include_once("Mail/mime.php");
 
        if($pear_mail && $pear_mail_mime) {
 
            preg_match('/[^\/]+$/', $data['option']['file'], $filename);
            mb_convert_variables('JIS', 'UTF-8', $data['body'], $filename[0]);
 
            $mime = new Mail_mime;
            $mime->setParam('text_charset', 'ISO-2022-JP');
            $mime->setParam('text_encoding', '8bit');
            $mime->setTxtBody($data['body']);
            $mime->addAttachment($document_root . $data['option']['file'], null, $filename[0]);
            $headers = array(
                'From' => $data['from'], 'To' => $data['to'],
                'Subject' => mb_encode_mimeheader(mb_convert_encoding($data['subject'], 'JIS', 'UTF-8'), 'JIS'),
            );
            $headers = $mime->headers($headers);
            $body = $mime->get();
 
            $mail = Mail::factory('sendmail');
            return $mail->send($data['to'], $headers, $body);
        } else {
            return false;
        }
    } else {
        mb_language("japanese");
        mb_internal_encoding("UTF-8");
        $to = $data['to'];
        $from = mb_encode_mimeheader(mb_convert_encoding($data['name'], "JIS", "UTF-8")) . "<{$data['from']}>";
        return mb_send_mail($to, $data['subject'], $data['body'], "From:{$from}");
    }
}

ちなみに参考サイトでは文字コード部分に ISO-2022-JP が使われていますが本記事では JIS を使用してみました。両者の違いは半角カナを使用できるかどうかなどがあります。変換に際して若干挙動も変わってきます。下記のページに詳細が載っていました。

また、紹介したコードは記事用に書いたもので、おそらく実際に動作するとは思いますが、細かいテストを行なっていないので、使用する際はご自分でも検証したり、どのように動作するコードなのか調べてみてください。また、今回メール送信するにあたって、少しだけ参考にしたページも全てリンクしておきます。

最後に添付ファイルに日本語名が使われていると文字化けします。おそらく添付ファイルをセットする処理に basename() が使われているからだと思うんですが、どうしたらいいのか分からないので対応方法が分かる人がいたら教えてください。あと、PHPMailer も便利ですが、今回は PEAR を使用しています。

コメント

コメントは受け付けていません。