尝试使用action_mailer_tls
插件在我的Rails应用中与Gmail通信时出现错误:
Must issue a STARTTLS command first
其他人似乎遇到了this same problem:
问题是Gmail需要TLS 身份验证但标准的Ruby net / smtp库不支持TLS。
本文建议按照以下步骤操作:
当然有一个有用的插件 由Marc Chung创造以克服这一点 屏障。你可以在这里找到它 手动将其添加到您的项目或您 可以将其导出到您的插件 。目录
$ cd vendor/plugins
- 醇>
$ svn export http://code.openrain.com/rails/action_mailer_tls/
无论哪种方式确保您需要 'smtp_tls'
现在您只需要更新您的 smtp_settings,如果你还没有这样做 已经
- ActionMailer :: Base.smtp_settings = {
- :address => “smtp.gmail.com”,
- :port => 587,
- :domain => “domain.com”,
- :user_name => “user@domain.com”,
- :password => “密码”,
- :authentication => :plain
- }
醇>
任何有关更好地与Gmail通信的解决方案的建议都将受到赞赏。
答案 0 :(得分:10)
我使用Alexander Pomozov的解决方案从我的Rails应用程序与Gmail交谈。我相信原始文章已经消失,但有人已经复制了Google缓存over here。
require "openssl"
require "net/smtp"
Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, 'SMTP session already started' if @started
check_auth_args user, secret, authtype if user or secret
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
check_response(critical { recv_response() })
do_helo(helodomain)
if starttls
raise 'openssl library not installed' unless defined?(OpenSSL)
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
#@socket.debug_output = STDERR #@debug_output
do_helo(helodomain)
end
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end
def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end
def starttls
getok('STARTTLS') rescue return false
return true
end
def quit
begin
getok('QUIT')
rescue EOFError, OpenSSL::SSL::SSLError
end
end
end
(添加其他所有内容后)
require “smtp_tls”
ActionMailer::Base.smtp_settings = {
:address => “smtp.gmail.com”,
:port => 587,
:authentication => :plain,
:user_name => “someone@openrain.com”,
:password => ’someonesPassword’
}
正常使用ActionMailer。
答案 1 :(得分:5)
使用Ruby 1.8.7和Rails 2.3.4(虽然已经有多个版本),但我已经成功,而不需要使用:enable_starttls_auto
选项来使用特定于TLS的ActionMailer插件。示例配置(来自生产环境)如下所示:
ActionMailer::Base.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => "domain.com",
:authentication => :plain,
:user_name => "username@domain",
:password => "secret"
}
答案 2 :(得分:1)
我使用Option Explicit
Sub find()
Dim WS_Count As Integer
Dim i As Integer
Dim myValue As Variant
Dim Rng As Range
Dim wkb As Workbook
Dim lastrow As Long
WS_Count = Worksheets.Count
myValue = InputBox("Please enter the value that you want to look for:")
For i = 1 To WS_Count
With Worksheets(i).UsedRange
Set Rng = .find(What:=myValue)
If Not Rng Is Nothing Then
MsgBox ("The value" & " " & myValue & " " & "found in" & " " & ActiveWorkbook.Worksheets(i).Name & " " & Rng.Address)
'do whatever you want with the string found...
Else
MsgBox ("Nothing found in" & " " & ActiveWorkbook.Worksheets(i).Name)
End If
End With
Next i
End Sub
启用了starttls,但仍然遇到了同样的错误。最后,我能够在不对代码进行任何更改的情况下解决它。如果您使用smtp.gmail.com发送邮件,则必须首先允许安全性较低的应用程序使用您的电子邮件发送邮件。为此,请使用您要从中发送邮件的帐户登录并转到
this link和开启对不太安全的应用的访问权限
编辑:如果您不允许将设置更改为安全性较低的应用,则应联系该域的管理员帐户持有者以更改设置,以允许用户使用安全性较低的应用。
如果您拥有管理员权限,则可以允许用户更改其不太安全的应用设置,您可以从https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess更改它
PS:不要忘记更改上述链接中的域名。
希望这会好起来!!
答案 3 :(得分:0)
我正在运行rails 2.3.4虽然我认为(从谷歌搜索)你不需要任何插件,只需要线路
:enable_starttls_auto =>真,
当我使用上面滑雪发布的Alexander Pomozov解决方案时,我实际上只能使用它(对你们来说很重要)。有什么评论为什么?会很棒,但我很高兴它有效。