Rubyを使用した電子メールの送信-SMTP

Simple Mail Transfer Protocol(SMTP)は、メールサーバー間での電子メールの送信とルーティングを処理するプロトコルです。

Rubyは、SMTP(Simple Mail Transfer Protocol)クライアント側接続用のNet :: SMTPクラスを提供し、newstartの2つのクラスメソッドを提供します。

  • ザ・ new 2つのパラメータを取ります-

    • サーバ名はlocalhostをデフォルト。

    • デフォルトのポート番号は、既知のポート25です。

  • ザ・ start メソッドはこれらのパラメータを取ります-

    • サーバー- SMTPサーバーのIP名、localhostに不履行。

    • ポート- 25をデフォルトのポート番号、。

    • ドメインENV [「HOSTNAME」]をデフォルトメール送信者のドメイン、 - 。

    • アカウント-ユーザー名、デフォルトはnilです。

    • パスワード-ユーザーのパスワード、nilに不履行。

    • authType -認証タイプ、をデフォルトCRAM_MD5

SMTPオブジェクトには、sendmailと呼ばれるインスタンスメソッドがあります。これは通常、メッセージをメールで送信する作業を行うために使用されます。それは3つのパラメータを取ります-

  • ソース-の文字列又はアレイ又は何かイテレータは、一度に1つの文字列を返します。

  • 送信者-に表示される文字列からの電子メールのフィールド。

  • 受信者-文字列または受信者の宛先(複数可)を表す文字列の配列。

これは、Rubyスクリプトを使用して1つの電子メールを送信する簡単な方法です。一度試してみてください-

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
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

ここでは、ヘッダーを正しくフォーマットするように注意しながら、ドキュメントを使用して基本的な電子メールをメッセージに配置しました。電子メールにはFromTo、および Subject 電子メールの本文から空白行で区切られたヘッダー。

メールを送信するには、Net :: SMTPを使用してローカルマシンのSMTPサーバーに接続し、send_messageメソッドをメッセージ、差出人アドレス、および宛先アドレスとともにパラメーターとして使用します(差出人アドレスと宛先アドレスは電子メール自体の中で、これらは常にメールのルーティングに使用されるとは限りません)。

マシンでSMTPサーバーを実行していない場合は、Net :: SMTPを使用してリモートSMTPサーバーと通信できます。Webメールサービス(HotmailやYahoo! Mailなど)を使用している場合を除き、次のように、電子メールプロバイダーから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サーバーに接続します。クライアントのホスト名をlocalhostとして識別します。

Rubyを使用してHTMLメールを送信する

Rubyを使用してテキストメッセージを送信すると、すべてのコンテンツが単純なテキストとして扱われます。テキストメッセージにHTMLタグを含めても、単純なテキストとして表示され、HTMLタグはHTML構文に従ってフォーマットされません。ただし、Ruby Net :: SMTPには、HTMLメッセージを実際のHTMLメッセージとして送信するオプションがあります。

電子メールメッセージの送信中に、HTML電子メールを送信するためのMimeバージョン、コンテンツタイプ、および文字セットを指定できます。

以下は、HTMLコンテンツを電子メールとして送信する例です。一度試してみてください-

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
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。次に、テキストと添付ファイルのセクションを内で指定できます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 <[email protected]>
To: A Test User <[email protected]>
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, '[email protected]', ['[email protected]'])
   end
rescue Exception => e  
   print "Exception occured: " + e  
end

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