先说结果,在Hostmonster上配置redmine的邮件发送功能的配置很简单,下面是config/email.yml配置的例子:
production:
delivery_method: :smtp
smtp_settings:
address: 'mail.your-hostmonster-domain-name.com'
port: 25
domain: 'your-hostmonster-domain-name.com'
authentication: :plain
user_name: "[email protected]"
password:"mail-password"
说明:(1) 先到Hostmonster的控制面板上的“电子邮件帐户”中创建一个邮件用户,用户名对应上面的“mail-user-name”,@符号后面的域名对应“your-hostmonster-domain-name.com”,密码对应“mail-password”;
(2) 从redmine的源码看“domain”这一项基本没有用,但也照样配置上吧;
(3) 端口使用25,从网上资料看26也行(不过这里没有尝试,如果25不行的话,可以试一下26);
(4) “address”的配置是以“mail.xxxx.com”形式出现的,与一般的“smtp.xxx.com”是有区别的;
(5) 这个配置的环境是:ruby(1.8.7)、rails(2.3.5),如果是这个环境(或以上),不需要其它插件之类的,只需要配置config/email.yml。
(6) 参考:http://www.redmine.org/wiki/redmine/EmailConfiguration
过程:
由于日常用gmail比较多,为了减少发的邮件被当垃圾处理,所以想使用gmail的smtp服务器的形式代发邮件(这样redmine发出的邮件看起来好像是由gmail发出的)。但这个想法是“灾难”的开始,结果是额外学了不少东西,代价是花了不少时间。
(1) 按http://www.redmine.org/wiki/redmine/EmailConfiguration中介绍的“GMail/GoogleApps and other TLS-requiring SMTP servers”部分,配置了config/email.yml,然后登陆到redmine里的email notification里点击“send test mail”,无论怎样修改配置,都雷打不动地提示:
"Thefollowing error occured while sending email notification: /"executionexpired/".
(2) 第一种尝试:到baidu、google搜索,查到了不计其数的文章,有很多人都问了同样的问题,后面也给了答复,但email.yml的配置与“EmailConfiguration”里的差不多,该注意的端口、tls、enable_starttls_auto等,“EmailConfiguration”里的标配都有。唯一不同的是有的说要插件“action_mailer_optional_tls”或者直接把插件内容放到lib中然后修改emvironment.rb;分别试了上面两种方式,加上email.yml中各个“可疑”参数的排列组合后进行一系列的尝试工,提示还是犹如“磐石”般泰然处之,但我却黔驴技穷了。(当然,如果email.yml参数中的用户名、密码错了,提示是验证错误之类的)
(3) 第二种尝试:“execution expired”这种提示实在是让人摸不着头脑(没什么提示的信息量),从而也反省一下自己以后写程序时提示得人性化一些。没办法,从提示看不出什么,只能从代码下手了(还好rails全是能看到源码的),回头温习了一下rails的发邮件例子,了解到一个重要的信息:ruby(1.8.7)、rails(2.3.x)上已经集成tls功能了,不需要加什么插件之类的。于是,把redmine重新安装一遍,不带“action_mailer_optional_tls”插件,也不要把与这插件类似的功能加到lib和emvironment.rb里,然后再详细配置好email.yml,不过可惜的是,结果还是跟之前一样糟糕。
(4) 第三种尝试:使用redmine发不成邮件,那先自己发一个试试呗。于是在一linux机器上装了ruby和rails,然后写了个发邮件的test程序(参考:http://edgeguides.rubyonrails.org/action_mailer_basics.html),然后把下面配置放到environment.rb的最后:
ActionMailer::Base.smtp_settings= {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => "smtp.gmail.com",
:authentication => :plain,
:user_name =>"[email protected]",
:password => "mail-password"
}
程序很简单,只是发了一句话,但却顺利得很,一发一个准,gmail里全部收到。
(5) 第四种尝试:在linux本机上同样安装redmine,使用其里面自带的deliver_test(user)方法来测试(email.yml与第一种尝试一样,environment.rb不添加有关email的任何东西),也是随意都能够成功。这个过程刚开始很辛苦、很费时间,直到想起了这个方法:在命令行中先进入redmine工程,然后在命令行中输入:ruby script/console production 来加载整个production环境,然后先用user = User.try_to_login(‘username’, ‘userpassword’) 获得一个用户,然后使用Mailer.deliver_test(user)来向user发送一封邮件。有了这个方法,测试轻松多了。
(6) 经过上面尝试后,很明显问题的根源是与hostmonster有关,而不是与配置有关。发个ticket向Hostmonster咨询之后,回复是:“Unfortunately, we do notallow outbound SMTP connections as you are trying to do with this script. I'msorry for any inconvenience this may cause.”简单地理解是:Hostmonster不支持这种形式去使用外部的smtp服务器。“真相”终于大白于天下,到Hostmonster上申请一个邮箱(可以使用http://www.domain-name.com/webmail去登陆这个邮箱),然后配置到email.yml上(不需要使用tls),就一切OK了。
(7) 另外,如果遇到“550-Verification failed for [email protected]”或“535 Incorrect authentication data”一般是邮箱配置的用户名、密码不正确或者发送者邮箱的用户名和密码不正确产生的。
小结:
(1) 多查资料,多尝试、多学原理再多尝试;
(2) 使用ruby script/about来查看当前rails工程的版本环境;使用这个命令时,rails会试图去连接数据库,所以如果使用production环境,则需要使用命令: RAILS_ENV=production script/about
(3) 使用ruby script/console production来测试程序,使用ruby script/server webrick -e production来测试工程代码是否能够跑起来(因为启动出问题时,Hostmonster看不到详细的错误信息);
(4) Hostmonster不支持使用外部的smtp服务器