簡體   English   中英

如何使用imap擴展程序獲取原始電子郵件數據?

[英]How to get raw email data with the imap extension?

我正在尋找一種方法來下載整個原始電子郵件數據(包括附件),類似於您在Gmail中點擊“顯示原始內容”所獲得的內容。

目前,我可以通過以下代碼獲取原始標題和郵件正文的某些部分:

$this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT);
...
$email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0");
$email->RawEmail .= "\n".imap_fetchbody($this->MailBox, $msgNo, "1");

另外我知道更改imap_fetchbody的第3個參數可能會返回編碼的附件。 猜猜我需要一個循環來獲取原始電子郵件的一部分,但是什么是停止循環的條件?

是否有一種簡單的方法可以立即獲得整個電子郵件?

任何幫助,將不勝感激。

當我在尋找同樣的問題時,我遇到了這個問題。 我知道它必須比hakre的解決方案更容易,我在5年前帖子上找到了imap_fetchbody頁面上的正確答案。

要獲取完整的原始消息,請使用以下命令:

$imap_stream = imap_open($server, $username, $password);
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, "");

請注意空字符串作為imap_fetchbody第三個參數,這表示電子郵件的所有部分和子部分,包括標題和所有正文。

hakre的答案是過於完整的,如果你真的不關心結構,那么你將不需要imap_fetchstructure

對於簡單的“顯示源”,您應該只需要imap_fetchheaderimap_body

例:

$conn = imap_open('{'."$mailServer:$port/pop3}INBOX", $userName, $password, OP_SILENT && OP_READONLY);
$msgs = imap_fetch_overview($conn, '1:5'); /** first 5 messages */
foreach ($msgs as $msg) {
    $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);
    print $source;
}

我的答案是“過度完整” ,如果您不需要電子郵件的整個結構,請參閱Boy Baukema對更直接的“查看源”方式的回答

如果你想獲取所有,你需要獲取

由於mime-message可以有多個主體,因此您需要先處理每個部分。 為了降低負載對服務器使用FT_PREFETCHTEXT的選項imap_fetchheader 關於imap_fetchstructure一些示例代碼在另一個答案中顯示了處理imap連接並通過封裝迭代部分消息。

常見的錯誤是使用"\\n"PHP_EOL

根據RFC RFC821,RFC2060,應使用RFC1939 "\\r\\n" 雖然一些mailserver自動轉換出錯,但Cyrus並沒有拋出錯誤。

PHP_EOL是根據恆定的,它是一個系統的"\\n"在Linux上, "\\r"在Mac和"\\r\\n"在Windows上,例如。

此外, imap_fetchheader()包含預期的尾部"\\r\\n" 所以正確的例子是:

 $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM