Ruby メール送信 - SMTP
SMTP(Simple Mail Transfer Protocol)は簡易メール転送プロトコルであり、送信元アドレスから宛先アドレスへメールを転送するための一連のルールです。これにより、手紙の中継方法が制御されます。
Rubyはメール送信に Net::SMTP を提供しており、new と start という2つのメソッドを提供しています:
newnew メソッドには2つのパラメータがあります:
- server nameデフォルトは localhost
- port numberデフォルトは 25
startstart メソッドには以下のパラメータがあります:
- server- SMTP サーバー IP、デフォルトは localhost
- port- ポート番号、デフォルトは 25
- domain- メール送信者のドメイン名、デフォルトは ENV["HOSTNAME"]
- account- ユーザー名、デフォルトは nil
- password- ユーザーパスワード、デフォルトは nil
- authtype- 認証タイプ、デフォルトはcram_md5
SMTP オブジェクトのインスタンス化メソッドは sendmail を呼び出します。パラメータは以下のとおりです:
- source- 文字列、配列、または各イテレータが任意の時点で返す任意のもの。
- sender- 文字列。email のフォームフィールドに表示されます。
- 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, '[email protected]',
'[email protected]'
end
上記の実例では、基本的な電子メールメッセージを設定しました。正しいヘッダー形式に注意してください。電子メールには From、To、Subject が必要で、テキストコンテンツとヘッダー情報の間には空行が必要です。
Net::SMTP を使用してローカルマシン上の SMTP サーバーに接続し、send_message メソッドを使用してメールを送信します。メソッドのパラメータは送信者メールと受信者メールです。
ローカルマシンで SMTP サーバーを実行していない場合は、Net::SMTP を使用してリモート SMTP サーバーと通信できます。ウェブメールサービス(Hotmail や Yahoo! メールなど)を使用する場合、電子メールプロバイダーが送信メールサーバーの詳細情報を提供します:
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-domain.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, '[email protected]',
'[email protected]'
end
添付ファイル付きメールの送信
混合コンテンツの電子メールを送信する必要がある場合は、Content-type を multipart/mixed に設定する必要があります。これにより、メールに添付ファイルのコンテンツを追加できます。
添付ファイルは転送前に使用する必要がありますpack("m")関数はその内容を base64 形式に変換します。
実例
以下の実例は、/tmp/test.txt を添付したメールを送信します:
実例
require 'net/smtp'
filename = "/tmp/test.txt"
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")
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
--
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, '[email protected]',
['[email protected]'])
end
rescue Exception => e
print "Exception occured: " + e
end
注意:複数の送信先アドレスを指定できますが、カンマで区切る必要があります。
その他の拡張