メールから件名・本文・添付画像などを取り出す | Mail

Sabel_Mail_MimeDecode はソースを解析し、ヘッダ・件名・本文や添付画像、HTMLパートなどを取り出すことを可能にします。Outlook や Outlook Express、Thunderbird や携帯から送信される一般的なメール形式の多くに対応しています。
※解析可能な形式はページ下部で説明しています。

解析の方法は簡単で、decode()メソッド にメールソースを渡すだけです。decode()メソッド の返り値のメールオブジェクトから取得できる件名や本文などは、自動的に内部エンコーディングに変換されます。
$decoder = new Sabel_Mail_MimeDecode();
$mail = $decoder->decode(file_get_contents("/path/to/test.eml"));
ヘッダの内容は getHeader()メソッド により取得することができます。大文字、小文字は気にする必要はありません。
echo $mail->getHeader("Message-ID");
echo $mail->getHeader("Date");
------------------------------------------------
echo $mail->getHeader("message-id");  // ok
echo $mail->getHeader("date");        // ok
件名は getSubject()、もしくは件名はヘッダに含まれるものなので getHeader() でも取得することが可能です。
echo $mail->getSubject();
------------------------------------------------
echo $mail->getHeader("Subject");
本文を取得するには body にアクセスしてください。これは本文テキストではなく、Partオブジェクト となります。Partオブジェクト からはMIMEタイプや文字セット、エンコーディングなども取得することができます。
if ($body = $mail->body) {
  echo $body->getContent();   // Body text
  echo $body->getType();      // MIME Type
  echo $body->getCharset();   // Charset
  echo $body->getEncoding();  // Encoding
}
HTMLパートしか無いような特殊ケースもあるため、どちらかを本文として取得できれば良いのであれば、以下のようにコーディングすることができます。
$bodyText = "";

if ($mail->body) {
  $bodyText = $mail->body->getContent();
} elseif ($mail->html) {
  $bodyText = $mail->html->getContent();
}

echo $bodyText;
添付ファイルは attachments から取得することができます。getContent()メソッド で取得できるファイルデータは Base64エンコード、または QuotedPrintableエンコード からデコードされたバイナリデータに復元されています。
if ($mail->attachments) {
  foreach ($mail->attachments as $attachment) {
    echo $attachment->getName();     // file name
    echo $attachment->getType();     // mime type
    echo $attachment->getContent();  // binary data
  }
}
HTMLパートはインライン画像を保持しているかもしれません。そのインライン画像は、getImages()メソッド により取得することができます。
if ($mail->html) {
  echo $mail->html->getContent();  // html text
  
  foreach ($mail->html->getImages() as $image) {
    echo $image["cid"];       // contents id
    echo $image["mimetype"];  // mime type
    echo $image["data"];      // binary data
  }
}

解析可能な形式

1. 本文
[本文]
2. HTMLメール
[HTML]
3. 本文 + HTMLメール
multipart/alternative
  [本文]
  [HTML]
4. HTMLメール(インライン画像有)
multipart/related
  [HTML]
  [インライン画像]
  ...
5. HTMLメール + 添付ファイル
multipart/mixed
  multipart/related
    [HTML]
    [インライン画像]
    ...
[添付ファイル]
...
6. 本文 + HTMLメール(インライン画像有)
multipart/alternative
  [本文]
  multipart/related
    [HTML]
    [インライン画像]
    ...
7. 本文 + HTMLメール(インライン画像有)
multipart/related
  multipart/alternative
    [本文]
    [HTML]
[インライン画像]
...
8. 本文 + HTMLメール + 添付ファイル
multipart/mixed
  multipart/alternative
    [本文]
    [HTML]
[添付ファイル]
...
9. 本文 + HTMLメール(インライン画像有) + 添付ファイル
multipart/mixed
  multipart/alternative
    [本文]
    multipart/related
      [HTML]
      [インライン画像]
      ...
[添付ファイル]
...
10. 本文 + HTMLメール(インライン画像有) + 添付ファイル
multipart/mixed
  multipart/related
    multipart/alternative
      [本文]
      [HTML]
  [インライン画像]
  ...
[添付ファイル]
...
11. ダイジェスト
multipart/digest
  message/rfc822
    [上記のいずれかの形式]
  ...
12. 本文 + ダイジェスト + 添付ファイル
multipart/mixed
  [本文]
  multipart/digest
    message/rfc822
      [上記のいずれかの形式]
    ...
[添付ファイル]
...

関連項目