(Ruby) Net::SMTP を Gmail で動作させるには…?
-
19-09-2019 - |
質問
Ruby の Net::SMTP を使用した Gmail 経由のメール送信に関する質の高い (そして最新の) 情報を持っている人はいますか?私はいくつかの例を見てきましたが、そのほとんどは 2007 年から 2008 年半ばまでのもので、どれも私にとっては役に立ちませんでした。最新の 1.8.7 リリースを使用する、より最新の例が必要です。また、ドキュメントが誰も実際には使用しない単純な例だけを取り上げていないこともありがたいと思います。
現在、次のエラーが発生しています。
SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol
私は SMTP プロトコルに関しては SSL にあまり詳しくないので、まったくわかりません。残念ながら、Net::SMTP のドキュメントでは基本的な部分のみが説明されており、潜在的な OpenSSL::SSL コンテキストの完全なリストは提供されていないため、さまざまなコンテキストを試すことはできません。
とにかく、これを Gmail で動作させるための質の高い情報をお持ちの方がいらっしゃいましたら、大変感謝いたします。
最高。
解決
実際にこれを機能させたところです。テストするための簡単なスクリプトを作成しました。
私はあなたとは異なるエラー(STARTTLSが必要)が発生し、ポート465ではなくポート587を使用する必要があることもわかりました。
私が見つけたRailsプラグインでそれを動作させるためのトリックを見つけました。(agilewebdevelopment.com/plugins/net_smtp_tls_support)
このファイルを「評価」すると (標準 Net::SMTP ライブラリに tls サポートが追加されます):
次に、「Net::SMTP.enable_tls()」を実行します。
すべてがうまく機能しているようです。
私のコードは次のとおりです。
require 'rubygems'
require 'net/smtp'
eval File.read("smtp_tls.rb")
Net::SMTP.enable_tls()
FROM_EMAIL = "REMOVED"
PASSWORD = "REMOVED"
TO_EMAIL = "REMOVED"
msgstr = <<END_OF_MESSAGE
From: Your Name <#{FROM_EMAIL}>
To: my phone <#{TO_EMAIL}>
Subject: text message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@example.com>
This is a test message.
END_OF_MESSAGE
Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com',
FROM_EMAIL, PASSWORD, :plain) do |smtp|
smtp.send_message msgstr, FROM_EMAIL, TO_EMAIL
end
明らかに、上記のファイルを同じディレクトリにダウンロードし、「smtp_tls.rb」という名前を付けました。
お役に立てれば!
他のヒント
実際、以下はプラグインや gem を使わずに、少なくとも Ruby 1.9.1p376 では Gmail で機能しますが、そのことを示すドキュメントが見つかると幸いです。
require 'net/smtp'
msg = "Subject: Hi There!\n\nThis works, and this part is in the body."
smtp = Net::SMTP.new 'smtp.gmail.com', 587
smtp.enable_starttls
smtp.start(YourDomain, YourAccountName, YourPassword, :login) do
smtp.send_message(msg, FromAddress, ToAddress)
end
YourAccountName は「you@domain.com」のようになります。YourDomain はおそらく任意の名前にすることができますが、ここでは実際のドメイン名を使用します。
smtp.gmail.com ポート 465 に接続していると思われますか?。
openssl s_client -connect smtp.gmail.com:587
接続(00000003)8298:エラー:140770FC:SSLルーチン:SSL23_GET_SERVER_HELLO:不明なプロトコル:S23_CLNT.C:601:
エラーはあなたのものと非常によく似ています。次のコマンドは機能します。
openssl s_client -starttls smtp -connect smtp.gmail.com:587
したがって、何が起こっているのかというと、STARTTLS サポートが有効になっていないということだと思います。Rubyでこれを行う方法がわかりませんが、購入したところ、action_mailer_tlsプラグインでNet::SMTPにパッチを適用することでこれが可能になることがわかりました。Ruby 1.8.7 以降、Net::SMTP にはこのサポートが組み込まれています。
Ruby 1.8.7 未満を使用している場合 ここ パッチです。
また、メッセージの件名と本文の間に 2 つの改行文字が必要です。それ以外の場合は、件名のみが送信され、メッセージ本文は空白のままになります。
msg = "Subject: My Subject Goes Here\n\nMy message goes here"
SO 要件を満たすさらにいくつかの文字をここに示します...