Ruby 简明教程
Sending Email using Ruby - SMTP
简单邮件传输协议 (SMTP) 是一种协议,处理在邮件服务器之间发送和路由电子邮件。
Ruby 提供 Net::SMTP 类用于简单邮件传输协议 (SMTP) 客户端连接,并提供了两个类方法 new 和 start。
-
new 采用两个参数 - 服务器名称默认为 localhost,端口号默认为众所周知的端口 25。
-
start 方法采用这些参数 - 服务器 - SMTP 服务器的 IP 名称,默认为 localhost;端口 - 端口号,默认为 25;域 - 邮件发送者的域,默认为 ENV["HOSTNAME"];帐户 - 用户名,默认为 nil;密码 - 用户密码,默认为 nil;authtype - 授权类型,默认为 cram_md5。
一个 SMTP 对象具有一个实例方法 sendmail,它通常用于发送邮件。它采用三个参数 -
-
源 - 字符串、数组或任何具有 each 迭代器的东西,一次返回一个字符串。
-
发送者 - 将出现在电子邮件的 from 字段中的字符串。
-
收件人 - 表示收件人地址的字符串或字符串数组。
Example
下面是使用 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
这里,你使用文档将基本电子邮件放入消息中,并注意正确设置标头格式。电子邮件需要一个 From 、 To 和 Subject 标头,并用空行与电子邮件正文分开。
要发送邮件,你可以使用 Net::SMTP 连接到本地计算机上的 SMTP 服务器,然后将 send_message 方法与邮件、发件人地址和目标地址一起用作参数(尽管发件人和收件人地址都在电子邮件本身中,但这些地址并不总是用于路由邮件)。
如果你不打算在计算机上运行 SMTP 服务器,你可以使用 Net::SMTP 与远程 SMTP 服务器进行通信。除非你正在使用 Web 邮件服务(例如 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。
Sending an HTML e-mail using Ruby
如果你使用 Ruby 发送文本消息,那么所有内容都将被视为简单文本。即使你在文本消息中包含 HTML 标签,它也会显示为简单文本,HTML 标签不会根据 HTML 语法进行格式化。但是,Ruby Net::SMTP 提供了将 HTML 消息作为实际 HTML 消息发送的选项。
发送邮件时,你可以指定一个 Mime 版本、内容类型和字符集来发送 HTML 邮件。
Example
以下是将 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
Sending Attachments as an e-mail
要发送包含混合内容的电子邮件,需要将 Content-type 标头设置为 multipart/mixed 。然后,可以在 boundaries 中指定文本和附件部分。
一个边界的开头是两个连字符后跟一个唯一数字,它不能出现在电子邮件的消息部分。表示电子邮件的最终部分的最终边界也必须以两个连字符结束。
附加文件应使用 pack("m") 函数进行编码,以便在传输之前进行 base64 编码。
Example
以下是发送文件 /tmp/test.txt 作为附件的示例。
require 'net/smtp'
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m") # base64
marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF
# Define the main headers.
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
# Define the message action
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit
#{body}
--#{marker}
EOF
# Define the attachment section
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"
#{encodedcontent}
--#{marker}--
EOF
mailtext = part1 + part2 + part3
# Let's put our code in safe area
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
NOTE − 您可以在数组内部指定多个目标,但是它们应该以逗号分隔。