25

有没有人有关于使用 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 一起使用的质量信息,我们将不胜感激。

最好的。

4

5 回答 5

51

实际上,以下内容适用于没有插件或 gem 的 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 看起来像 'you@domain.com' & YourDomain 可能是你喜欢的任何东西,但我使用实际的域名。

于 2010-08-24T18:11:40.200 回答
10

我实际上刚刚开始工作。写了一个快速脚本来测试它。

我收到的错误与您不同(需要 STARTTLS),我还发现我必须使用端口 587 而不是 465。

我找到了让它在我发现的 Rails 插件中工作的技巧。(agilewebdevelopment.com/plugins/net_smtp_tls_support)

如果你“评估”这个文件(它增加了对标准 Net::SMTP 库的 tls 支持):

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: <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”

希望这可以帮助!

于 2009-08-13T03:10:22.377 回答
2

你连接到我假设的 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 ,这里是补丁。

于 2009-07-26T04:40:07.920 回答
1

您还需要在邮件主题和正文之间添加两个换行符。否则,将仅传输主题,而消息正文将留空。

msg = "Subject: My Subject Goes Here\n\nMy message goes here"
于 2011-09-21T01:44:32.623 回答
-1

https://web.archive.org/web/20110113211408/http://blog.segment7.net/articles/2009/07/08/smtp_tls-1-0-3 可能会有所帮助

这里还有一些字符可以满足 SO 要求...

于 2009-08-12T17:55:51.143 回答