题目真长……

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

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

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

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

步骤如下:

  1. 在服务器商提供的cPanel内新建一个邮件地址,用于接收邮箱来源的贴子。比如说weibo@qiuworld.com这样一个邮址。
  2. 对这个邮址进行转发。在cPanel内使用转发器,设置转发的原信箱为:weibo@qiuworld.com,转发到的地址使用高级选单里的转发到文件,目标文件是maildaemon.php。注意这个文件的地址一定要写对,比如/public_html/statusnet/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: , ,

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="">