使用 Ruby 发送电子邮件 - SMTP


简单邮件传输协议 (SMTP) 是一种处理在邮件服务器之间发送电子邮件和路由电子邮件的协议。

Ruby 为简单邮件传输协议 (SMTP) 客户端连接提供 Net::SMTP 类,并提供两个类方法newstart

  • 有两个参数 -

    • 服务器名称默认为 localhost。

    • 端口默认为众所周知的端口25。

  • start方法采用这些参数 -

    • 服务器- SMTP 服务器的 IP 名称,默认为 localhost

    • port - 端口号默认为 25。

    • 域- 邮件发件人的域,默认为 ENV["HOSTNAME"]

    • 帐户- 用户,默认为零。

    • 密码-用户密码,默认为零。

    • authtype - 授权类型,默认cram_md5

SMTP 对象有一个名为 sendmail 的实例方法,该方法通常用于完成邮寄消息的工作。它需要三个参数 -

  • 源- 一个字符串或数组或任何每个迭代器一次返回一个字符串的东西。

  • 发件人- 将出现在电子邮件的发件人字段字符串。

  • 收件人- 表示收件人收件人的字符串或字符串数​​组

例子

这是使用 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

在这里,您使用文档在消息中放置了一封基本电子邮件,并注意正确设置标题格式。电子邮件需要“发件人”、“收件人”和“主题”标头,并用空行与电子邮件正文分隔。

要发送邮件,您可以使用 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然后可以在边界内指定文本和附件部分。

边界以两个连字符开始,后跟一个唯一的数字,该数字不能出现在电子邮件的消息部分中。表示电子邮件最后部分的最终边界也必须以两个连字符结尾。

附加文件应使用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  

注意- 您可以在数组内指定多个目标,但它们应该用逗号分隔。