(Ruby) Получение Net:: SMTP работает с Gmail...?
Есть ли у кого-нибудь качественная (и обновленная) информация о отправке почты через Gmail с использованием Ruby Net:: SMTP? Я видел несколько примеров - большинство из них с 2007 по середину 2008 года, и никто из них не работает для меня. Мне нужны более современные примеры, которые используют самую последнюю версию 1.8.7. Я также был бы признателен, если бы документация не только охватывала простые примеры, которые никто никогда не использует.
В настоящее время я получаю сообщение об ошибке:
SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol
Я не очень хорошо знаком с SSL в отношении протокола SMTP, так что это все потеряно для меня. К сожалению, Net:: SMTP-документация охватывает только базы и не предоставляет полный список различных потенциальных контекстов OpenSSL:: SSL, поэтому я не могу попробовать разные.
В любом случае, если у кого-то будет какая-либо информация о качестве работы с Gmail, это будет очень полезно.
Бест.
Ответы
Ответ 1
Я просто получил эту работу. Написал быстрый script, чтобы проверить его.
Я получал другую ошибку, чем вы (требуя STARTTLS), я также обнаружил, что мне нужно использовать порт 587 вместо 465.
Я нашел трюк, чтобы заставить его работать в плагине Rails, который я нашел. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)
если вы 'eval' этот файл (он добавляет поддержку tls в стандартную библиотеку Net:: SMTP):
http://happiness-is-slavery.net/wp-content/rails-plugins/smtp_add_tls_support/lib/smtp_add_tls_support.rb
затем запустите "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: <[email protected]>
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"
Надеюсь, это поможет!
Ответ 2
На самом деле ниже работает для gmail без плагина или жемчужины, по крайней мере с Ruby 1.9.1p376, но удачи в поиске документации, которая вам скажет:
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 выглядит как "[email protected]", и YourDomain может быть чем угодно, но я использую фактическое имя домена.
Ответ 3
Вы подключаетесь к порту smtp.gmail.com 465, который я предполагаю?
,
openssl s_client -connect smtp.gmail.com:587
CONNECTED (00000003)
8298: error: 140770FC: SSL-процедуры: SSL23_GET_SERVER_HELLO: неизвестный протокол: s23_clnt.c: 601:
Ошибка выглядит очень похожей на вашу. Выполняется следующая команда:
openssl s_client -starttls smtp -connect smtp.gmail.com:587
Итак, я думаю, что происходит то, что у вас нет поддержки STARTTLS. Я не уверен, как это сделать в рубине. Я выяснил, что плагин action_mailer_tls позволяет это, исправляя Net:: SMTP. Начиная с Ruby 1.8.7, Net:: SMTP поддерживает эту поддержку.
Если вы используете Ruby < 1.8.7 здесь является патчем.
Ответ 4
Вам также необходимо иметь два символа новой строки между объектом и телом сообщения. В противном случае будет передан только объект, и тело сообщения останется пустым.
msg = "Subject: My Subject Goes Here\n\nMy message goes here"
Ответ 5
https://web.archive.org/web/20110113211408/http://blog.segment7.net/articles/2009/07/08/smtp_tls-1-0-3
может помочь
и вот еще несколько символов, удовлетворяющих требованиям SO...