簡體   English   中英

PHP + 郵件命令 + 發送郵件

[英]PHP + Mail Command + Sendmail

我有一個問題困擾了我一段時間,無論我在哪里看,我都找不到我所看到的解釋。

我有一個服務器,它通過腳本發送多封基於特定標准的電子郵件。 如果作業遇到問題,例如缺少客戶端(在兩個系統之間)或缺少產品代碼(在兩個系統之間),或者如果它使用訂單從較新的系統更新舊系統。 現在,這些腳本在歐洲的許多地方運行:赫爾辛基、呂勒奧、斯德哥爾摩和奧斯陸。

我的難題是,對於斯德哥爾摩和某些活動,沒有發送電子郵件,它們是針對其他地點和其他活動的。 但是有兩個 go AWOL,當我說 go AWOL 時,我聽起來好像它們已發送但從未收到。 事實是他們實際上並沒有離開服務器。

PHP Mail 命令在嘗試向 Stockholm 發送兩個事件時產生錯誤,這是通過監視 PHP 郵件命令的返回並在返回為 false 時記錄下來的。 查看 sendmail 日志文件中的條目,包括 output 和錯誤,同時發出了失敗的 PHP 郵件命令,沒有任何,啟用 Z2FEC392304A5C23AC17CZ 郵件命令后,可以看到它正在記錄郵件,好的。 但由於某種原因,該命令無法正常運行。

我已經更改了對位置的描述,但這並沒有什么不同,而且考慮到某些事件確實發送了電子郵件,這並不讓我感到驚訝。 在記錄了失敗的 Mail 命令后,我還將 email 的主題行和正文記錄在一個文件中。 如果我將它們轉換為獨立的測試郵件文件,使用與主腳本相同的代碼,它工作正常。

如果問題是隨機的,那么我希望看到其他位置和其他事件的失敗,但事實並非如此。 我認為主題行太長了,但有更長的,那么它不應該通過我的獨立測試郵件腳本 go 。 我已經更改了處理位置的順序,但同樣,由於同樣的原因,它在失敗方面非常一致。

總而言之:

  • 兩個事件的一個位置不會發送任何電子郵件,但其他事件和位置是。
  • PHP 郵件命令失敗並返回 FALSE 錯誤代碼。
  • PHP 郵件日志文件顯示正在調用的郵件命令。
  • sendmail 日志文件不記錄失敗的郵件命令,無論是在 err 還是正常的 output 中,盡管我可以看到所有其他成功的電子郵件。
  • 修改位置名稱並沒有什么不同,但它不會因為其他事件正在發送好。
  • 使用失敗的 email 的主題和正文填充測試腳本,發送正常(測試腳本與主腳本相同)。
  • 更改腳本調用位置的順序沒有區別(腳本一次處理一個位置)。

關於在哪里看,接下來要檢查什么的任何想法,我都是眼睛和耳朵。 謝謝。

我必須感謝那些回答我問題的人,然而,我終於找到了這個問題的症結所在(他說交叉手指)。

雖然 PHP 郵件命令失敗,但僅針對特定位置,我決定查看 PHP 認為錯誤是什么。 這是通過插入代碼實現的:

        if($success === true)
            echo("Email sent @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
        else
        {
            echo("Unable to send email @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
            print_r(error_get_last());
        }

“error_get_last()”的打印顯示 sendmail 命令無法執行:

Array
(
    [type] => 2
    [message] => mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i '
    [file] => /var/www/html/dataloader/angleConvertClass.php
    [line] => 205
)

調查為什么會發生這種情況,我偶然發現了一篇關於 memory 使用情況的帖子,並且缺少可用的 memory 可能導致外部程序無法執行。 因此,我決定在發出郵件命令之前查看 PHP 腳本消耗了多少 memory。

        try
        {
            print "\n--> PHP Memory usage ".memory_get_usage(true)." bytes <--\n";

            $success = mail($to, $subject, $body, $header_string);
            $local_db->setMessageSent($to.$body);

            if($success === true)
                echo("Email sent @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
            else
            {
                echo("Unable to send email @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
                print_r(error_get_last());
            }
        }
        catch (Exception $exc)
        {
            echo("Email failed big time @ ".date("Y-m-d H:i:s")."! $to, $subject".PHP_EOL);
            echo $exc->getTraceAsString().PHP_EOL;
        }

Leaving it a while I then rechecked the log file and found that the PHP script was consuming over 32GB of memory, The server has 32GB of main memory and 6GB of swap, so I'm guessing there is enough for the script to run. 但不足以啟動可執行文件。

我很想補充一點,這是我繼承的軟件,而不是筆下的軟件,並且有點討厭重寫它,因為它是 2 年前問題的臨時解決方案。 該代碼使用非常大的 arrays 從遺留系統的數據庫中加載結果,以與新系統的結果進行比較。 因此,巨大的 memory 占地面積!

我已經要求將服務器的主要 memory 從 32GB 增加到 64GB,因為這將比重寫和測試代碼便宜得多。 希望這能解決問題。

暫無
暫無

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

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