【问题标题】:Ruby send mail with smtpRuby 使用 smtp 发送邮件
【发布时间】:2010-04-05 22:12:38
【问题描述】:

我正在尝试使用 XCode(安装 Ruby)在 OS X 上通过 Ruby(无 Rails)发送简单的电子邮件。但我的 smtp 服务器遇到了问题,需要电子邮件客户端之前检查邮件作为一种身份验证形式发送。

在发送邮件之前,如何让 Ruby 以“POP”方式向 smtp 服务器进行身份验证?不下载邮件;我只想发送 html 格式的电子邮件(最终通过 Applescript 调用 Ruby,因为 Applescript 不支持 smtp),但服务器要求我在发送之前检查邮件。

编辑 4/05/10:

嗯,这很尴尬。结果变得更简单了;我试图让它变得比它需要的更复杂。即使我的邮件服务器需要在 smtp 之前弹出,这发送 OK:

require 'net/smtp'

message = <<MESSAGE_END
    From: Private Person <me@fromdomain.com>
    To: A Test User <test@todomain.com>
    Subject: SMTP e-mail test

    This is a test e-mail message.
    MESSAGE_END

Net::SMTP.start('mail.mydomain.com', 25) do |smtp|
smtp.send_message message,
            'mark@mydomain.com',
            'mark@mydomain.com'
end

编辑 4/04/10:

这样我得到一个 500 无法识别的命令错误;不过,pop 服务器正在响应。

require 'net/smtp'
require 'net/pop'

message = <<MESSAGE_END
From: Private Person <me@fromdomain.com>
To: A Test User <test@todomain.com>
Subject: SMTP e-mail test

This is a test e-mail message.
MESSAGE_END

Net::POP3.start('mail.mydomain.com', 110, 'mark@mydomain.com', 'password') do |pop|

// If this line is included,
// I get a printout of the number
// of emails on the server
// right before the error:
//
// puts pop.n_mails  end

Net::SMTP.start('mail.markratledge.com', 
                25, 
                'localhost', 
                'mark@mydomain.com', 'password', :plain) do |smtp|
  smtp.send_message message, 'mark@mydomain.com', 
                             'mark@mydomain.com'
end
end

【问题讨论】:

  • 如果 smtp 服务器上的 pop 不可用,为什么需要 pop 检查?
  • 我的错;我的意思是说安全流行......
  • 我怀疑在执行 pop.finish 时出现 500 错误的原因是,如果您像上面那样将块传递给 POP3.start,那么连接会在结束时自动为您关闭因此,通过输入pop.close,您将尝试关闭连接两次。
  • 4/05/10 编辑可能有效,因为您无需身份验证即可向自己发送电子邮件。它可能只中继到其他需要 POP before SMTP 的域。
  • 你是对的;它不适用于其他域。在 smtp 之前使用 POP 登录服务器仍在调整和接近;现在我收到“已请求 SMTP-AUTH 但缺少密码短语”错误。

标签: ruby xcode macos smtp


【解决方案1】:

POP before SMTP 不是Net::SMTP 支持的身份验证类型之一,所以我认为您将不得不使用Net::POP3 进行 POP3 登录,例如

require 'net/pop'
pop = Net::POP3.start(addr, port, account, password)
pop.finish

Net::POP3 在标准库中,所以应该可以在Net::SMTP 所在的任何地方使用。

【讨论】:

  • 越来越近了。使用上面的代码,我得到一个 200 响应代码,表明 pop 服务器已准备好。 (显然我只是在学习 Ruby...)
  • start 应该连接到服务器并让您登录。尝试在POP3.start 之后插入puts pop.n_mails - 这应该会打印邮箱中的消息数作为您的诊断'肯定是在与 POP 服务器通话。还可以在建立 SMTP 连接之前尝试执行 pop.finish。如果您真的尝试通过 SMTP发送消息,现在会发生什么?
  • 移动 pop.finish 不走运;仍然是500错误。如果不先检查电子邮件,仍然无法通过 SMTP 发送。但是我可以使用上面的代码片段登录到弹出服务器。
  • 目前您正在从Net::POP3.start 块内部执行Net::SMTP.start。如果把它移到外面呢?您是否收到带有 500 错误的描述性消息提供任何线索?
  • 更新代码;我试图让事情变得过于复杂。感谢您在过去几天的帮助。
【解决方案2】:

如果这不能让您的服务器满意,那么 Net::Telnet 会让您自己发送原始命令。

【讨论】:

  • 我没有远程登录访问我的服务器;只有 ssh。
  • 如果您在适当的端口号(POP 为 110,SMTP 为 25)上打开 telnet 连接,则可以发送原始命令。
  • 我又检查了一遍,你们都是对的;我确实有远程访问权限。我认为过去在这个共享主机上禁用了 telnet。最终,Ruby 脚本将从 Applescript 中调用,以发送 html 格式的电子邮件,因此 telnet 可以方便地测试 pop 服务器,但是 telnet 可以接收 html 格式的电子邮件吗?
  • 我认为你根本不了解我。我建议你 telnet 到 25 端口并发送你自己的 SMTP 命令,而不是登录到 telnet 守护进程。
  • 我几乎做到了;我可以 telnet 到端口 25 和 HELO 并以这种方式与服务器通信,但在我尝试 Ruby telnet 包括之前,我将继续尝试使用上面的 pop 和 smtp 代码。
猜你喜欢
  • 2016-01-13
  • 2010-12-06
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2013-04-16
  • 2012-10-04
相关资源
最近更新 更多