在處理一個郵件系統的項目時,我遇到了一個棘手的問題:用戶的郵件回復內容中包含大量引文、簽名和不規則的格式。這些內容使得我很難準確地提取出有效的回復信息。我嘗試了多種方法,但都未能有效解決,直到我發現了 willdurand/email-reply-parser 這個庫。
willdurand/email-reply-parser 是一個基于 gitHub 的 email_reply_parser ruby 庫的 php 實現,它專為解析純文本郵件內容而設計。這個庫的使用非常簡單,通過 composer 即可安裝:
composer require willdurand/email-reply-parser
使用這個庫,你只需幾行代碼就能解析郵件內容:
use EmailReplyParserParserEmailParser; $email = (new EmailParser())->parse($emailContent);
解析后的郵件內容會返回一個 Email 對象,該對象包含多個 Fragment 對象。你可以通過 getFragments() 方法獲取所有片段,或者使用 getVisibleText() 方法獲取被認為是“可見”的內容。
每個 Fragment 對象代表郵件內容的一部分,并提供了以下方法:
$fragment = current($email->getFragments()); $fragment->getContent(); $fragment->isSignature(); $fragment->isQuoted(); $fragment->isHidden(); $fragment->isEmpty();
此外,你還可以使用 EmailReplyParser 類的一行代碼來解析郵件或獲取可見內容:
$email = EmailReplyParserEmailReplyParser::read($emailContent); $visibleText = EmailReplyParserEmailReplyParser::parseReply($emailContent);
雖然這個庫非常強大,但也有一些已知的問題需要注意。例如,引用的郵件頭部如果有額外的換行或被郵件客戶端分成多行,可能會導致解析失敗。此外,不同郵件客戶端對簽名和引文的處理方式也不盡相同,可能會影響解析結果。
為了解決這些問題,你可以使用正則表達式來清理郵件內容。例如,清除日期和作者信息:
$fragment_without_date_author = preg_replace( '/nOn(.*?)wrote:(.*?)$/si', "", $fragment->getContent() );
總的來說,willdurand/email-reply-parser 庫極大地簡化了郵件內容的解析過程。它不僅提高了處理效率,還提供了靈活的 API,幫助我更好地處理用戶的郵件回復。在實際應用中,這個庫顯著提升了我的項目性能,解決了郵件解析的難題。