Rails ActionMailer 和不同邮箱的问题 (已经搞定!哈哈)

hexawing · 2013年02月25日 · 最后由 rennyallen 回复于 2017年07月27日 · 21121 次阅读

我用 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],密码如上,不勾“安全登录” 哪位大侠能帮我看看不……

看看 Log 信息吧。

这个问题曾经也困扰了我很久,最后我发现,有些 SMTP 服务器像 Exchange Server 是不支持HELO 或 EHLO 指令的,你可以用telnet 测一下确认,我是通过本地建一个 postfix 服务,然后用 SMTP relay 模式再转发邮件解决的,希望对你有帮助吧……

#2 楼 @windxj 我直接在命令行里执行的,Log 信息就是一个对象,还怎么看呢…… #3 楼 @ericguo 好的,我明天去公司学习一下,先谢过了……

话说 263xmail 我也试了很多次,没有成功过,倒是 QQ 很容易成功的。

我 163 从未成功过,gmail 倒是妥妥的

#3 楼 @ericguo telnet 鼓捣了半天,最后的结果都是 598 错误,包括 163 的我本来成功的收发地址也是……是我没弄对吗?

在家又试了试这个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 的技术客服沟通一下…………

你用 telnet 调试 smtp 服务的方法很赞,很有借鉴意义。

#14 楼 @lgn21st 嘿嘿,反正就是一通乱蒙嘛,也亏得楼里各位的提点,大概差不多对 helo 有个概念了。 另外不解的是,用同样的方法去“调试”已经成功的那些个邮箱,居然都不让我 auth login,直接给我踢出了 telnet……免费邮箱和收费邮箱的区别么……

#12 楼 @hexawing 使用你的配置,我用 qq, 163, gmail 都不成功,Gmail 的错误指示 Please log in with your web browser and then try again. Learn more , 163 和 qq 的都是提示535 authentication failed

#16 楼 @jsvisa 您看看我 13 楼的办法,有帮助吗?

感谢楼主的帖子帮我解决了问题,补充一下使用 163 邮箱的时候,password 传的是授权码

@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>'

以上是报错信息

#19 楼 @fivehao 抱歉,这个报错信息我没见过啊……感觉不像是邮件服务器那边的错的样子,是不是 Rails 本身没有设置好?

我经过查阅许多资料(比如),根据高中生物学的对照实验,设立对照组不停地试了半天之后,得出以下结论,仅供参考:

  1. enable_starttls_auto: true 和这句无关,它只是检查服务器是否支持 starttls 协议,就这里来说,设为 true 或者 false 或者不要这句都没有影响;
  2. domain: '163.com' 和这句也无关,domian 不管怎么填或者不填都不会影响我的邮件发送;
  3. authentication 方式是 plain 也好 login 也好,也不影响;
  4. 即使我设置了 raise_delivery_error = true 在 log 里也看不到任何报错信息,显示的是邮件成功发送,但我确实没有收到邮件,一点报错也没有让我一时失去了线索。最后我发现问题是出在 mailer 的方法上:

app/mailers/user_mailer.rb

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.

需要 登录 后方可回复, 如果你还没有账号请 注册新账号