根据商店网站的教程,使用邮件服务给用户发送订单生成的邮件时使用的是SendCloud的服务。但是在参加商店大赛过程中,SendCloud的免费账户被冻结,联系客服找回不成功,于是改为使用Aliyun的邮件推送服务(付费)。

但是在实作过程中,提示失败,这是联系客服的记录:

 我正在做一个Ruby on Rails 项目,要用到邮件推送服务。6月8日我已经在阿里云购买了邮件推送服务,并已经设置了smtp密码。也去访问控制那里设置了liangxinzhong关于邮件推送的授权,我已经验证过了邮件。我已经设置了api,拿到了api AccessKeySecret。
我在项目里设置如下:
development.rb:
config.action_mailer.default_url_options = { host: 'localhost:3000'}
config.action_mailer.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
address: "smtpdm.aliyun.com",
port: 25,
domain: "heroku.com",
openssl_verify_mode: 'none',
authentication: "login",
enable_starttls_auto: false,
user_name: ENV["ALI__USER_NAME"],
password: ENV["ALI__USER_KEY"]
}
我的密码保存在下面这个文件里:
application.yml
ALI__USER_NAME: liangxinzhong  # API_USER
ALI__USER_KEY:  xxxxxxxxx  #  API_KEY

我得到了如下的错误提示:
Net::SMTPAuthenticationError (535 Authentication failure[0] [@ud010301]
请问我上面的设置是那里需要修改么?目前无法确定这个错误的具体位置。 

客服反馈是smtp密码没有设置,而实际上我已经设置过了。经过反复联系,问题依然没有解决。后来客服建议重置smtp密码,等待10分钟后测试。 实际上在等待10分钟后,甚至几个小时后测试依然报错。

为了确保自己的smtp密码修改成功,使用了网上找到的用telnet进行测试,实际上这个测试在aliyun的官方文件中也有的:

为帮助大家熟悉SMTP协议发送流程,提供以下 telnet 命令会话过程,来描述SMTP命令会话过程。
(备注:其中 S 代表服务器,C 代表客户端,可以使用Linux命令 echo -n |base64 进行base64编码)
$telnet smtpdm.aliyun.com 25
S:220 smtp.aliyun-inc.com MX AliMail Server(127.0.0.1)
C:EHLO test.com
S:250-smtp.aliyun-inc.com
S:250-8BITMIME
S:250-AUTH=PLAIN LOGIN XALIOAUTH
S:250-AUTH PLAIN LOGIN XALIOAUTH
S:250-PIPELINING
S:250 DSN
C:AUTH LOGIN
S:334 dXNlcm5hbWU6
C:dGVzdEB0ZXN0LmNvbQ==         备注:用户名[email protected]的base64编码
S:334 UGFzc3dvcmQ6
C:dGVzdA==                     备注:用户密码test的base64编码
S:235 Authentication successful
C:MAIL FROM: <[email protected]>   备注:注意用 <> 将发件人扩起来
S:250 Mail Ok
C:RCPT TO: <[email protected]>
S:250 Rcpt Ok
C:DATA
S:354 End data with <CR><LF>.<CR><LF>
C:subject: test
C:from: <[email protected]>
C:to: <[email protected]>
C:
C:test
C:.
S:Data Ok: queued as freedom ###envid=148316944
C:QUIT
S:221 Bye
其中,DATA命令后输入的邮件正文示例中,采用了最简单的文本字符串数据。对于标准的富文本邮件,应该进行规范的MIME格式化,包括主题、正文的编码等,这样可以避免被接收方服务器判为垃圾邮件的风险。

根据上述方法测试时,把自己的发信地址和smtp密码转换为base64编码替换。回传结果为Authentication successful, 说明认证没有问题了。但是同样问题依然存在,这时我判断问题应该已经不在邮件推送服务器那里了。

但是在约半天后(修改密码是下午6:00,第二天早7:30),提示了不同的报错。

Net::SMTPServerBusy (436 "MAIL FROM" doesn't conform with authentication [@sm060104] (Auth Account:[email protected]|Mail Account:[email protected])):

这个提示是说我设置了和发信地址不同的地址,检查代码发现application_mailer.rb里面是根据教程里面的设置,没有修改。

aliyun关于发信地址相关说明-SMTP之Ruby调用示例中提到:

    Mail.defaults do
  delivery_method :smtp, {
    :port      => 25,
    :address   => "smtpdm.aliyun.com",
    :user_name => "[email protected]",
    :password  => "****",
    :enable_starttls_auto => false, 
    :openssl_verify_mode => 'none',
  }
end

mail = Mail.deliver do
  to      '[email protected]'
  from    '[email protected]'
  subject 'Hello'

  text_part do
    body 'Testing mail'
  end
end
注:请在 :user_name => 后替换您的邮件推送地址;:password => 后替换您的邮件推送密码;to '后替换接收地址;from '后替换邮件推送地址

这表示from后面要添发信地址,于是去修改为自己申请的地址,测试成功。

到这时可以推断,修改smtp密码时aliyun的服务器响应时间是要长的。这是–虽然telnet测试表明smtp密码设置成功,但是专案测试仍然失败的原因。

这是成功后的环境设置文档:

ActionMailer::Base.smtp_settings = {
address: "smtpdm.aliyun.com",
port: 25,
: "heroku.com",
openssl_verify_mode: 'none',
authentication: "login",
enable_stattls_auto: false,
user_name: ENV["ALI__USER_NAME"],
password: ENV["ALI__USER_KEY"],
}

这里authentication: "login"这一行是ruby调用说明里面没有的,但是由于要求的是base64编码,在 官方文件action_mailer_basics说:login (will send password Base64 encoded), 因此这行是必须要添加的。

总结:

  1. 设置aliyun邮件推送服务时,添写的是发信地址和smtp密码,这一点和SendCloud是不同的。(SendCloud的服务用API_User来识别,因此设置里面填写的是API_User和api的key。而aliyun的服务是通过发信地址来识别的,因此设置里填写的应该是发信地址和smtp密码 )。没搞清这个区别时,多次尝试填入aliyun的api的key总是不成功。这里填写的用户名和密码和api的名称和密码半毛钱关系都没有!!!
  2. 除了aliyun的ruby配置范例中的值还要加上authentication: “login”这一行,以便将密码转换为要求的base64编码。
  3. app/mailers/application_mailer.rb这份文件里,要把default改为:from: 'aliyun的发信地址

← 商店大赛复盘


利用associans排序 →