Mail to Commenter插件的發件人郵箱以及名稱的問題修正

sendmail郵件頭引發的血案
Mail to Commenter是一款評論輔助插件,通過判斷評論內容是否含有『@user 『或『@user:』的代碼,然後將評論內容用郵件發送給user。我一直在使用這款插件,當然同時也推薦給還沒有聽聞或聽聞了但還在觀望的朋友。可是這款插件有個問題,相信很多朋友都遇到了,就是發件人名稱以及郵箱地址的問題。

WordPress默認的發郵件的地址是wordpress@yourdomain.com,當然這個地址也是可以修改的。wordpress安裝目錄下,打開wp-includes\pluggable.php文件,搜索「wordpress@」,有兩處,替換成你希望的名字就可以了。不過我們這裡不討論這個問題,雖然這個問題我也順便說了解決方法了,相信也有不少朋友會想修改這個地址。

沒錯,正常情況下確實是這樣的,通過 wordpress 後台發送給用戶的郵件地址應該是 wordpress@yourdomain.com,可是偏偏給我碰到了不正常的情況,在我為解決之前搜索了下發現確實也有很多的朋友都有這個問題,Mail to Commenter作為一款優秀的使用廣泛的插件就遭遇了這個問題。通常如果你的主機是合租性質的,並且不像 Hostmonster之類的可以通過在每個子賬戶根目錄複製一個php.ini文件來配置的話,那麼在使用 Mail to Commenter 插件通過你的 WordPress 程序發送給@user中的user的信件的郵件地址的後綴極有可能是root帳戶配置的那個域名後綴。

比如我的主機是在淫蕩的大貓那裡買的合租的 MediaTemple,root帳戶配置的郵件地址是root(at)yslow(dot)info,那麼我的 Mail to Commenter插件發送給每一個被我@user的user用戶收到的郵件都將會顯示這個郵件地址而不是我希望的默認的 wordpress@yourdomain.com或者我希望的任意一個指定的email地址。當然奇怪的是並非所有人都會碰到這個問題,所以作者也並沒有完全修正這個問題。在這個YD的感冒飛揚的日子裡,我留著鼻涕,打著噴嚏,打開了Mail to Commenter插件里的mailtocommenter_functions.php文件。因為本身就是插件,自然沒必要請出淫蕩的add_filter鉤子大仙出山。郵件地址的問題無非是wp_mail()插件裡面的$header變數引起的,那就找找看插件里有沒有對$header的定義咯。

這裡有必要對wp_mail()函數進行一些粗略簡單的介紹((wp_mail()函數的更具體描述請看官方codex文檔))。wp_mail()從命名方式就可以看出這個是wordpress發送email的核心函數。wp_mail()和php自帶的mail()函數的參數差不多,注意它們都有對header信息的定義只不過都是可選的參數並不是必填參數,而當header參數未填寫的時候,發件人也就是sendmail_from的定義就存在於php.ini裡面了。

<?php wp_mail( $to, $subject, $message, $headers, $attachments ); ?>

繼續回到mailtocommenter_functions.php文件。搜索header查找到了這麼一段函數。

function mailtocommenter_send_email($to,$subject,$message){
	$blogname = get_option('blogname');   //獲取博客名稱賦值到$blogname變數里(leeiio注)
	$charset = get_option('blog_charset');
	$headers  = "From: $blogname \n" ;   //設置header裡面的from為$blogname(leeiio注)
	$headers .= "MIME-Version: 1.0\n";
	$headers .= "Content-Type: text/html;charset=\"$charset\"\n";
	$to = strtolower($to);
	return @wp_mail($to, $subject, $message, $headers);
}

也就是說,這段函數將博客的名稱設置成了From,難怪我的博客通過Mail to Commenter發出去的發件人都顯示成了如圖所示。
Mail to Commenter插件的發件人郵箱以及名稱的問題修正
十分詭異,就算獲取博客名稱也應該是Leeiio Chaos Made@yslow.info才對,可能是其中獲取參數的時候程序處理秀逗了,因為我對php也是七竅通了六竅,所以各種的緣由還有待大師來解惑。(呃,懶得去翻wordpress的函數去查原因。。)

既然如此,那麼我就只好採取強硬的手段來達到我的目的了。於是修改後的函數為:

function mailtocommenter_send_email($to,$subject,$message){
	$blogname = get_option('blogname');
	$charset = get_option('blog_charset');
	$headers = 'From: Leeiio Chaos Made <no-reply@leeiio.me>' . "\r\n\\"; //指定了發件人名稱以及發件人郵箱,注意<>括弧之前和發件人名稱用空格隔開
	$headers .= "MIME-Version: 1.0\n";
	$headers .= "Content-Type: text/html;charset=\"$charset\"\n";
	$to = strtolower($to);
	return @wp_mail($to, $subject, $message, $headers);
}

於是,如圖所示。
Mail to Commenter插件的發件人郵箱以及名稱的問題修正

根據我的一知半解,郵件header信息裡面的From:要麼是填寫純粹的郵件地址xxx@xxx.com要不是填寫帶<>的。但切勿只填寫發件人名稱,按照wordpress的wp_mail()函數處理的話,就有可能造成上圖的詭異現象了。

廢話一大堆,希望你們看懂了。不懂的話就在下面提問吧,本大濕會一一解答的。

題外話:現在很多的垃圾郵件都通過偽造郵件頭信息來達到蒙蔽廣大群眾的目的,望各位火眼金睛,分辨仔細。並不是看到發件人是xxx@mircosoft.com的郵件就是微軟發給你的中獎郵件,也有可能是騙子發給你的。
延伸閱讀:有人用我的電子郵件帳戶發垃圾郵件?

