Ruby-sending-email
Rubyを使用した電子メールの送信-SMTP
SMTP(Simple Mail Transfer Protocol)は、メールサーバー間の電子メールの送信と電子メールのルーティングを処理するプロトコルです。
- Rubyは、SMTP(Simple Mail Transfer Protocol)クライアント側接続用のNet
- SMTPクラスを提供し、2つのクラスメソッド_new_および_start_を提供します。
- *新しい*は2つのパラメータを取ります-
- _server name_のデフォルトはlocalhostです。
- _ポート番号_のデフォルトは、既知のポート25です。
- *開始*メソッドはこれらのパラメータを取ります-
- server-SMTPサーバーのIP名。デフォルトはlocalhostです。
- port-ポート番号、デフォルトは25。
- domain-メール送信者のドメイン。デフォルトはENV ["HOSTNAME"]です。
- account-ユーザー名、デフォルトはnilです。
- password-ユーザーパスワード、デフォルトはnil。
- authtype-許可タイプ、デフォルトは_cram_md5_。
SMTPオブジェクトには、sendmailと呼ばれるインスタンスメソッドがあります。これは通常、メッセージのメール送信作業を行うために使用されます。 それは3つのパラメータを取ります-
- source-文字列または配列、または一度に1つの文字列を返す_each_イテレータを持つもの。
- sender-電子メールの_from_フィールドに表示される文字列。
- recipients-受信者のアドレスを表す文字列または文字列の配列。
例
Rubyスクリプトを使用して1つのメールを送信する簡単な方法を次に示します。 一度試してください-
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!など)を使用していない場合 メール)、あなたの電子メールプロバイダーは、次のようにNet :: SMTPに提供できる送信メールサーバーの詳細を提供します-
Net::SMTP.start('mail.your-domain.com')
このコード行は、ユーザー名やパスワードを使用せずにmail.your-domain.comのポート25でSMTPサーバーに接続します。 ただし、必要な場合は、ポート番号などの詳細を指定できます。 たとえば-
Net::SMTP.start('mail.your-domain.com',
25,
'localhost',
'username', 'password' :plain)
この例では、プレーンテキスト形式のユーザー名とパスワードを使用して、mail.your-domain.comのSMTPサーバーに接続します。 クライアントのホスト名をローカルホストとして識別します。
Rubyを使用してHTML電子メールを送信する
- Rubyを使用してテキストメッセージを送信すると、すべてのコンテンツが単純なテキストとして扱われます。 テキストメッセージにHTMLタグを含める場合でも、単純なテキストとして表示され、HTMLタグはHTML構文に従ってフォーマットされません。 ただし、Ruby Net
- SMTPは、HTMLメッセージを実際の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 に設定する必要があります。 次に、 boundaries 内でテキストと添付セクションを指定できます。
境界は、2つのハイフンで始まり、その後に一意の番号が続きます。この番号は、電子メールのメッセージ部分には表示できません。 電子メールの最終セクションを示す最終境界も、2つのハイフンで終わる必要があります。
添付ファイルは、* pack( "m")*関数でエンコードしてから、送信前にbase64エンコードする必要があります。
例
以下は、ファイル /tmp/test.txt を添付ファイルとして送信する例です。
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 <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
# 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, 'me@fromdomain.net', ['test@todmain.com'])
end
rescue Exception => e
print "Exception occured: " + e
end
注-配列内で複数の宛先を指定できますが、コンマで区切る必要があります。