Ruby-sending-email

提供:Dev Guides
移動先:案内検索

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&commat;fromdomain.com>
To: A Test User <test&commat;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&commat;fromdomain.com', 'test&commat;todomain.com'
end

ここでは、ドキュメントを使用して、ヘッダーを正しくフォーマットするように注意しながら、基本的な電子メールをメッセージに配置しました。 電子メールには、 FromTo 、および 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&commat;fromdomain.com>
To: A Test User <test&commat;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&commat;fromdomain.com', 'test&commat;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&commat;fromdomain.net>
To: A Test User <test&commat;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 &plus; part2 &plus; part3

# Let's put our code in safe area
begin
   Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail(mailtext, 'me&commat;fromdomain.net', ['test&commat;todmain.com'])
   end
rescue Exception => e
   print "Exception occured: " &plus; e
end

-配列内で複数の宛先を指定できますが、コンマで区切る必要があります。