如何在 PHP 中更改 pipe-forwarded 电子邮件的 "From" 和 "To" 部分
How to change a pipe-forwarded email's "From" and "To" section in PHP
我正在尝试屏蔽电子邮件。基本上给 "RandomName@MyDomain.com" 这样的客户发一封电子邮件,然后转发给 "MyRealEmail@MyDomain.com".
我正在将电子邮件转发到我服务器上的 php 脚本,我想在其中使用 "To" 和 "From" 找到邮件的真正收件人并转发发给他们的消息从发件人(发件人)部分删除任何可识别信息。
我现在可以从 header 解析几乎所有数据,但我的问题是 body。 html body 部分可能因来源不同而有很大差异。 Outlook 有 <html>
和 <body>
部分,而 Gmail 只有 <div>
部分。无论如何,我的原始电子邮件中也出现了这些奇怪的“=”符号,在文本和 html 部分,例如 <=div>
!
我只想更改 "From" 和 "To" 并保持电子邮件的其余部分几乎完全原样,这样它的文本或 html 部分。
我该怎么做?我应该只解析原始电子邮件并更改电子邮件的出现吗?那我怎么寄呢?还是我应该使用 phpmailer 或其他 class 重新制作电子邮件?那我怎样才能让 body 正确呢?
我的托管服务提供商没有安装 MailParse 扩展,因为我在网站上看到一些使用该扩展的解决方案,所以我必须使用 PHP 5.5[=21= 中的可用扩展来完成此操作]
更新
我设法解决了 =
问题,它是 quoted-printable
,所以现在我打电话给 quoted_printable_decode()
来解决这个问题。不过,在更改 header 后仍在尝试找出转发电子邮件的最佳方式。
经过多次失败的尝试,终于有了一个我可以接受的解决方案。主机服务器不想允许 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
来传达信息。我在这里执行我的数据库查找逻辑,并使用从 header.
中提取的 From
和 To
找到真正的目的地和屏蔽的 From
电子邮件地址
$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()
,我是如何解决 body 中 =
的问题的。
唯一的问题是我现在遇到的邮件延迟,但我会处理的
我正在尝试屏蔽电子邮件。基本上给 "RandomName@MyDomain.com" 这样的客户发一封电子邮件,然后转发给 "MyRealEmail@MyDomain.com".
我正在将电子邮件转发到我服务器上的 php 脚本,我想在其中使用 "To" 和 "From" 找到邮件的真正收件人并转发发给他们的消息从发件人(发件人)部分删除任何可识别信息。
我现在可以从 header 解析几乎所有数据,但我的问题是 body。 html body 部分可能因来源不同而有很大差异。 Outlook 有 <html>
和 <body>
部分,而 Gmail 只有 <div>
部分。无论如何,我的原始电子邮件中也出现了这些奇怪的“=”符号,在文本和 html 部分,例如 <=div>
!
我只想更改 "From" 和 "To" 并保持电子邮件的其余部分几乎完全原样,这样它的文本或 html 部分。
我该怎么做?我应该只解析原始电子邮件并更改电子邮件的出现吗?那我怎么寄呢?还是我应该使用 phpmailer 或其他 class 重新制作电子邮件?那我怎样才能让 body 正确呢?
我的托管服务提供商没有安装 MailParse 扩展,因为我在网站上看到一些使用该扩展的解决方案,所以我必须使用 PHP 5.5[=21= 中的可用扩展来完成此操作]
更新
我设法解决了 =
问题,它是 quoted-printable
,所以现在我打电话给 quoted_printable_decode()
来解决这个问题。不过,在更改 header 后仍在尝试找出转发电子邮件的最佳方式。
经过多次失败的尝试,终于有了一个我可以接受的解决方案。主机服务器不想允许 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
来传达信息。我在这里执行我的数据库查找逻辑,并使用从 header.
From
和 To
找到真正的目的地和屏蔽的 From
电子邮件地址
$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()
,我是如何解决 body 中 =
的问题的。
唯一的问题是我现在遇到的邮件延迟,但我会处理的