2012-05-16 46 views
2
--047d7b33d6decd251504bfe78895 
Content-Type: multipart/alternative; boundary=047d7b33d6decd250d04bfe78893 

--047d7b33d6decd250d04bfe78893 
Content-Type: text/plain; charset=UTF-8 

twest 

ini sebuah proiduct abru 

awdawdawdawdwa 

aw 
awdawdaw 

--047d7b33d6decd250d04bfe78893 
Content-Type: text/html; charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 

<div class=3D"gmail_quote">twest=C2=A0<div><br></div><div>ini sebuah proidu= 
ct abru</div><div><br></div><div>awdawdawdawdwa</div><div><br></div><div>aw= 
</div><div>awdawdaw</div> 
</div><br> 

--047d7b33d6decd250d04bfe78893-- 
  1. 我怎麼能收郵件文本/純和文本/ html內容與正則表達式?
  2. 一封電子郵件只有1個內容正文嗎?包含一個文本/ html和一個文本/純文本

*繼承人一個片段什麼我現在做錯了。提取體

$parts = explode('--', $this->rawemail); 
    $this->headers = imap_rfc822_parse_headers($this->rawemail); 
    # var_dump($parts); 
    # Process the parts 
    foreach ($parts as $part) 
    { 
     # Get Content text/plain 
     if (preg_match('/Content-Type: text\/plain;/', $part)) 
     { 
      $body_parts = preg_split('/\n\n/', $part); 

      # If Above the newline (Headers) 
      if ($body_parts[0]) 
      { 
       # var_dump($body_parts[0]); 
      } 

      # If Below the newline (Data) 
      if ($body_parts[1]) 
      { 
       var_dump($body_parts[1]); 
      } 
     } 

     # Get Content text/html 
     if (preg_match('/Content-Type: text\/html;/', $part)) 
     { 
      $body_parts = preg_split('/\n\n/', $part); 

      # If Above the newline (Headers) 
      if ($body_parts[0]) 
      { 
       # var_dump($body_parts[0]); 
      } 

      # If Below the newline (Data) 
      if ($body_parts[1]) 
      { 
       var_dump($body_parts[1]); 
      } 
     } 
+0

是否有你沒有使用像imap_fetchbody()這樣的東西來獲取正文數據的原因? – glenatron

+0

@glenatron電子郵件管道?即時通訊做一個研究縮放我的應用程序http://stackoverflow.com/questions/10554482/email-parsing-and-processing-architechture#comment13670964_10554482 –

回答

4

我認爲你最好一次把電子郵件行下去,因爲它是電子郵件形成中更重要的換行符。

你的規則是:

  • 如果你得到一個雙線路中斷的話,身體開始 - 純文本類型(如沒有頭指示哪個)。
  • 否則,繼續下去,直到獲得「邊界=」位,然後記錄邊界並跳入「尋找邊界」模式。
  • 然後,當您找到一個邊界時,跳入「尋找內容類型或雙重換行」模式,並查找Content-Type(和note內容類型)或double new-line(頭文件已完成,身體下一步,直到下一個邊界)
  • 在閱讀消息的正文時,你回到「尋找邊界」模式重複進程。

我從很久以前記得的東西 - 所以下面可能不是100%準確,但我會提到以防萬一。使用附件時要小心文件,因爲您可以獲得兩個「邊界」標記。但是一個邊界與另一個邊界相交,所以如果你遵循上面的規則(即抓住第一個邊界並堅持下去),那麼你應該沒問題。但也有一些attachemnts測試腳本:)


編輯:問的問題更多的信息。電子郵件可以具有與用戶希望編碼的一樣多的「身體」。您可以使用純文本格式和HTML格式,UTF編碼版本,RTF版本,甚至莫爾斯碼版本(如果客戶知道如何處理「Content-Type Morse/Code」!)。有時你不會得到純文本,但只有HTML版本(頑皮的用戶)。有時HTML實際上沒有內容類型聲明(根據客戶端的不同,它可能會或可能不會顯示爲HTML)。邊界也分裂了附件。豐富的測試是Outlook的一個難題(儘管公平地說,它通常被轉換爲HTML)。所以不,有0到X的身體。

+0

「我認爲你最好一次往電子郵件行,因爲它是在電子郵件形成中更爲重要的突破。「 - 對於我試圖找到FROM的情況: - 我正在用RegEx思考它......逐行似乎更安全。 – ProVega