2010-06-18 87 views
5

我有一個原始電子郵件(MIME multipart),我想在網站上顯示此內容(例如,在iframe中,包含HTML部分和純文本部分的選項卡等)。是否有任何CPAN模塊或Template :: Toolkit插件可用於幫助我實現這一目標?在網站上解析並顯示MIME多部分電子郵件

目前,它看起來像我必須用Email :: MIME解析消息,然後遍歷所有部分,併爲所有不同的MIME類型編寫處理程序。

這是一個遠射,但我想知道如果有人已經完成了所有這一切?如果我自己嘗試編寫處理程序,這將是一個漫長而容易出錯的過程。

感謝您的任何幫助。

+1

dupe of http://stackoverflow.com/questions/2795893 – daxim 2010-06-18 12:20:47

+0

感謝daxim,我沒有發現,當我看到之前。看起來我必須使用Email :: MIME。 – aidan 2010-06-18 16:26:26

回答

4

它聽起來並不像一個困難的工作對我說:

use Email::MIME; 
my $parsed = Email::MIME->new($message); 
my @parts = $parsed->parts; # These will be Email::MIME objects, too. 
print <<EOF; 
<html><head><title>!</title></head><body> 
EOF 
for my $part (@parts) {  
    my $content_type = $parsed->content_type; 
    if ($content_type eq "text/plain") { 
     print "<pre>", $part->body(), "</pre>\n"; 
    } 
    elsif ($content_type eq "text/html") { 
     print $part->body(); 
    }   
    # Handle some more cases here 
} 
print <<EOF; 
</body></html> 
EOF 
+4

您需要清理它。你不想讓一個電子郵件注入任意的JS到你的網站! – Quentin 2010-06-18 12:15:44

+2

更不用說在文本/平面部分編碼實體了。 – cjm 2010-06-18 15:16:47

+0

對我來說,聽起來仍然不是件好事。實體是這樣艱難的:'//[[&gt;] /「&#」。ord($ 1)。「;」/ ge'和通過HTML :: Scrubber進行HTML清理。 – 2010-06-18 15:23:13

6

我其實剛剛在幾個月前處理過這個問題。我爲我工作的產品添加了電子郵件功能,包括髮送和接收。第一部分是向用戶發送提醒,但我們不想管理客戶管理員的反彈,我們決定在郵件收件箱中顯示管理員可以在沒有我們的情況下看到反彈和回覆,管理員可以處理調整電子郵件地址,如果他們需要。

因此,我們接受發送到我們收看的所有電子郵件。我們使用VERP將電子郵件與用戶相關聯,並將整個電子郵件原樣存儲在數據庫中。然後,當管理員請求查看電子郵件時,我們必須解析電子郵件。

我的第一次嘗試與先前的答案非常相似。如果其中一個部分是html,則顯示它。如果是文本,請顯示它。否則,請顯示原始的原始電子郵件。這幾個郵件真正快速地分解了一些不是由sendmail生成的郵件。 Outlook,Exchange和其他一些電子郵件系統不這麼做,他們使用多部分來發送電子郵件。經過大量的挖掘和詛咒之後,我發現這個問題似乎並沒有很好的記錄。在查閱MHonArc並閱讀RFC(RFC2045和RFC2046)的幫助下,我決定了下面的解決方案。我決定不使用MHonArc,因爲我無法輕鬆地重用解析和顯示功能。我不會說這是完美的,但我們使用它已經足夠好了。

首先,接收郵件並使用Email :: MIME解析它。然後使用Email :: MIME爲您提供 - > parts()部分的數組,調用名爲get_part的函數。

get_part,對於它傳遞的每個部分,解碼內容類型,在哈希中查找它,如果存在,調用與該內容類型關聯的函數。如果解碼器能夠給我們一些東西,把它放在結果數組上。

拼圖的最後一塊是這個解碼器陣列。基本上,它定義了內容類型我可以處理:

  • text/html的
  • 純文本/
  • 消息/遞送狀態,這實際上也是純文本
  • multipart/mixed
  • multipart/related
  • 多部分/替代

的非多段我返回原樣。對於混合,相關和替代,我只需在該MIME節點上調用get_parts並返回結果。因爲替代方法很特殊,所以在調用get_parts之後它有一些額外的代碼。它只會返回HTML,如果它有一個HTML部分,或者它只會返回它的文本部分有一個文本部分。如果它沒有,它不會返回任何有效的。

有效內容類型散列的優點是我可以根據需要輕鬆添加更多部分的邏輯。到get_parts完成時,您應該有一系列您關心的所有內容。

我應該提到另一個項目。作爲其中的一部分,我們創建了一個實際服務於這些消息的獨立域。管理員工作的主要域名將拒絕提供該信息並將瀏覽器重定向到我們的用戶內容域。這第二個域只會提供用戶內容。這是爲了幫助瀏覽器正確地將內容從我們的主域中轉移出來。看到相同的來源政策(http://en.wikipedia.org/wiki/Same_origin_policy