2009-07-26 5 views
22

Есть ли у кого-нибудь качественная (и обновленная) информация о отправке почты через Gmail с использованием Ruby's Net :: SMTP? Я видел несколько примеров - большинство из них с 2007 по середину 2008 года, и никто из них не работает для меня. Мне нужны более современные примеры, которые используют самую последнюю версию 1.8.7. Я также был бы признателен, если бы документация не только охватывала простые примеры, которые никто никогда не использует.(Ruby) Получение Net :: SMTP работает с Gmail ...?

В настоящее время я получаю сообщение об ошибке:

SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol 

Я не очень знаком с SSL в отношении протокола SMTP, так что это все потеряли на меня. К сожалению, документация Net :: SMTP охватывает только базы и не предоставляет полный список различных потенциальных контекстов OpenSSL :: SSL, поэтому я не могу попробовать различные.

В любом случае, если у кого-то есть информация о качестве получения этого для работы с Gmail, это было бы очень признательно.

Лучший.

ответ

10

Я на самом деле только что получил эту работу. Написал быстрый скрипт, чтобы проверить его.

я получаю другую ошибку, чем вы (требующие 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»

Надеется, что это помогает!

+0

похоже, что есть камень smtp_tls, который, вероятно, тоже будет работать ... – Jerceratops

+0

Утерянный URL-адрес «Вышеупомянутый файл». Любые идеи, куда он ушел? Эй! Нашел его: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

Вы подключаетесь к порту smtp.gmail.com 465 Я предполагаю? .

openssl s_client -connect smtp.gmail.com:587 

CONNECTED (00000003) 8298: ошибка: 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 here - это патч.

+0

На самом деле Gmail кажется странным зверем. Порт 465 работает очень хорошо, но необходимость работать с портом 587 * и * использовать STARTTLS вызывает проблемы. Последнее - это комбинация, мне нужно работать. Есть идеи? –

+0

Значит, вы говорите, что SSL/STARTTLS даже не возможен на 587? –

+0

Я отредактировал мое сообщение. Команда STARTTLS после HELO без SSL для запроса запуска сервера, похоже, работает. Я не уверен. –

46

На самом деле ниже работает для Gmail без плагин или драгоценный камень, по крайней мере, с Руби 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 выглядит как «вы @ domain.com '& YourDomain может быть чем угодно, но я использую фактическое доменное имя.

+0

Он отлично работает, спасибо большое ... – jasoares

+1

О, боже мой, спасибо. Документация по этому поводу ужасная. Хороший пример! :) –

+0

Я получаю сообщение об ошибке «уровень стека слишком глубокий». первое электронное письмо отправляется «нормально», а затем, пытаясь отправить другое электронное письмо, я получил эту ошибку. В чем может быть проблема? Благодарю. –

1

Вам также необходимо иметь два символа новой строки между объектом и телом сообщения. В противном случае будет передан только субъект, и тело сообщения останется пустым.

msg = "Subject: My Subject Goes Here\n\nMy message goes here"