使用 Ruby 发送电子邮件 - SMTP
简单邮件传输协议 (SMTP) 是一种处理发送电子邮件以及邮件服务器之间邮件路由的协议。
Ruby 提供了 Net::SMTP class 用于简单邮件传输协议 (SMTP) 的客户端连接,并提供了两个类方法 new 和 start。
new 方法接受两个参数 −
server name,默认为 localhost。
port number,默认为著名的端口 25。
start 方法接受以下参数 −
server − SMTP 服务器的 IP 名称,默认为 localhost。
port − 端口号,默认为 25。
domain − 邮件发送者的域名,默认为 ENV["HOSTNAME"]。
account − 用户名,默认为 nil。
password − 用户密码,默认为 nil。
authtype − 认证类型,默认为 cram_md5。
SMTP 对象有一个名为 sendmail 的实例方法,通常用于发送邮件。它接受三个参数 −
source − 一个字符串、数组或具有 each 迭代器的对象,每次返回一个字符串。
sender − 将出现在电子邮件 from 字段中的字符串。
recipients − 表示收件人地址的字符串或字符串数组。
示例
以下是使用 Ruby 脚本发送一封电子邮件的简单方法。试一次 −
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <me@fromdomain.com>
To: A Test User <test@todomain.com>
Subject: SMTP e-mail test
This is a test e-mail message.
MESSAGE_END
Net::SMTP.start('localhost') do |smtp|
smtp.send_message message, 'me@fromdomain.com', 'test@todomain.com'
end
在这里,您将一封基本的电子邮件放入 message 中,使用文档格式,并注意正确格式化头部。电子邮件需要 From、To 和 Subject 头部,与邮件正文用空行分隔。
要发送邮件,您使用 Net::SMTP 连接到本地机器上的 SMTP 服务器,然后使用 send_message 方法,并将 message、发件人地址和目标地址作为参数(尽管发件人和收件人地址在邮件本身中,但这些并不总是用于路由邮件)。
如果您的机器上没有运行 SMTP 服务器,您可以使用 Net::SMTP 与远程 SMTP 服务器通信。除非您使用网页邮件服务(如 Hotmail 或 Yahoo! Mail),否则您的电子邮件提供商会为您提供传出邮件服务器详细信息,您可以将其提供给 Net::SMTP,如下所示 −
Net::SMTP.start('mail.your-domain.com')
这行代码连接到 mail.your-domain.com 的端口 25 上的 SMTP 服务器,而不使用任何用户名或密码。不过,如果需要,您可以指定端口号和其他详细信息。例如 −
Net::SMTP.start('mail.your-domain.com',
25,
'localhost',
'username', 'password' :plain)
此示例使用明文格式的用户名和密码连接到 mail.your-domain.com 的 SMTP 服务器。它将客户端的主机名标识为 localhost。
使用 Ruby 发送 HTML 电子邮件
当您使用 Ruby 发送文本消息时,所有内容都会被视为纯文本。即使您在文本消息中包含 HTML 标签,这些标签也会显示为纯文本,不会按照 HTML 语法进行格式化。但是 Ruby 的 Net::SMTP 提供了将 HTML 消息作为实际 HTML 消息发送的选项。
在发送电子邮件消息时,您可以指定 MIME 版本、content type 和 character set 来发送 HTML 电子邮件。
示例
以下是发送 HTML 内容作为电子邮件的示例。请尝试运行一次 −
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <me@fromdomain.com>
To: A Test User <test@todomain.com>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END
Net::SMTP.start('localhost') do |smtp|
smtp.send_message message, 'me@fromdomain.com', 'test@todomain.com'
end
发送带附件的电子邮件
要发送包含混合内容的电子邮件,需要将 Content-type 标头设置为 multipart/mixed。然后可以在 boundaries 内指定文本和附件部分。
boundary 以两个连字符开头,后跟一个唯一数字,该数字不能出现在电子邮件的消息部分中。表示电子邮件最后部分的最终 boundary 也必须以两个连字符结尾。
附件文件在传输前应使用 pack("m") 函数进行 base64 编码。
示例
以下示例将文件 /tmp/test.txt 作为附件发送。
require 'net/smtp'
filename = "/tmp/test.txt"
# 读取文件并将其编码为 base64 格式
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m") # base64
marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF
# 定义主要标头。
part1 = <<EOF
From: Private Person <me@fromdomain.net>
To: A Test User <test@todmain.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF
# 定义消息主体
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit
#{body}
--#{marker}
EOF
# 定义附件部分
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"
#{encodedcontent}
--#{marker}--
EOF
mailtext = part1 + part2 + part3
# 将代码放入安全区域
begin
Net::SMTP.start('localhost') do |smtp|
smtp.sendmail(mailtext, 'me@fromdomain.net', ['test@todmain.com'])
end
rescue Exception => e
print "Exception occured: " + e
end
注意 − 您可以在数组中指定多个收件人,但它们应以逗号分隔。