Gửi Email bằng Ruby - SMTP
Simple Mail Transfer Protocol (SMTP) là một giao thức xử lý việc gửi e-mail và định tuyến e-mail giữa các máy chủ thư.
Ruby cung cấp lớp Net :: SMTP cho kết nối phía máy khách Giao thức truyền thư đơn giản (SMTP) và cung cấp hai phương thức lớp mới và bắt đầu .
Các new nhận hai tham số -
Tên máy chủ mặc định là localhost.
Số cổng mặc định là cổng 25 nổi tiếng.
Các start phương thức nhận các tham số này -
Máy chủ - tên IP của máy chủ SMTP, mặc định là localhost.
Các cổng - Số cổng, mặc định cho 25.
Các miền - Tên miền của người gửi mail, mặc định cho ENV [ "HOSTNAME"].
Các tài khoản - Tên đăng nhập, mặc định là con số không.
Các mật khẩu - mật khẩu tài khoản, mặc định cho nil.
Các AuthType - Cho Phép loại, mặc định cho cram_md5 .
Một đối tượng SMTP có một phương thức thể hiện được gọi là sendmail, phương thức này thường sẽ được sử dụng để thực hiện công việc gửi thư. Nó có ba tham số -
Các nguồn - Một chuỗi hoặc mảng hoặc bất cứ điều gì với mỗi iterator trở về một chuỗi tại một thời điểm.
Người gửi - Một chuỗi sẽ xuất hiện trong trường từ của email.
Người nhận - Một chuỗi hoặc một mảng chuỗi đại diện cho (các) người nhận địa chỉ của người nhận.
Thí dụ
Đây là một cách đơn giản để gửi một email bằng Ruby script. Hãy thử một lần -
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
MESSAGE_END
Net::SMTP.start('localhost') do |smtp|
smtp.send_message message, '[email protected]', '[email protected]'
end
Ở đây, bạn đã đặt một e-mail cơ bản trong thư, sử dụng một tài liệu, hãy chú ý định dạng tiêu đề một cách chính xác. E-mail yêu cầu mộtFrom, Tovà Subject tiêu đề, ngăn cách với nội dung của e-mail bằng một dòng trống.
Để gửi thư, bạn sử dụng Net :: SMTP để kết nối với máy chủ SMTP trên máy cục bộ và sau đó sử dụng phương thức send_message cùng với thư, địa chỉ từ và địa chỉ đích dưới dạng các tham số (mặc dù địa chỉ từ và đến là trong chính e-mail, chúng không phải lúc nào cũng được sử dụng để định tuyến thư).
Nếu bạn không chạy máy chủ SMTP trên máy của mình, bạn có thể sử dụng Net :: SMTP để giao tiếp với máy chủ SMTP từ xa. Trừ khi bạn đang sử dụng dịch vụ email trực tuyến (chẳng hạn như Hotmail hoặc Yahoo! Mail), nhà cung cấp email của bạn sẽ cung cấp cho bạn thông tin chi tiết về máy chủ thư đi mà bạn có thể cung cấp cho Net :: SMTP, như sau:
Net::SMTP.start('mail.your-domain.com')
Dòng mã này kết nối với máy chủ SMTP trên cổng 25 của mail.your-domain.com mà không sử dụng bất kỳ tên người dùng hoặc mật khẩu nào. Tuy nhiên, nếu cần, bạn có thể chỉ định số cổng và các chi tiết khác. Ví dụ -
Net::SMTP.start('mail.your-domain.com',
25,
'localhost',
'username', 'password' :plain)
Ví dụ này kết nối với máy chủ SMTP tại mail.your-domain.com bằng tên người dùng và mật khẩu ở định dạng văn bản thuần túy. Nó xác định tên máy của khách hàng là localhost.
Gửi e-mail HTML bằng Ruby
Khi bạn gửi tin nhắn văn bản bằng Ruby thì tất cả nội dung sẽ được coi là văn bản đơn giản. Ngay cả khi bạn bao gồm các thẻ HTML trong một tin nhắn văn bản, nó sẽ được hiển thị dưới dạng văn bản đơn giản và các thẻ HTML sẽ không được định dạng theo cú pháp HTML. Nhưng Ruby Net :: SMTP cung cấp tùy chọn để gửi một tin nhắn HTML dưới dạng tin nhắn HTML thực tế.
Trong khi gửi email, bạn có thể chỉ định phiên bản Mime, loại nội dung và bộ ký tự để gửi email HTML.
Thí dụ
Sau đây là ví dụ để gửi nội dung HTML dưới dạng email. Hãy thử một lần -
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
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, '[email protected]', '[email protected]'
end
Gửi tệp đính kèm dưới dạng e-mail
Để gửi một email có nội dung hỗn hợp, yêu cầu đặt Content-type tiêu đề tới multipart/mixed. Sau đó, các phần văn bản và phần đính kèm có thể được chỉ định trongboundaries.
Ranh giới được bắt đầu bằng hai dấu gạch nối theo sau là một số duy nhất, không thể xuất hiện trong phần thư của email. Ranh giới cuối cùng biểu thị phần cuối cùng của email cũng phải kết thúc bằng hai dấu gạch nối.
Các tệp đính kèm phải được mã hóa bằng pack("m") có chức năng mã hóa base64 trước khi truyền.
Thí dụ
Sau đây là ví dụ, sẽ gửi một tệp /tmp/test.txt dưới dạng tệp đính kèm.
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 <[email protected]>
To: A Test User <[email protected]>
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, '[email protected]', ['[email protected]'])
end
rescue Exception => e
print "Exception occured: " + e
end
NOTE - Bạn có thể chỉ định nhiều đích bên trong mảng nhưng chúng nên được phân tách bằng dấu phẩy.