【发布时间】:2013-07-22 15:47:00
【问题描述】:
在 Mac 上,我可以使用命令 mail 从命令行发送电子邮件,但我的 MacBookPro 上肯定没有安装 SMTP 服务器。
那么,可以在没有 SMTP 服务器的情况下使用 Ruby 发送电子邮件吗?我不在乎速度,我只想要一种无需额外软件即可发送电子邮件的方法。
【问题讨论】:
-
你还没有很努力地弄清楚这一点。您是否尝试在 Google 上搜索“ruby + smtp”?
在 Mac 上,我可以使用命令 mail 从命令行发送电子邮件,但我的 MacBookPro 上肯定没有安装 SMTP 服务器。
那么,可以在没有 SMTP 服务器的情况下使用 Ruby 发送电子邮件吗?我不在乎速度,我只想要一种无需额外软件即可发送电子邮件的方法。
【问题讨论】:
您的目标是通过 CLI 编写和发送电子邮件吗?
有许多邮件宝石,包括mail。您可能还可以直接使用 Ruby 的 Net::SMTP 并获得一些工作,这取决于您要做什么。
【讨论】:
mail 正在阅读的 OS X 的邮件帐户?
您不必有一个 SMTP 服务器,您只需要知道您可以连接到哪里。
见Net::SMTP。它是 Ruby 的一部分。
【讨论】:
您可以在 Ruby 代码中调用 mail 命令。使用system 或反引号或更复杂的东西(如open3)与系统命令进行交互......这是对不同方法的一个很好的概述:http://mentalized.net/journal/2010/03/08/5_ways_to_run_commands_from_ruby/
【讨论】:
mail和sendmail
我不太了解mail,但Google 上的results from a quick search 似乎表明它使用postfix,这是Mac 上安装的默认SMTP 服务器。换句话说,您已经在 Macbook Pro 上安装并运行了 SMTP 服务器。
那么,是否可以在没有 SMTP 服务器的情况下使用 Ruby 发送电子邮件?
是和否。您不需要在与 Ruby 进程相同的机器上运行 SMTP 服务器。事实上,您甚至不需要运行自己的 SMTP 服务器。但是,您需要一个 SMTP 服务器某处 来发送您的电子邮件。
article on howstuffworks 很好地解释了 SMTP 的作用。从本质上讲,您需要一个 SMTP 服务器来接收您的电子邮件、与其他 SMTP 服务器通信并传递您的电子邮件以进行传递。使用 Ruby,您可以配置 Net::SMTP 以连接到您选择的 SMTP 服务器。
如果您想编写和执行一个发送少量电子邮件的脚本,请在 Gmail/Live 上创建一个虚假电子邮件帐户,并使用他们的 SMTP 服务器发送电子邮件。
如果您想构建和启动一个向您的用户发送电子邮件的应用程序,请使用Mandrill、MailGun 或 SendGrid。 Mandrill 有一个免费层供您开始使用。
我不建议在大多数用例中运行您自己的 SMTP 服务器,因为您的电子邮件可能会被标记为垃圾邮件。 (Comcast 也可能认为您的网络中存在恶意软件。) Mandrill 等专业服务将帮助您设置 SPF and DKIM records 以验证您的电子邮件并提高发送声誉。
(如果您只想在开发模式下测试电子邮件,请使用MailCatcher。)
注册一个Mandrill 帐户,然后在Ruby 中使用Net::SMTP 连接到他们的SMTP 服务器。不需要额外的软件。
【讨论】:
如果您的mail 命令有效,那么您可以从内部发送邮件
红宝石。如果您的 mail 命令已经在您的 Mac 上运行,那么
你也已经有一个 SMTP 服务器在你的 mac 上工作,因为
默认使用已安装的postfix。 mail 命令
默认使用/usr/sbin/sendmail,在这种情况下是
与postfix 的接口。 (从终端尝试man sendmail。)
现在,也就是说,当您尝试在本地使用 Net::SMTP 时,您可能会遇到类似的情况:
[3] pry(main)> smtp = Net::SMTP.start('localhost',25)
Errno::ECONNREFUSED: Connection refused - connect(2)
这意味着你需要做一些事情来告诉你的 mac 它可以
接受端口 25 上的连接。另一种选择是使用
sendmail 程序作为传输访问方法,实际上可能是
更好的选择。关闭 25 端口访问,让其他人没有
可以将您的 mac 用作邮件中继。必须通过sendmail
命令意味着只有你的mac上的程序可以发送邮件(去
图)。
我的建议是使用mail gem(或者pony,如果你
首选)并将其配置为使用sendmail。来自mailREADME
文件:
通过 sendmail 发送可以这样完成:
mail = Mail.new do from 'me@test.lindsaar.net' to 'you@test.lindsaar.net' subject 'Here is the image you wanted' body File.read('body.txt') add_file :filename => 'somefile.png', :content => File.read('/somefile.png') end mail.delivery_method :sendmail mail.deliver
同样,如果您使用的是ActionMailer,您可以将其配置为使用
sendmail 也是。
【讨论】:
你试过Pony gem吗?它为sendmail 提供了一个非常简单的界面,应该已经安装在您的 Mac 上。
【讨论】:
如果您使用mail 或/usr/sbin/sendmail 命令并且您的邮件成功发送,那么您的机器上运行了一个MTA(邮件/邮件传输代理,例如postfix、sendmail 或其他)。
当您使用mail 命令向guser@gmail.com 发送邮件时,您的mail 命令会将邮件提交到本地SMTP 服务器。
(本地)SMTP 服务器将执行以下任务。
Mx 服务器会将邮件投递到对应的邮箱(guser)。
以上答案建议您使用 Net::SMTP 连接到某个 SMTP 服务器并将邮件移交给该 SMTP 服务器,该服务器将再次执行上述任务(上述本地 SMTP 服务器)以执行传递.
所以要发送邮件,你需要一个 SMTP 服务器。或者您将不得不自己编写代码/使用一些库来执行 MX 查找并通过按照 RFC 2821 使用 SMTP 命令将邮件移交给 MX 服务器。
【讨论】: