题目真长……
昨天晚上弄到三点,对于标题的问题,也没整出个结果来感觉到不睡觉很有压力,只能睡了。
今天白天工作,很不在状态,一心就想着怎么解决问题。在工作的过程中,下定决心,算了,研究原代码,这可能才是最简单解决问题的方法。因为租用的服务器是不可能单独给我开放接受通配符的邮址(或者说任意地址)。只能改原代码了。
很快制定了解决问题的办法。使用固定的Email地址来接收所有用户发送来的,使用脏的方式来应对手机发送博客的方法,就是指使用手机邮箱,而不使用短消息。这有两个好处,一个是用户的经济负担会减少,另一个可以尽可能地避免乱码问题。收到消息之后,通过来源电子邮箱地址来判断用户,因为不使用短信方式,可以利用Email的标题来验证用户身份。而邮件的内容做为贴子的内容贴出来。当然这样有一个不好,就是邮件可能会超出140字符的设置,这样会被自动截短。
大约的思路想清楚了,就开始做google research。这个过程,说长不长,说短不短,等到成功发贴的时候,都感觉天都黑了。
步骤如下:
- 在服务器商提供的cPanel内新建一个邮件地址,用于接收邮箱来源的贴子。比如说weibo@qiuworld.com这样一个邮址。
- 对这个邮址进行转发。在cPanel内使用转发器,设置转发的原信箱为:weibo@qiuworld.com,转发到的地址使用高级选单里的转发到文件,目标文件是maildaemon.php。注意这个文件的地址一定要写对,比如/public_html/statusnet/scripts/maildaemon.php这样。在写完提交之后注意查看生成的转发器地址是否正确。
- 进入文件管理器,修改maildaemon.php的文件属性为755。如果文件不能被执行的话是无法处理转发过来的邮件的。
- 打开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']; - 修改文件的说明,告知用户如何使用邮箱来发贴:使用注册的手机邮箱做为发送邮箱,使用刚才设置的邮件地址为接收邮址,这里就是weibo@qiuworld.com,邮件的标题必须是一个电子邮址,这个邮址由个人用户, 帐号》电子邮件》新建:生成新的电子邮件地址用于发布信息,来生成。帖子的内容写在邮件正文里。
这样应该就可以了。如果还有任何问题,可以随时和我联系。

請問你是如何設定收外部信箱時的帳號和密碼?謝謝!!
[回复]
admin 回复:
三月 22nd, 2010 at 8:19 上午
@Han, @Han, 我不太明白你的提问是什么意思。能更明确一些吗?
[回复]
Han 回复:
三月 23rd, 2010 at 4:12 上午
@admin, 你好,我是想要用maildaemon.php透過pop3去收gmail的信件,換句話說,我架設的系統會用我這組gmail的帳號寄給user,當user用mail回覆時,自然就是回覆到這個帳號,但我卻不知怎麼設定帳號和密碼還有server…等收信的相關設定
[回复]
admin 回复:
三月 23rd, 2010 at 7:12 上午
@Han, 我看了一下gmail的设置,无法转发信件至文件。所以这还是需要你在你的服务器上设置一个转发邮箱。先由Gmail转发至你的可以转发邮件至文件的邮箱,再由该邮箱转发邮件至maildaemon.php。或者你需要在你的服务器上开启daemon(通过yourServerPath/script/startdaemons.sh),然后利用它的fetchmail功能来读取你gmail邮箱里的邮件,转发至maildaemon.php处理。
[回复]
Han 回复:
三月 23rd, 2010 at 7:21 上午
@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 回复:
三月 23rd, 2010 at 7:23 上午
@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 回复:
三月 23rd, 2010 at 11:09 上午
@Han,你的思路已经是正确的了。只是差一点,那就是你需要自己去写一段代码来handle你读取回来的邮件。好好研究一下Imap当中的原代码,我想你很快就会得到你想要的结果。如果成功实现了你的想法,不要忘了把代码分享给我一份,谢谢。
[回复]
楼主,哪里有可以转发邮件至文件的邮箱注册,我的虚拟空间邮箱不支持转发邮件到文件处理,等候帮助,谢谢
[回复]
admin 回复:
四月 27th, 2010 at 11:47 上午
不知道你的虚拟主机是否支持daemon或者cronjob,如果支持二者之一的话,你可以写一个后台程序,主动去指定的邮箱里读取你的信件。如果这样还是不行,你还是可以写一个后台程序,然后手动地让它永远执行。
[回复]