44 Responses to Mail to Commenter插件的發件人郵箱以及名稱的問題修正

  1. 🙂 呵呵,搶個沙發坐坐,順便學點東西

  2. WP是好,可是要搭上個Mysql,太貴了。
    用ZBLog實惠。 😛
    博主說的這個問題,用一個插件就解決了,什麼都可以自定義。

  3. Alex says:

    我也是使用大貓的主機,看來有必要修改一下 💡 💡 💡

  4. 任平生 says:

    哈哈,方法不錯

  5. 任平生 says:

    哦,發現個問題,輸入框中按 tab ,焦點沒移到 提交 按鈕上

  6. Leeiio says:

    @LG空調維修
    Zblog是asp的,我就不說它存在的問題了。。

    @Alex
    動手吧。

    @任平生
    呃,在Chrome下問題還是挺多的,比如你看我的頭部背景是顯示完整的么?唉,這個主題結構太老了,有空真得動動刀子了

  7. Bronco says:

    嗯,之前我也遇到了這個問題,也是這麼改的~原本想寫個教程的,結果一直米時間,加上懶。。。 ❓

  8. Leeiio says:

    @Bronco
    呃,話說我這個也是拖了好久才寫完的。看來大家的懶勁都很強大 😆

  9. welee says:

    我現在轉用Denis的Comment Reply Notification了,Mail to Commenter在原生嵌套回復下貌似有問題。

  10. Justice says:

    會不會是把Leeiio Chaos Made當做了一個人的名字…Chaos Made認成了姓氏… ❓

  11. bigCat says:

    最近還遇到個相關的問題,有空的話我一起寫了,你提到的2點就轉你的文章哈哈

    自用留言本基於wp_mail()的,很好使
    http://miao.in/contact

  12. 博客做的很好,山東LED顯示屏(www.rt37.cn)前來拜訪了,有時間回訪下我司的網站。

  13. 山東SEO(www.shandong-seo.cn)前來拜訪,有空記得回訪,多多交流技術才能進步。

  14. crossyou says:

    漢 這才發現 博主 也把校內上的 表情 給 搞來了。不會這麼巧吧。我也把校內的表情偷了一些來。
    順便過來學習下、。

  15. 吖Bee says:

    我也是用這個插件啊~ 😕

  16. Leeiio says:

    @welee
    呃,我的評論部分還是老的結構,準備有時間要升級下了。

  17. Leeiio says:

    @Justice
    呃,程序畢竟不是人,不能人工智慧,也不知道它怎麼就處理成這樣了。

  18. Leeiio says:

    @bigCat
    呃,期待你的咸濕大作。我也準備搞個自定義表單,留言頁面太長了。。

  19. Leeiio says:

    @crossyou
    呃,無巧不成書~歡迎交流

    @吖Bee
    呃,難道你的發件人是正常的?

  20. bolo says:

    這個不錯,馬上回去改

  21. Leeiio says:

    @bolo
    哈,你的倒是要改改,我收到的郵件發件人居然是空白.. 😎

  22. aunsen says:

    我還真沒怎麼注意過這個問題!

  23. 小棒打鼓 says:

    前幾天我也一直在弄這個東西,現在我按照一個網友的辦法,只是設置了自己的郵件地址就行了

  24. Jutoy says:

    啊,原來是這樣弄,之前一直想弄的說

  25. Leeiio says:

    @Jutoy
    哈哈,受教了吧 😆

  26. zwwooooo says:

    感覺有點複雜,倒是很需要,特別是有些人的主機會誤判為亂髮垃圾郵件

  27. Leeiio says:

    @zwwooooo
    哈,其實扯別的扯多了文章看起來複雜其實只看代碼部分就好了,很easy。

  28. 吖Bee says:

    今天終於用到了這個方法了…

  29. Leeiio says:

    終於碰到這個問題了?

  30. 張筱祥 says:

    ❗ 我裝了這個插件不過好像沒效果啊,不知道怎麼測試

  31. Leeiio says:

    @張筱祥
    後台有啟動這功能的說明的,諸如我這樣回復你,你就會收到提醒郵件了

  32. Skyoy says:

    修改後,可是後面還是會顯示如下「(由 代發)」,
    我修改成我的郵箱,可是後面還是顯示了伺服器自帶的郵件功能。

  33. alswl says:

    當時我也遇到這個問題,好久才解決

  34. ZH CEXO says:

    說實在的,我還沒怎麼在意這個問題,不過你提出來了,我再看看

  35. blueandhack says:

    學習了~
    MT的主機~
    WOW~
    膜拜一下大牛~

  36. 鄭州SEO says:

    還有點那麼一知半解的

  37. kent says:

    表示木有看懂 😐 我用的是linux主機,默認發郵件給管理員沒問題,然後想使用評論回復功能。找了許久,決定不用插件,而是用代碼。於是用了Comment Mail Notify(出自Willin Kan),功能跟Mail to Commenter是差不多的,不過它可以指定發件郵箱(必須以自己的域名為後綴)。問題是,即便我在cpanel已經創建了郵箱,用這個發出去的郵件還是顯示由空間商伺服器代發滴,我汗……博主有空研究下哈,先謝啦~

  38. Cubed says:

    大濕安好=。=
    主機不支持,mail函數咋辦··
    評論沒有 @sb。 就回復不能了嗎··

Leave a Reply

Your email address will not be published. Required fields are marked *