经过多次失败的尝试,终于有了一个我可以接受的解决方案。主机服务器不想允许 MailParse,因为这是他们共享主机环境的问题,所以我选择了Mail_mimeDecode
PEARMail_MIME
扩展。
// Read the message from STDIN
$fd = fopen("php://stdin", "r");
$input = "";
while (!feof($fd)) {
$input .= fread($fd, 1024);
}
fclose($fd);
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$decoder = new Mail_mimeDecode($input);
$structure = $decoder->decode($params);
// get the header From and To email
$From = ExtractEmailAddress($structure->headers['from'])[0];
$To = ExtractEmailAddress($structure->headers['to'])[0];
$Subject = $structure->headers['subject'];
ExtractEmailAddress
使用“在 PHP 中,如何从一段文本中提取多个电子邮件地址并将它们放入数组中? ”的解决方案
对于正文,我使用以下内容查找text
和html
部分:
$HTML = "";
$TEXT = "";
// extract email body details
foreach($structure as $K => $V){
if(is_array($V)){
foreach($V as $KK => $VV){
if(is_object($VV)){
$bodyHTML = false;
$bodyPLAIN = false;
foreach($VV as $KKK => $VVV){
if(!is_array($VVV)){
if($KKK === 'ctype_secondary'){
if($VVV === 'html') { $bodyHTML = true; }
if($VVV === 'plain') { $bodyPLAIN = true; }
}
if($KKK === 'body'){
if($bodyHTML){
$bodyHTML = false;
$HTML .= quoted_printable_decode($VVV);
}
if($bodyPLAIN){
$bodyPLAIN = false;
$TEXT .= quoted_printable_decode($VVV);
}
}
}
}
}
}
}
}
最后,我得到了我需要的零件,所以我过去常常Mail_MIME
把消息传出去。我在这里执行我的数据库查找逻辑,并使用从标题中提取的and找到真正的目的地和屏蔽From
的电子邮件地址。From
To
$mime = new Mail_mime(array('eol' => "\r\n"));
$mime->setTXTBody($TEXT);
$mime->setHTMLBody($HTML);
$mail = &Mail::factory('mail');
$hdrs = array(
'From' => $From,
'Subject' => $Subject
);
$mail->send($To, $mime->headers($hdrs), $mime->get());
我不知道这是否会涵盖所有电子邮件正文的情况,但是由于我的系统没有使用附件,所以我现在还可以。
不考虑quoted_printable_decode()
,我如何解决=
体内的问题。
唯一的问题是我现在收到的邮件延迟,但我会处理的