在Ruby中利用Net::SMTP类发送电子邮件的教程
简单邮件传输协议(SMTP)发送电子邮件及路由的e-mail邮件服务器之间的协议处理。
Ruby提供Net::SMTP类的简单邮件传输协议(SMTP)客户端的连接,并提供了两个新的方法:new和start.
new带两个参数:
- servername默认为localhost
- portnumber 默认为熟知的25
start方法带有以下这些参数:
- server-IPSMTP服务器名称,默认为localhost
- port-端口号,默认为25
- domain-邮件发件人的域名,默认为ENV["HOSTNAME"]
- account-用户名,默认为nil
- password-用户密码,默认为nil
- authtype-授权类型,默认为cram_md5
SMTP对象有一个实例方法调用sendmail,后者通常会被用来做邮寄消息的工作。它有三个参数:
- source-字符串或数组或任何同每个迭代一次返回一个字符串。
- sender-一个字符串,它将会出现在电子邮件字段中。
- recipients-代表收件人的地址的字符串的字符串或数组
例子:
下面是一个简单使用Ruby脚本的方法来发送一个电子邮件。试一次看看吧:
require'net/smtp'
message=<<MESSAGE_END
From:PrivatePerson<me@fromdomain.com>
To:ATestUser<test@todomain.com>
Subject:SMTPe-mailtest
Thisisateste-mailmessage.
MESSAGE_END
Net::SMTP.start('localhost')do|smtp|
smtp.send_messagemessage,'me@fromdomain.com',
'test@todomain.com'
end
在这里已经放置了一个基本的电子邮件消息,使用文件,在这里同时注意正确格式化标题。一封邮件需要发件人,收件人,主题头,从电子邮件的主体有一个空白行分隔。
随着消息要发送邮件使用Net::SMTP连接到本地机器上的SMTP服务器,然后使用send_message 方法,从地址,目的地址作为参数(即使地址电子邮件本身范围内,这些并非总是用来将邮件路由)。
如果还没有在机器上运行一个SMTP服务器,可以使用的Net::SMTP远程SMTP服务器进行通信。除非使用一个webmail服务(如Hotmail或雅虎邮件),电子邮件提供商将提供外发邮件服务器的细节,可以提Net::SMTP,具体如下:
Net::SMTP.start('mail.your-domain.com')
这行代码连接到SMTP服务器mail.your-domain.com端口25。,而无需使用任何用户名或密码。不过,如果需要的话可以指定端口号或其他参数等。例如:
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:PrivatePerson<me@fromdomain.com>
To:ATestUser<test@todomain.com>
MIME-Version:1.0
Content-type:text/html
Subject:SMTPe-mailtest
Thisisane-mailmessagetobesentinHTMLformat
<b>ThisisHTMLmessage.</b>
<h1>Thisisheadline.</h1>
MESSAGE_END
Net::SMTP.start('localhost')do|smtp|
smtp.send_messagemessage,'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"
#Readafileandencodeitintobase64format
filecontent=File.read(filename)
encodedcontent=[filecontent].pack("m")#base64
marker="AUNIQUEMARKER"
body=<<EOF
Thisisatestemailtosendanattachement.
EOF
#Definethemainheaders.
part1=<<EOF
From:PrivatePerson<me@fromdomain.net>
To:ATestUser<test@todmain.com>
Subject:SendingAttachement
MIME-Version:1.0
Content-Type:multipart/mixed;boundary=#{marker}
--#{marker}
EOF
#Definethemessageaction
part2=<<EOF
Content-Type:text/plain
Content-Transfer-Encoding:8bit
#{body}
--#{marker}
EOF
#Definetheattachmentsection
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'sputourcodeinsafearea
begin
Net::SMTP.start('localhost')do|smtp|
smtp.sendmail(mailtext,'me@fromdomain.net',
['test@todmain.com'])
end
rescueException=>e
print"Exceptionoccured:"+e
end
注意:可以指定多个目的地内部数组,但他们需要用逗号分隔。