首先我要说一下我是在阿里云上用 ruby 的 Net::SMTP 类发送邮件的。下面我把我在阿里云上遇到的坑说一下
可能是为保护阿里云还是怎么的,阿里云限制使用 25 端口,于是刚开始的时候怎么发邮件都发不了。最后我发现除了 25 端口 还可以用一些邮件服务商提供的 587 端口发送邮件 例如:
Net::SMTP 主要有 new、start 这两个方法 英文文档 中文文档 (菜鸟教程)
Net::SMTP.new(address, port).start(domain, user, secret, authtype)
new(address, port = nil)
Net::SMTP.new(address, port)
start(address, port = nil, domain= 'localhost', user = nil, secret = nil, authtype = nil)
msgstr = <<END_OF_MESSAGE
From: Your Name <[email protected]>
To: Destination Address <[email protected]>
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <[email protected]>
This is a test message.
END_OF_MESSAGE
require 'net/smtp'
Net::SMTP.start('your.smtp.server', 25) do |smtp|
smtp.send_message msgstr, 'from@address', 'to@address'
end
在进行发送邮件之前先测试相应端口有没有开 使用 telnet 命令 阿里云 ECS 25 端口被禁 需要申请打开 其他相应端口需要在安全组中配置规则 即使端口打开了 也可能需要看一下有没有被防火墙给墙了。如果出现 Net::OpenTimeout 错误 那么多半是被墙了 或者端口根本没开 具体的的报错代码去看相应的 SMTP 的文档
$ telnet smtp.qq.com 587
$ telnet smtp.qq.com 25
以 qq 邮箱为例
下面的对应位置的 secret 和 authtype 都是假的需要换成你们自己的 QQ 号和 QQ 邮箱 SMTP 客户端验证码
message = "这是一个测试用例"
require 'net/smtp'
Net::SMTP.start("smtp.qq.com", 587,"qq.com","QQ号","SMTP客户端验证码") do |smtp|
smtp.send_message msgstr, 'from@address', 'to@address'
end