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


上記の例では、正しいヘッダー形式に注意して、基本的な電子メール メッセージを設定しました。電子メールには From、To、Subject が必要であり、本文の内容とヘッダー情報の間には空行が必要です。


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

注: 複数の送信アドレスを指定できますが、カンマで区切る必要があります。