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 を使用してみました。両者の違いは半角カナを使用できるかどうかなどがあります。変換に際して若干挙動も変わってきます。下記のページに詳細が載っていました。
また、紹介したコードは記事用に書いたもので、おそらく実際に動作するとは思いますが、細かいテストを行なっていないので、使用する際はご自分でも検証したり、どのように動作するコードなのか調べてみてください。また、今回メール送信するにあたって、少しだけ参考にしたページも全てリンクしておきます。
- メールにファイルを添付する – メール送信(PEAR::Mail) – PEAR入門
- PHP: mb_encode_mimeheader – Manual
- いまさら知らなかったPHPのincludeの返り値 – それ図解で。・・・tohokuaikiのチラシの裏
- S-MEMO(エスメモ): PEAR::Mail_Mimeを使ってHTMLメールを送ってみよう
最後に添付ファイルに日本語名が使われていると文字化けします。おそらく添付ファイルをセットする処理に basename() が使われているからだと思うんですが、どうしたらいいのか分からないので対応方法が分かる人がいたら教えてください。あと、PHPMailer も便利ですが、今回は PEAR を使用しています。
関連記事
- PHP で文字コード UTF-8 で構築した環境から文字化けさせずに日本語メールを送信する
- WordPress で PHP で簡単にキャッシュファイルを作れる PEAR::Cache_Lite を使ってパフォーマンスを向上させてみた
- Mac OS X Lion に PEAR を Macports とかを使わずにインストールする方法
- WordPress でメールを送信する際は wp_mail() が便利
- PHP で簡単にキャッシュを実装できる PEAR の Cache_Lite をインストールする方法
- Mac に pear をインストールする方法
- CakePHP のファイルアップロードでファイルの最大サイズを制限する方法
- PHP でシリアライズしたデータが壊れてしまう場合は base64_encode をする
- XAMPPでSendmailをローカルに送信できるなら何でも良い
- PEAR をインストールできない環境で MDB2 を使う方法
コメント
コメントは受け付けていません。