亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Ruby 入門教程 Ruby 入門教程 46 Ruby 使用 SMTP 發送郵件

Ruby 使用 SMTP 發送郵件

1. 開始前的準備

本章節中我們來講解在 Ruby 如果使用 SMTP(簡單郵件傳輸協議)來發送郵件,我們拿 163 郵箱來舉例子。

首先需要我們注冊一個163郵箱,然后開啟 SMTP 服務。

服務器名稱 時機簡介(調用的時機) SSL協議端口號 非SSL協議端口號
IMAP 構造函數,創建新對象時 993 143
SMTP smtp.163.com 465/994 25
POP3 pop.163.com 995 110

從上圖的表格中我們獲取到:在 163 中 SMTP 服務器的地址為:smtp.163.com,非 SSL 協議的端口為:25。

2. 發送第一個郵件(純文本)

我們會使用到Net::SMTP來發送郵件,這個庫提供了通過 SMTP 方式發送郵件的功能。

郵件是有格式的,不符合格式的郵件是不能發送的,郵件的格式規定如下:

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.

根據要求現在讓我們先來編輯一段郵件的內容:

sender_email = # 填寫剛剛注冊用來發送郵件的163賬號
receiver_email = # 填寫自己接收接收郵件的郵箱賬號
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

# ---- 輸出結果 ----
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方法來發送這個郵件(郵件是有密碼的)。并將我們剛才知道的郵件服務器地址和端口號添加到上面:

實例:

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

# ---- 輸出結果 ----
成功發送郵件~

運行成功后就會成功發送郵件到接收郵箱之中。

3. 發送HTML格式的郵件

如果我們要發送帶有 CSS 樣式的郵件,那么需要我們在 headers 中加入Content-type: text/html,并更改文件的內容:

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>測試標題</h1>
<p style="color: red;">測試這段話</p>

MESSAGE

puts msg

# ---- 輸出結果 ---
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>測試標題</h1>
<p style="color: red;">測試這段話</p>

接收到郵件后,我們可以看到內容中的 CSS 已經生效了。

4. 發送帶有附件的郵件

讓我們先創建一個 txt 文件作為附件。

echo "這是一個測試的txt文件" > test.txt

然后讓我再次修改 headers,增加Content-type: multipart/mixed。

注意事項:

我們需要使用 pack(“m”) 將函數轉化為 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. 小結

本章節中我們學習了如何使用 SMTP 來發送純文本、HTML、附件的郵件。