如何在 PHP 中更改管道转发的电子邮件“发件人”和“收件人”部分

Posted

技术标签:

【中文标题】如何在 PHP 中更改管道转发的电子邮件“发件人”和“收件人”部分【英文标题】:How to change a pipe-forwarded email's "From" and "To" section in PHP 【发布时间】:2016-02-29 00:58:25 【问题描述】:

我正在尝试屏蔽电子邮件。基本上给“RandomName@MyDomain.com”这样的客户发一封电子邮件,然后转发“MyRealEmail@MyDomain.com”。

我正在将电子邮件转发到我服务器上的 php 脚本,我想在其中使用“收件人”和“发件人”来查找邮件的真正收件人并将邮件转发给他们,从邮件中删除任何可识别信息发件人(发件人)部分。

我现在可以从标题中解析几乎所有数据,但我的问题在于正文。 html 正文部分可能因不同的来源而有很大差异。 Outlook 有<html><body> 部分,而Gmail 只有<div>s。无论如何,我的原始电子邮件中也出现了这些奇怪的“=”符号,包括文本和 html 部分,例如 <=div>!

我只想更改“发件人”和“收件人”,并将电子邮件的其余部分保持原样,以便其文本或 html 部分没有异常。

我该怎么做?我应该只解析原始电子邮件并更改电子邮件的出现吗?那我怎么寄呢?还是我应该使用 phpmailer 或其他类重新制作电子邮件?那我怎样才能让身体正确呢?

我的托管服务提供商没有安装 MailParse 扩展,因为我在网站上看到了一些使用该扩展的解决方案,所以我必须使用 PHP 5.5 中的可用扩展来完成此操作

更新

我设法找出了= 的问题,它是quoted-printable,所以现在我打电话给quoted_printable_decode() 来解决这个问题。不过,在更改标题后仍在尝试找出转发电子邮件的最佳方式。

【问题讨论】:

【参考方案1】:

经过多次失败的尝试,终于有了一个我可以接受的解决方案。主机服务器不想允许 MailParse,因为这是他们共享主机环境的问题,所以我选择了 Mail_mimeDecodeMail_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?”的解决方案

对于正文,我使用以下内容查找 texthtml 部分:

$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 来传达信息。我在这里执行我的数据库查找逻辑,并使用从标题中提取的FromTo 找到真正的目的地和屏蔽的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(),我是如何解决正文中= 的问题的。

唯一的问题是我现在收到的邮件延迟,但我会处理的

【讨论】:

以上是关于如何在 PHP 中更改管道转发的电子邮件“发件人”和“收件人”部分的主要内容,如果未能解决你的问题,请参考以下文章

php 在传出的WordPress电子邮件中更改发件人名称

php 更改发件人电子邮件Wordpress

如何更改后缀的默认电子邮件地址? [关闭]

电子邮件转发会删除 Google 应用脚本中的原始发件人电子邮件地址

更改发件人名称 php mail 而不是 sitename@hostname.com

如何更改Outlook邮件的发件人?