Ruby によるメール送信 - SMATP
SMTP (Simple Mail Transfer Protocol) は、送信元アドレスから宛先アドレスへメールを送信するための一連のルールであり、レターの転送方法を制御します。
Ruby は電子メールを送信するための Net::SMTP を提供し、new と start の 2 つのメソッドを提供します:
new このメソッドには 2 つのパラメータがあります:
サーバー名 デフォルトは localhost
ポート番号です デフォルトは 25 です
start メソッドには次のパラメータがあります:
server - SMTP サーバー IP、デフォルトは 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: 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 メソッドを使用して電子メールを送信します。メソッドのパラメーターは送信者の電子メールと受信者の電子メールです。
ローカル マシンで SMTP サーバーが実行されていない場合は、Net::SMTP を使用してリモート SMTP サーバーと通信できます。 Web メール サービス (Hotmail や Yahoo Mail など) を使用している場合、電子メール プロバイダーから送信メール サーバーの詳細が提供されます:
Net::SMTP.start('mail.your-domain.com')
上記のコードは、ホスト mail.your-domain.com とポートに接続します。番号 25 のメール サーバー。ユーザー名とパスワードを入力する必要がある場合、コードは次のとおりです:
Net::SMTP.start('mail.your-domain.com', 25, 'localhost', 'username', 'password', :plain)
上記の例では、指定されたユーザー名とパスワードを使用して、ホスト mail.your- でメール サーバーに接続します。ドメイン.com とポート番号 25 。
Ruby を使用して HTML メールを送信する
Net::SMTP は、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 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, 'me@fromdomain.com', 'test@todomain.com' end
添付ファイル付きの電子メールを送信する
混合コンテンツを含む電子メールを送信する必要がある場合は、Content-type を multipart/mixed に設定する必要があります。 これにより、電子メールに添付ファイルのコンテンツを追加できるようになります。
添付ファイルは、送信前に pack("m") 関数を使用して内容を Base64 形式に変換する必要があります。
例
次の例では、/tmp/test.txt が添付された電子メールを送信します。
require 'net/smtp' filename = "/tmp/test.txt" # 读取文件并编码为base64格式 filecontent = File.read(filename) encodedcontent = [filecontent].pack("m") # base64 marker = "AUNIQUEMARKER" body =<<EOF This is a test email to send an attachement. EOF # 定义主要的头部信息 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 # 定义消息动作 part2 =<<EOF Content-Type: text/plain Content-Transfer-Encoding:8bit #{body} --#{marker} EOF # 定义附件部分 part3 =<<EOF Content-Type: multipart/mixed; name=\"#{filename}\" Content-Transfer-Encoding:base64 Content-Disposition: attachment; filename="#{filename}" #{encodedcontent} --#{marker}-- EOF mailtext = part1 + part2 + part3 # 发送邮件 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
注: 複数の送信アドレスを指定できますが、カンマで区切る必要があります。