Loading...

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发出去的发件人都显示成了如图所示。

十分诡异,就算获取博客名称也应该是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); }
于是,如图所示。

根据我的一知半解,邮件header信息里面的From:要么是填写纯粹的邮件地址xxx@xxx.com要不是填写带<>的
废话一大堆,希望你们看懂了。不懂的话就在下面提问吧,本大湿会一一解答的。
题外话:现在很多的垃圾邮件都通过伪造邮件头信息来达到蒙蔽广大群众的目的,望各位火眼金睛,分辨仔细。并不是看到发件人是xxx@mircosoft.com的邮件就是微软发给你的中奖邮件,也有可能是骗子发给你的。
延伸阅读:有人用我的电子邮件帐户发垃圾邮件?


