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的邮件就是微软发给你的中奖邮件,也有可能是骗子发给你的。
延伸阅读:有人用我的电子邮件帐户发垃圾邮件?

  • 🙂 呵呵,抢个沙发坐坐,顺便学点东西

  • WP是好,可是要搭上个Mysql,太贵了。
    用ZBLog实惠。 😛
    博主说的这个问题,用一个插件就解决了,什么都可以自定义。

  • 我也是使用大猫的主机,看来有必要修改一下 💡 💡 💡

  • 哈哈,方法不错

  • 哦,发现个问题,输入框中按 tab ,焦点没移到 提交 按钮上

  • @LG空调维修
    Zblog是asp的,我就不说它存在的问题了。。

    @Alex
    动手吧。

    @任平生
    呃,在Chrome下问题还是挺多的,比如你看我的头部背景是显示完整的么?唉,这个主题结构太老了,有空真得动动刀子了

  • 嗯,之前我也遇到了这个问题,也是这么改的~原本想写个教程的,结果一直米时间,加上懒。。。 ❓

  • @Bronco
    呃,话说我这个也是拖了好久才写完的。看来大家的懒劲都很强大 😆

  • 我现在转用Denis的Comment Reply Notification了,Mail to Commenter在原生嵌套回复下貌似有问题。

  • 会不会是把Leeiio Chaos Made当做了一个人的名字…Chaos Made认成了姓氏… ❓

  • 最近还遇到个相关的问题,有空的话我一起写了,你提到的2点就转你的文章哈哈

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

  • 学习下

  • 博客做的很好,山东LED显示屏(www.rt37.cn)前来拜访了,有时间回访下我司的网站。

  • 山东SEO(www.shandong-seo.cn)前来拜访,有空记得回访,多多交流技术才能进步。

  • 汉 这才发现 博主 也把校内上的 表情 给 搞来了。不会这么巧吧。我也把校内的表情偷了一些来。
    顺便过来学习下、。

  • 我也是用这个插件啊~ 😕

  • @welee
    呃,我的评论部分还是老的结构,准备有时间要升级下了。

  • @Justice
    呃,程序毕竟不是人,不能人工智能,也不知道它怎么就处理成这样了。

  • @bigCat
    呃,期待你的咸湿大作。我也准备搞个自定义表单,留言页面太长了。。

  • @crossyou
    呃,无巧不成书~欢迎交流

    @吖Bee
    呃,难道你的发件人是正常的?

  • 八错

  • 这个不错,马上回去改

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

  • 我还真没怎么注意过这个问题!

  • 前几天我也一直在弄这个东西,现在我按照一个网友的办法,只是设置了自己的邮件地址就行了

  • 啊,原来是这样弄,之前一直想弄的说

  • @Jutoy
    哈哈,受教了吧 😆

  • 感觉有点复杂,倒是很需要,特别是有些人的主机会误判为乱发垃圾邮件

  • @zwwooooo
    哈,其实扯别的扯多了文章看起来复杂其实只看代码部分就好了,很easy。

  • 今天终于用到了这个方法了…

  • 终于碰到这个问题了?

  • ❗ 我装了这个插件不过好像没效果啊,不知道怎么测试

  • @张筱祥
    后台有启动这功能的说明的,诸如我这样回复你,你就会收到提醒邮件了

  • 修改后,可是后面还是会显示如下“(由 代发)”,
    我修改成我的邮箱,可是后面还是显示了服务器自带的邮件功能。

    • @Skyoy 你用的是什么插件?怎么会出现由 代发的字样?

    • @Leeiio

      也是Mail to Commenter。
      根据你的修改后,可以显示我修改后的邮件地址,可是还是会暴露以前服务器邮件发送的地址。

    • @Skyoy 呃,不是很明白状况,可以截图看看。

  • 当时我也遇到这个问题,好久才解决

  • 说实在的,我还没怎么在意这个问题,不过你提出来了,我再看看

  • 学习了~
    MT的主机~
    WOW~
    膜拜一下大牛~

  • 还有点那么一知半解的

  • 烟雨任平生

  • kent

    表示木有看懂 😐 我用的是linux主机,默认发邮件给管理员没问题,然后想使用评论回复功能。找了许久,决定不用插件,而是用代码。于是用了Comment Mail Notify(出自Willin Kan),功能跟Mail to Commenter是差不多的,不过它可以指定发件邮箱(必须以自己的域名为后缀)。问题是,即便我在cpanel已经创建了邮箱,用这个发出去的邮件还是显示由空间商服务器代发滴,我汗……博主有空研究下哈,先谢啦~

  • 大湿安好=。=
    主机不支持,mail函数咋办··
    评论没有 @sb。 就回复不能了吗··