Ruby 使用 SMTP 發(fā)送郵件
1. 開始前的準(zhǔn)備
本章節(jié)中我們來講解在 Ruby 如果使用 SMTP(簡(jiǎn)單郵件傳輸協(xié)議)來發(fā)送郵件,我們拿 163 郵箱來舉例子。
首先需要我們注冊(cè)一個(gè)163郵箱,然后開啟 SMTP 服務(wù)。
服務(wù)器名稱 | 時(shí)機(jī)簡(jiǎn)介(調(diào)用的時(shí)機(jī)) | SSL協(xié)議端口號(hào) | 非SSL協(xié)議端口號(hào) |
---|---|---|---|
IMAP | 構(gòu)造函數(shù),創(chuàng)建新對(duì)象時(shí) | 993 | 143 |
SMTP | smtp.163.com | 465/994 | 25 |
POP3 | pop.163.com | 995 | 110 |
從上圖的表格中我們獲取到:在 163 中 SMTP 服務(wù)器的地址為:smtp.163.com,非 SSL 協(xié)議的端口為:25。
2. 發(fā)送第一個(gè)郵件(純文本)
我們會(huì)使用到Net::SMTP
來發(fā)送郵件,這個(gè)庫提供了通過 SMTP 方式發(fā)送郵件的功能。
郵件是有格式的,不符合格式的郵件是不能發(fā)送的,郵件的格式規(guī)定如下:
From: Your Name <your@mail.address>
To: Destination Address <someone@example.com>
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@example.com>
This is a test message.
根據(jù)要求現(xiàn)在讓我們先來編輯一段郵件的內(nèi)容:
sender_email = # 填寫剛剛注冊(cè)用來發(fā)送郵件的163賬號(hào)
receiver_email = # 填寫自己接收接收郵件的郵箱賬號(hào)
sender_email_pwd = # 163郵件密碼
msg = <<MESSAGE
From: Andrew <#{sender_email}>
To: Testuser <#{receiver_email}>
Subject: Test Message
Date: #{Time.now.strftime("%a, %d %b %Y %H:%M:%S +0800")}
Message-Id: <#{rand.to_s[3...8]}.message.@163.com>
This is a test message.
MESSAGE
puts msg
# ---- 輸出結(jié)果 ----
From: Andrew <xxxx>
To: Testuser <xxxx>
Subject: Test Message
Date: Thu, 20 Aug 2020 23:21:34 +0800
Message-Id: <88888.message.@163.com>
然后我們需要使用Net::SMTP
中的start
方法來發(fā)送這個(gè)郵件(郵件是有密碼的)。并將我們剛才知道的郵件服務(wù)器地址和端口號(hào)添加到上面:
實(shí)例:
Net::SMTP.start('smtp.163.com', 25, '127.0.0.1', sender_email, sender_email_pwd) do |smtp|
smtp.send_message msg,
sender_email,
receiver_email
smtp.finish
end
# ---- 輸出結(jié)果 ----
成功發(fā)送郵件~
運(yùn)行成功后就會(huì)成功發(fā)送郵件到接收郵箱之中。
3. 發(fā)送HTML格式的郵件
如果我們要發(fā)送帶有 CSS 樣式的郵件,那么需要我們?cè)?headers 中加入Content-type: text/html
,并更改文件的內(nèi)容:
msg = <<MESSAGE
From: Andrew <#{sender_email}>
To: Testuser <#{receiver_email}>
Subject: Test Message
Date: #{Time.now.strftime("%a, %d %b %Y %H:%M:%S +0800")}
Content-type: text/html
Message-Id: <#{rand.to_s[3...8]}.message.@163.com>
<h1>測(cè)試標(biāo)題</h1>
<p style="color: red;">測(cè)試這段話</p>
MESSAGE
puts msg
# ---- 輸出結(jié)果 ---
From: Andrew <xxx.com>
To: Testuser <xxx.qq.com>
Subject: Test Message
Date: Thu, 20 Aug 2020 23:37:43 +0800
Content-type: text/html
Message-Id: <17402.message.@163.com>
<h1>測(cè)試標(biāo)題</h1>
<p style="color: red;">測(cè)試這段話</p>
接收到郵件后,我們可以看到內(nèi)容中的 CSS 已經(jīng)生效了。
4. 發(fā)送帶有附件的郵件
讓我們先創(chuàng)建一個(gè) txt 文件作為附件。
echo "這是一個(gè)測(cè)試的txt文件" > test.txt
然后讓我再次修改 headers,增加Content-type: multipart/mixed
。
注意事項(xiàng):
我們需要使用 pack(“m”) 將函數(shù)轉(zhuǎn)化為 base64 格式的。
filename = File.expand_path(File.dirname(__FILE__) + "/test.txt")
encodedcontent = [File.read(filename)].pack("m")
msg = <<MESSAGE
From: Andrew <#{sender_email}>
To: Testuser <#{receiver_email}>
Subject: Test Upload File/mi
Date: #{Time.now.strftime("%a, %d %b %Y %H:%M:%S +0800")}
Message-Id: <#{rand.to_s[3...8]}.message.@163.com>
Content-Transfer-Encoding:8bit
Content-Type: multipart/mixed; name=\"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="#{filename}"
#{encodedcontent}
MESSAGE
puts msg
改好即可。
5. 小結(jié)
本章節(jié)中我們學(xué)習(xí)了如何使用 SMTP 來發(fā)送純文本、HTML、附件的郵件。