Debug很重要

freephp發表於2020-08-16

之前做一個小功能,就是用php傳送郵件,專案中已經使用了wordpress的wp_mail,所以同事建議我繼續用wp_mail函式。

然而遇到了一個奇怪的情況,郵件沒有發出去,也沒有任何報錯日誌。

照理說,這是一個非常成熟的內建函式了,只要是在管理後臺設定好了相關郵件配置,那麼就一定可以順利傳送郵件。
我首先嚐試了一下php最原生的mail函式,是可以順利傳送出去的。

這個時候我陷入了僵局,我甚至在想是否是什麼更深處的服務設定出了問題,雖然mail函式可以傳送,其實應該已經能說明郵件服務沒有問題了。

這個時候就顯示出Google技巧了,如果一直輸入wp_mail not working 之類的,永遠都是在說要檢查wordpress網站的後臺相關配置什麼的,這酒陷入了死迴圈了。

於是我換了一個思路,是否能想辦法debug出更多細節,於是我Google瞭如下內容:

wp_mail failed debug

然後我發現了這個連結:
https://www.codeforest.net/debugging-wp-mail-like-a-boss-debugger
其中有關於設定debug的action

// define the wp_mail_failed callback 
function action_wp_mail_failed($wp_error) 
{
    return error_log(print_r($wp_error, true));
}
          
// add the action 
add_action('wp_mail_failed', 'action_wp_mail_failed', 10, 1);

當然這個是個人開發者的技術部落格,還是要看看官方是怎麼用這個wp_mail_failed hook的,通過搜尋關鍵詞:wp_mail_failed,找到官方的文件如下:

https://developer.wordpress.org/reference/hooks/wp_mail_failed/

其中使用者給出的一個用例非常合適,具體程式碼如下:

// show wp_mail() errors
add_action( 'wp_mail_failed', 'onMailError', 10, 1 );
function onMailError( $wp_error ) {
    echo "<pre>";
    print_r($wp_error);
    echo "</pre>";
}       

再次執行指令碼,終於有了錯誤日誌,輸出結果如下:

[errors] => Array
        (
            [wp_mail_failed] => Array
                (
                    [0] => Invalid address:  (setFrom) <server name here>
                )

        )

所以是設定了一個無效的地址,也就是傳送方的設定,如果是增加相關設定即可,程式碼如下:

add_filter( 'wp_mail_from', function() { return "noreply@gmail.com" ; });
    add_filter( 'wp_mail_from_name',  function() { return "noreply" ; } );
    

這次debug很有意思,讓我想起了多年前那次在人社局裡那次關於mongoDB無響應的問題。突然覺得歲月無限好,沒有bug解決不了。

相關文章