题目真长……

昨天晚上弄到三点,对于标题的问题,也没整出个结果来感觉到不睡觉很有压力,只能睡了。

今天白天工作,很不在状态,一心就想着怎么解决问题。在工作的过程中,下定决心,算了,研究原代码,这可能才是最简单解决问题的方法。因为租用的服务器是不可能单独给我开放接受通配符的邮址(或者说任意地址)。只能改原代码了。

很快制定了解决问题的办法。使用固定的Email地址来接收所有用户发送来的,使用脏的方式来应对手机发送博客的方法,就是指使用手机邮箱,而不使用短消息。这有两个好处,一个是用户的经济负担会减少,另一个可以尽可能地避免乱码问题。收到消息之后,通过来源电子邮箱地址来判断用户,因为不使用短信方式,可以利用Email的标题来验证用户身份。而邮件的内容做为贴子的内容贴出来。当然这样有一个不好,就是邮件可能会超出140字符的设置,这样会被自动截短。

大约的思路想清楚了,就开始做google research。这个过程,说长不长,说短不短,等到成功发贴的时候,都感觉天都黑了。

步骤如下:

  1. 在服务器商提供的cPanel内新建一个邮件地址,用于接收邮箱来源的贴子。比如说weibo@qiuworld.com这样一个邮址。
  2. 对这个邮址进行转发。在cPanel内使用转发器,设置转发的原信箱为:weibo@qiuworld.com,转发到的地址使用高级选单里的转发到文件,目标文件是maildaemon.php。注意这个文件的地址一定要写对,比如/public_html//scripts/maildaemon.php这样。在写完提交之后注意查看生成的转发器地址是否正确。
  3. 进入文件管理器,修改maildaemon.php的文件属性为755。如果文件不能被执行的话是无法处理转发过来的邮件的。
  4. 打开maildaemon.php文件,对它进行修改,
    第一行#!/usr/bin/env php修改成:#!/usr/bin/php -q
    这样做的目的是因为这个文件虽然能正确处理邮件,但是服务器仍然会认为文件没有得到处理而报错。加了-q指令后让服务器不再报错。

    第208行及216行都使用到了mailparse_rfc822_parse_addresses()程序,但是这个程序是由PECL来扩展的,并不是所有服务器都会提供mailparse这个文件的。而正好我的就没有提供,只好自己写两句替换掉它:
    原语句:
    $froms = mailparse_rfc822_parse_addresses($from_hdr);
    改为:
    preg_match(‘/[\\w\\.\\-+=*_]*@[\\w\\.\\-+=*_]*/’, $from_hdr , $froms);
    原语句:
    $from = $froms[0];
    $addr = common_canonical_email($from['address']);
    改为:
    $addr = $froms[0];
    原语句:
    $tos = mailparse_rfc822_parse_addresses($to_hdr);
    改为:
    preg_match(‘/[\\w\\.\\-+=*_]*@[\\w\\.\\-+=*_]*/’, $to_hdr , $tos);
    原语句:
    if (strcasecmp($incoming, $to['address']) == 0) {
    改为:
    if (strcasecmp($incoming, $to) == 0) {

    第300行是对邮件进行拆解的,
    原语句:
    $to = $parsed->headers['to'];
    改为:
    $to = $parsed->headers['subject'];

  5. 修改文件的说明,告知用户如何使用邮箱来发贴:使用注册的手机邮箱做为发送邮箱,使用刚才设置的邮件地址为接收邮址,这里就是weibo@qiuworld.com,邮件的标题必须是一个电子邮址,这个邮址由个人用户, 帐号》电子邮件》新建:生成新的电子邮件地址用于发布信息,来生成。帖子的内容写在邮件正文里。

这样应该就可以了。如果还有任何问题,可以随时和我联系。

相关日志

Tags: , ,

9 Responses to “解决服务器不能随意自定义邮件转发器导致的StatusNet不能使用邮件发布贴子的问题”

  1. Han 说:

    請問你是如何設定收外部信箱時的帳號和密碼?謝謝!!

    [回复]

    admin 回复:

    @Han, @Han, 我不太明白你的提问是什么意思。能更明确一些吗?

    [回复]

    Han 回复:

    @admin, 你好,我是想要用maildaemon.php透過pop3去收gmail的信件,換句話說,我架設的系統會用我這組gmail的帳號寄給user,當user用mail回覆時,自然就是回覆到這個帳號,但我卻不知怎麼設定帳號和密碼還有server…等收信的相關設定

    [回复]

    admin 回复:

    @Han, 我看了一下gmail的设置,无法转发信件至文件。所以这还是需要你在你的服务器上设置一个转发邮箱。先由Gmail转发至你的可以转发邮件至文件的邮箱,再由该邮箱转发邮件至maildaemon.php。或者你需要在你的服务器上开启daemon(通过yourServerPath/script/startdaemons.sh),然后利用它的fetchmail功能来读取你gmail邮箱里的邮件,转发至maildaemon.php处理。

    [回复]

    Han 回复:

    @admin, 謝謝你的回覆。我金天下午都在看startdaemons.sh這一塊,我的作法是將yourServerPath/plugins/startdaemons.sh透過addPlugin(‘imap’, array(…));的方式加入,然後透過startdaemons.sh來啟動,但至今仍無進展,不知是哪裡出錯,目前只能確定startdaemons.sh的確有初始化imap的設定,但是否去收mail就不知道了,因為我在pluging中加的common(log_info, …)的訊息都沒寫入debug info文件中。

    另外想請教,你所謂的fetchmail的功能是指imap pluging嗎?還是?
    謝謝!!

    [回复]

    Han 回复:

    @admin, 不好意思,上篇回文打錯,請看這篇

    謝謝你的回覆。我今天下午都在看startdaemons.sh這一塊,我的作法是將yourServerPath/plugins/Imap透過addPlugin(‘imap’, array(…));的方式加入,然後透過startdaemons.sh來啟動,但至今仍無進展,不知是哪裡出錯,目前只能確定startdaemons.sh的確有初始化imap的設定,但是否有收mail就不知道了,因為我在pluging中加的common(log_info, …)的訊息都沒寫入debug info文件中。

    另外想請教,你所謂的fetchmail的功能是指imap pluging嗎?還是?
    謝謝!!

    [回复]

    admin 回复:

    @Han,你的思路已经是正确的了。只是差一点,那就是你需要自己去写一段代码来handle你读取回来的邮件。好好研究一下Imap当中的原代码,我想你很快就会得到你想要的结果。如果成功实现了你的想法,不要忘了把代码分享给我一份,谢谢。

    [回复]

  2. berry4zhu 说:

    楼主,哪里有可以转发邮件至文件的邮箱注册,我的虚拟空间邮箱不支持转发邮件到文件处理,等候帮助,谢谢

    [回复]

    admin 回复:

    不知道你的虚拟主机是否支持daemon或者cronjob,如果支持二者之一的话,你可以写一个后台程序,主动去指定的邮箱里读取你的信件。如果这样还是不行,你还是可以写一个后台程序,然后手动地让它永远执行。

    [回复]

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">