Ruby 发送电子邮件
-
发送电子邮件
Simple Mail Transfer Protocol(SMTP)是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件。Ruby为 Simple Mail Transfer Protocol(SMTP)客户端连接提供了Net::SMTP类,并提供了new和start两种类方法。new有两个参数-- 服务器名称默认为localhost。
- 默认为端口 25 的端口号。
start方法将这些参数-- server - SMTP服务器的IP名,默认为localhost。
- port - 端口号,默认为25。
- domain - 邮件发件人的域,默认为ENV[“HOSTNAME”]。
- user - 用户名,默认值是零。
- password - 用户密码,默认为无。
- authType - 授权类型,默认为cram_md5。
SMTP对象具有一个称为sendmail的实例方法,通常将用于执行邮件发送工作。它需要三个参数-- source - 一个字符串或阵列或用任何每个迭代一次返回一个字符串。
- sender - 将在出现的字符串从电子邮件的领域。
- recipients - 一个字符串或表示收件人的收件人(多个)字符串的数组。
例如: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方法以及消息,发件人地址和目标地址作为参数(即使from和to地址是在电子邮件本身中,它们并不总是用于路由邮件)。如果您不在计算机上运行SMTP服务器,则可以使用Net :: SMTP与远程SMTP服务器通信。除非您使用Webmail服务(例如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 这是要以HTML格式发送的电子邮件 这是HTML消息。
这是标题。
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
注意 – 您可以在数组内指定多个目标,但应将其用逗号分隔。