使用 Ruby 发送电子邮件 - SMTP
简单邮件传输协议 (SMTP) 是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件。
Ruby 为简单邮件传输协议 (SMTP) 客户端连接提供 Net::SMTP 类,并提供两个类方法 new 和 start。
new 有两个参数 −
服务器名称默认为 localhost。
端口号默认为众所周知的 25 端口。
start 方法采用这些参数 −
server − SMTP 服务器的 IP 名称,默认为 localhost。
port − 端口号,默认为 25。
domain − 邮件发件人的域,默认为 ENV["HOSTNAME"]。
account − 用户名,默认为零。
password − 用户密码,默认为零。
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
在这里,您使用文档在消息中放置了一个基本的电子邮件,并注意正确格式化标题。 电子邮件需要 From、To 和 Subject 标头,并用空行与电子邮件正文分开。
要发送邮件,您使用 Net::SMTP 连接到本地计算机上的 SMTP 服务器,然后使用 send_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 标记不会根据 HTML 语法进行格式化。 但是 Ruby Net::SMTP 提供了将 HTML 消息作为实际 HTML 消息发送的选项。
发送电子邮件时,您可以指定 Mime 版本、内容类型和字符集以发送 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 中指定文本和附件部分。
边界以两个连字符开头,后跟一个唯一编号,该编号不能出现在电子邮件的消息部分中。 表示电子邮件最后部分的最后边界也必须以两个连字符结尾。
附加文件应使用 pack("m") 函数进行编码,以便在传输前进行 base64 编码。
示例
以下是示例,它将发送文件 /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
注意 − 您可以在数组中指定多个目的地,但它们应该用逗号分隔。