メインメニュー
Valid XHTML 1.0 Transitional Valid CSS!
PHP : 受信メールの添付ファイルを保存する
投稿者 : root 投稿日時: 2010/01/11 (58856 ヒット)

携帯サイトでは、ブログの投稿にメールを使用しているサイトが多いようです。
受信メールから、件名、本文、添付ファイル(画像)を取得する方法をご紹介します。

受信メールを解析する

PEARのMail_mimeDecodeを使用して、受信メールを解析します。
受信メールからのPHPスクリプトの呼び出しは「さくらインターネットで、メール自動返信をする」を参照してください。

  1. #!/usr/local/bin/php -q
  2. <?php
  3. //PEARのパスを設定
  4. $path = '/home/{さくらアカウント名}/pear/PEAR/';
  5. set_include_path(get_include_path() . PATH_SEPARATOR . $path);
  6. require_once 'Mail/mimeDecode.php';

  7. //受信メールから読み込み
  8. $params['include_bodies'] = true;
  9. $params['decode_bodies'] = true;
  10. $params['decode_headers'] = true;
  11. $params['input'] = file_get_contents("php://stdin");
  12. $params['crlf'] = "\r\n";
  13. if (!$params['input']) {
  14.     // 読み込み失敗
  15.     exit();
  16. }
  17. $structure = Mail_mimeDecode::decode($params);

  18. //送信者のメールアドレスを抽出
  19. $mail = $structure->headers['from'];
  20. $mail = addslashes($mail);
  21. $mail = str_replace('"','',$mail);
  22. $mail = preg_replace('/(^.*<|>$)/', '', $mail);

  23. // 件名を取得
  24. $subject = $structure->headers['subject'];

  25. // 本文、添付ファイル(画像)を抽出
  26. switch (strtolower($structure->ctype_primary)) {
  27.     case "text":
  28.         // シングルパート(テキストのみ)
  29.         $body = $structure->body;
  30.         break;
  31.     case "multipart":
  32.         // マルチパート(画像付き)
  33.         foreach ($structure->parts as $part) {
  34.             switch (strtolower($part->ctype_primary)) {
  35.                 case "text":
  36.                     $body = $part->body;
  37.                     break;
  38.                 case "image":
  39.                     // 画像の拡張子を取得する
  40.                     $type = strtolower($part->ctype_secondary);
  41.                     // 添付ファイル保存
  42.                     $tmpName = '{保存ディレクトリ}/image.' . $type;
  43.                     if ($fp = fopen($tmpName, "w")) {
  44.                         $length = strlen($part->body);
  45.                         fwrite($fp, $part->body, $length);
  46.                         fclose($fp);
  47.                     }
  48.                     break;
  49.             }
  50.         }
  51.         break;
  52.     default:
  53.         $body = "";
  54. }

  55. // 取得した情報を、データベースへ保存等の処理を行う


この記事に関連した記事

印刷用ページ