我用 163 的邮箱测试,没问题,代码:
ActionMailer::Base.smtp_settings = {
:address => "smtp.163.com",
:port => 25,
:domain => "163.com",
:user_name => "username",
:password => "password",
:authentication => "plain",
:enable_starttls_auto => true
}
但换成 263 的企业邮箱就死活不行,代码:
ActionMailer::Base.smtp_settings = {
:address => "smtpcom.263xmail.com",
:port => 25,
:domain => "our_company.com",#这个问过263的人,说就是写我们公司的域名
:user_name => "username",
:password => "password",
:authentication => "plain",#这里我"cram_md"也试过了,plain也试过了,login也试过了,都不行……
:enable_starttls_auto => true
}
QQ 的邮箱和 263 的症状一样。
要说代码不对那 163 的为啥可以呢……郁闷了。有人有经验吗?
呃,提供一个企业邮箱的测试账号吧:
:domain => "etsc-tech.com",#这个问过263的人,说就是写我们公司的域名
:user_name => "test",
:password => "1234qwerQWER",
web 方式登录邮箱查看已发邮件用 www.263.net,然后用户名 [email protected],密码如上,不勾“安全登录” 哪位大侠能帮我看看不……
这个问题曾经也困扰了我很久,最后我发现,有些 SMTP 服务器像 Exchange Server 是不支持HELO 或 EHLO 指令的,你可以用telnet 测一下确认,我是通过本地建一个 postfix 服务,然后用 SMTP relay 模式再转发邮件解决的,希望对你有帮助吧……
在家又试了试这个http://www.kongtechnology.com/2008/01/27/smtp-authentication-and-send-emails-using-telnet/
成功发送。
是不是说我能用 telnet 这么发邮件,就说明我可以用 Rails 发呢?
我在它的这个步骤里 login 了,所以我也必须把
:authentication => "plain"
设置成 login 对吗?
家里没 Rails,明天去公司试。权当备忘了……
telnet 可发不代表 actionmailer 可发,比如 HELO 指令 SMTP 不支持,在 telnet 上你可以直接忽略,但是 actionmailer 却会报错,不过可能可以通过对 actionmailer 修改解决,虽然我最终通过搭建一个 smtp relay 服务解决这个问题。。。
ActionMailer::Base.smtp_settings = {
:address => "smtp.qq.com",
:port => 25,
:domain => "qq.com",
:user_name => "username",
:password => "password",
:authentication => "plain"
}
QQ 的这么试也成了,关键是不能要
:enable_starttls_auto => true
这句,true false 都不要,根本不要这句……
还真不是这句的原因。我用我的 QQ 号试,加上了这句话,成功了,但用另外一个 QQ 号试就不成,无论有没有这句话都不成……这还有什么花巧么……………………
原来是 QQ 邮件的设置,一个开通了 POP3/SMTP服务 和 IMAP/SMTP服务 这两项,就不行,另外一个只开通了 POP3/SMTP服务 这一项,就成功了。
可是 263 的还是不成…………
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => 'gmail.com',
:user_name => 'username',
:password => 'password',
:authentication => 'plain',
:enable_starttls_auto => true
}
这是 Gmail 的,也成了。决定再跟 263 的技术客服沟通一下…………
终于搞定了!
起因是 263 客服问我要报错信息……我一楞,这没有报错信息啊,就是不成功啊。于是去 google,找到了这个:
http://api.rubyonrails.org/classes/ActionMailer/Base.html
raise_delivery_errors
- Whether or not errors should be raised if the email fails to be delivered.
这不就是报错信息么?于是加上:
ActionMailer::Base.smtp_settings = {
#略
}
ActionMailer::Base.raise_delivery_errors = true
运行,果然有报错了,是
Net::SMTPAuthenticationError: 535 Error: authentication failed
这就好办了,我们来找什么是 535……其实也不用找,就是认证失败嘛=_=
然后看到这句:
:domain
- If you need to specify a HELO domain, you can do it here.
我的 domain 写的是 etsc-tech.com,也就是我们公司域名,但我记得那天用 telnet 调试的时候不是这个结果,果断弄出 telnet 再试:
helo a
250 263.net
果然就应该是这个吧!先改,再试,但……依然不成。还是看 API
:authentication
- If your mail server requires authentication, you need to specify the authentication type here. This is a symbol and one of :plain
(will send the password in the clear), :login
(will send password Base64 encoded) or :cram_md5
(combines a Challenge/Response mechanism to exchange information and a cryptographic Message Digest 5 algorithm to hash important information)
几种认证方式:plain,直接传递;login,Base64 码传递;cram_md5,md5 加密传递 那天的教程里我记得是 Base64 过的,于是先在 telnet 里试,用户名 terry,密码 xxxxx……同样 535 错误!又看那天的 telnet 教程,原来用户名也不应该是我的用户名,而是 [email protected] 这样的全名(这就是所有企业邮箱都失败的原因所在吧!) 改正后在 telnet 里调试,通过。 然后在 Rails 配置里写,通过! 完整代码:
ActionMailer::Base.smtp_settings = {
:address => "smtpcom.263xmail.com",#263提供的
:port => 25,#同上
:domain => "263.net",#263的客服说用我们公司的域名,其实他们乱说的,应该是在telnet里helo出来的那个域名
:user_name => "[email protected]",#上面不用我们公司的域名了,所以这里要加上,因为是企业邮箱嘛
:password => "password",
:authentication => "login"#三种方式上面有解释
}
ActionMailer::Base.raise_delivery_errors = true#这个调试完倒是可以不要了……
打完收工…… 附一个更详细的 telnet 发邮件步骤: http://www.wikihow.com/Send-Email-Using-Telnet
@hexawing 楼主,我也遇到邮件问题了,我们公司也是 263 的企业邮箱,配置了 ActionMailer 之后,邮件死活发不出来,能帮我看一下嘛?
Net::OpenTimeout: execution expired
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:542:in `initialize'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:542:in `open'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:542:in `tcp_socket'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:552:in `block in do_start'
from /opt/gitlab/embedded/lib/ruby/2.3.0/timeout.rb:101:in `timeout'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:551:in `do_start'
from /opt/gitlab/embedded/lib/ruby/2.3.0/net/smtp.rb:521:in `start'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/mail-2.6.4/lib/mail/network/delivery_methods/smtp.rb:113:in `deliver!'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/mail-2.6.4/lib/mail/message.rb:2149:in `do_delivery'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/mail-2.6.4/lib/mail/message.rb:237:in `block in deliver'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/actionmailer-4.2.7.1/lib/action_mailer/base.rb:543:in `block in deliver_mail'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:164:in `block in instrument'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:164:in `instrument'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/actionmailer-4.2.7.1/lib/action_mailer/base.rb:541:in `deliver_mail'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/mail-2.6.4/lib/mail/message.rb:237:in `deliver'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/actionmailer-4.2.7.1/lib/action_mailer/message_delivery.rb:85:in `deliver_now'
from (irb):1
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/commands/console.rb:110:in `start'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/commands/console.rb:9:in `start'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/commands/commands_tasks.rb:68:in `console'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /opt/gitlab/embedded/service/gem/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/commands.rb:17:in `<top (required)>'
from bin/rails:9:in `require'
from bin/rails:9:in `<main>'
以上是报错信息
我经过查阅许多资料(比如),根据高中生物学的对照实验,设立对照组不停地试了半天之后,得出以下结论,仅供参考:
raise_delivery_error = true
在 log 里也看不到任何报错信息,显示的是邮件成功发送,但我确实没有收到邮件,一点报错也没有让我一时失去了线索。最后我发现问题是出在 mailer 的方法上:class UserMailer < ApplicationMailer
def welcome(user_id)
@user = User.find_by_id(user_id)
return false if @user.blank?
mail(from: "[email protected]", to: @user.email, subject: "xxxx")
end
end
这里这个 from 一定要写,和 ActionMailer 的 smtp 设置的 user_name 应该是同一个值,因为像 163 邮箱,是需要这个来验证的,如果不写 from,就无法发送,而 log 里依旧会显示成功发送。
另外填 port 端口号的时候也要注意,拿 163 邮箱来说,一般的默认端口是 25, 如果设置了 ssl: true, 就应该使用 ssl 协议的端口号 465.