Ruby Net::SMTP 的使用方法 和一些参数说明

hjf_coding · 2017年04月13日 · 3201 次阅读

背景

首先我要说一下我是在阿里云上用 ruby 的 Net::SMTP 类发送邮件的。下面我把我在阿里云上遇到的坑说一下

端口问题

可能是为保护阿里云还是怎么的,阿里云限制使用 25 端口,于是刚开始的时候怎么发邮件都发不了。最后我发现除了 25 端口 还可以用一些邮件服务商提供的 587 端口发送邮件 例如:

  • smtp.gamil.com(不推荐使用 速度很慢 连接不稳定)
  • smtp.qq.com

Ruby Net::SMTP 基本介绍

Net::SMTP 主要有 new、start 这两个方法 英文文档 中文文档 (菜鸟教程)

Net::SMTP.new(address, port).start(domain, user, secret, authtype)

new 方法

new(address, port = nil)

Net::SMTP.new(address, port)

start 方法

start(address, port = nil, domain= 'localhost', user = nil, secret = nil, authtype = nil)

msgstr = <<END_OF_MESSAGE
From: Your Name <your@mail.address>
To: Destination Address <someone@example.com>
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@example.com>

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 邮箱为例

获取 qq 邮箱 SMTP 客户端验证

下面的对应位置的 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
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号