之前做一個小功能,就是用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解決不了。