Skip navigation.

exploreopera

| Help

Sign up | Help

极湖

无不用其“极”

通过管道(stdin)收取邮件并解析的 PHP 代码

, , , ,

本文介绍怎样通过 PEAR::Mail 的 mimeDecode.php 解析收到的邮件(包括附件的处理)

首先,根据邮件系统进行别名设置,如:
diary:      "|/usr/local/bin/php /***/****/diary.php"


如果是qmail,可在收取邮件账号的 .qmail 文件里作如下设置:
|/usr/local/bin/php /***/****/diary.php


diary.php 的内容:
<?php 
  require_once 'Mail/mimeDecode.php'; 
  // 取得邮件内容
  $params['include_bodies'] = true; 
  $params['decode_bodies']  = true; 
  $params['decode_headers'] = true; 
  $params['input'] = file_get_contents("php://stdin"); 
  $params['crlf'] = "\r\n"; 
  $structure = Mail_mimeDecode::decode($params); 

  //取得发送邮件地址
  if(preg_match("/<(.*)>/", $mail_from, $matches)) {
    $mail_from = $matches[1]; 
  }
  //取得目标邮件地址
  $mail_to = $structure->headers['to']; 
  if(preg_match("/<(.*)>/", $mail_to, $matches)) {
    $mail_to = $matches[1]; 
  }

  // 取得邮件标题
  $mail_subject = $structure->headers['subject']; 
   
  switch(strtolower($structure->ctype_primary)){ 
    case "text": // 只有一个Part(文本邮件) 
      $mail_body = $structure->body; 
      break; 
    case "multipart":  // 有多个Part(图片等) 
      foreach($structure->parts as $part){ 
        switch(strtolower($part->ctype_primary)){ 
          case "text": // 正文
            $mail_body = $part->body; 
            break; 
          case "image": // 图片
            //取得图片文件扩展名并转为小写
            $type = strtolower($part->ctype_secondary); 
            //检查是否为JPEG格式(同样可以检查是否为GIF或者PNG格式) 
            if($type != "jpeg" and $type != "jpg"){ 
              continue; 
            } 
            //把附件保存到文件
            $file_mame = $part->ctype_parameters['name'];
            $fp = fopen("/tmp/$file_mame", "w" );
            $length = strlen( $part->body ); 
            fwrite( $fp, $part->body, $length ); 
            fclose( $fp ); 
            break; 
        } 
      } 
    break; 
    default: 
    $mail_body = ""; 
  } 
  /* 
   * 其他处理,如:把邮件地址、标题、正文、图片等信息保存到数据库
   */ 
?>


以上代码只是个框架,可以根据自己的需要修改和扩充。运行该代码需要 Pear 的 Mail 及 Mail_MIME 包,安装方法如下:
$ pear install -a Mail
$ pear install -a Mail_MIME


补充:
邮件内容可能有不同的编码,很多情况下都时候需要转码,方法如下(目标编码根据需要修改):
mb_detect_order("ASCII, JIS, UTF-8, EUC-JP, SJIS");
$mail_subject = mb_convert_encoding($structure->headers['subject'], 'EUC-JP', 'auto');


本文翻译整理自: stdinからのメール処理でメール情報を取得する

金言CVS 密码加密小程序

Write a comment

You must be logged in to write a comment. if you're not a registered member, please sign up.

September 2008
SMTWTFS
August 2008October 2008
123456
78910111213
14151617181920
21222324252627
282930