通过管道(stdin)收取邮件并解析的 PHP 代码
Thursday, 25. October 2007, 06:49:51
首先,根据邮件系统进行别名设置,如:
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からのメール処理でメール情報を取得する