2015-11-26 48 views
0

我試圖屏蔽電子郵件。基本上給一個像「[email protected]」這樣的客戶端發送一封郵件,並將其轉發給「[email protected]」。如何在PHP中更改管道轉發電子郵件的「發件人」和「收件人」部分

我正在將電子郵件轉發到我的服務器上的一個php腳本,我想在其中使用「收件人」和「發件人」來查找郵件的真正收件人並將郵件轉發給他們,以從中刪除任何可識別的信息發件人(發件人)部分。

我現在可以從標題中解析幾乎所有的數據,但我的問題是與身體有關。 html正文部分可能因不同來源而有所不同。 Outlook有<html><body>部分,而Gmail只有<div> s。無論如何,我在原始電子郵件中也會得到這些奇怪的「=」符號,例如<=div>

我只是想改變「From」和「To」,並保持電子郵件的其餘部分非常精確,因爲它的文本或html部分沒有異常。

我該怎麼做?我應該解析原始電子郵件並更改電子郵件的發生情況嗎?那我怎麼發送它呢?或者我應該使用phpmailer或其他類來重製電子郵件?我怎麼才能得到正確的身體呢?

我的託管服務提供商沒有安裝MailParse擴展,因爲我已經看到了使用該擴展名在網站上的一些解決方案,所以我有做到這一點使用可用的擴展在PHP 5.5

UPDATE

我設法弄清了=問題,它是quoted-printable,所以現在我打電話quoted_printable_decode()來解決這個問題。儘管如此,仍然試圖找出改變標題後轉發電子郵件的最佳方式。

回答

1

經過很多失敗的嘗試,終於有一個我可以生活的解決方案。主機服務器不想允許MailParse,因爲它是共享主機環境中的問題,所以我使用Mail_mimeDecodeMail_MIMEPEAR擴展名。

// 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(),我如何解決與=在身體問題。

唯一的問題是我現在有郵件的延遲,但我會處理那

相關問題