我正试图屏蔽电子邮件。基本上给客户发送一封电子邮件,例如" RandomName@MyDomain.com"并向前推进" MyRealEmail@MyDomain.com"。
我正在将电子邮件转发到我服务器上的php脚本,我想在那里使用" To"和"来自"找到邮件的真实收件人并将邮件转发给他们从发件人(发件人)部分删除任何可识别信息。
我现在可以从标题解析几乎所有数据,但我的问题在于身体。 html的身体部分可以从不同的起源变化很大。 Outlook有<html>
和<body>
部分,而Gmail只有<div>
个。无论如何,我得到了这些奇怪的&#34; =&#34;在我的原始电子邮件中也签名,包括文本和html部分,例如<=div>
!
我只是想改变&#34; From&#34;和&#34; To&#34;并保持电子邮件的其余部分非常完整,因此它的文本或html部分没有异常。
我该怎么做?我应该解析原始电子邮件并更改电子邮件的出现次数吗?我该如何发送呢?或者我应该使用phpmailer或其他类重新制作电子邮件?我怎样才能让身体正确呢?
我的托管服务提供商没有安装MailParse扩展程序,因为我在网站上看到了使用该扩展程序的一些解决方案,因此我不得不使用PHP 5.5中的可用扩展程序执行此操作
更新
我设法找出了=
问题,它是quoted-printable
,所以现在我打电话给quoted_printable_decode()
来解决这个问题。仍然试图找到改变标题之后转发电子邮件的最佳方式。
答案 0 :(得分:1)
经过多次尝试失败后,终于有了一个我可以忍受的解决方案。主机服务器不希望允许MailParse,因为它是共享托管环境中的问题,所以我选择了Mail_mimeDecode
和Mail_MIME
PEAR 扩展程序。
// 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
使用“In PHP, how do I extract multiple e-mail addresses from a block of text and put them into an array?”
对于Body,我使用以下内容查找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
来获取消息。我在这里执行数据库查找逻辑,并使用从标题中提取的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()
,而是如何解决身体中=
的问题。
唯一的问题是我现在有的邮件延迟,但我会处理那个