【问题标题】:Sending email from simple Sinatra app using Pony使用 Pony 从简单的 Sinatra 应用程序发送电子邮件
【发布时间】:2015-02-16 18:48:05
【问题描述】:

我正在使用 Sinatra 构建我的第一个投资组合页面。

我有一个“教科书”联系页面,其中包含“姓名”、“电子邮件”和“内容”字段。当有人提交表单时,我想收到一封电子邮件通知。

Pony 声称它可以通过简单的“一行”代码发送电子邮件。我已经阅读了the Pony documentation,但它的设置方法不是很详细。

不知道是我设置不正确,代码不对,Pony不是最好的工具,还是我的开发环境不允许发送邮件。

下面的代码应该是通过 post 方法发送电子邮件,然后通过save_message 方法将数据保存到 PostgreSQL 数据库中。数据已正确持久化。

#server.rb
require 'sinatra'
require 'pony'
require_relative 'model/methods'

get '/contact' do
  erb :contact
end

post '/thankyou' do
  unless params[:name] == '' || params[:email] == '' || params[:content] == ''
    Pony.options = {
      :subject => "Portfolio page: Message delivery from #{params[:name]}",
      :body => "#{params[:content]}",
      :via => :smtp,
      :via_options => {
        :address              => 'smtp.1and1.com',
        :port                 =>  '587',
        :enable_starttls_auto => true,
        :user_name            => ENV["USER_EMAIL_ADDRESS"],
        :password             => ENV["SMTP_PASSWORD"],
        :authentication       => :login,
        :domain               => 'nterrafranca.com'
        }
      }
    Pony.mail(:to => ENV["DESTINATION_EMAIL_ADDRESS"])
    save_message(params[:name], params[:email], params[:content])
  end
  redirect '/'
end

【问题讨论】:

  • 欢迎来到 Stack Overflow。虽然在问题中非常友好和熟悉是很好的,但这真的不是要使用的写作风格。将 Stack Overflow 视为一本编程食谱,由社区编辑,类似于 Wikipedia,其中问题是食谱中的问题陈述,以及相关的答案。绒毛不是必需的,也不一定是需要的;相反,写出深思熟虑的问题,你会做得很好。

标签: ruby email sinatra pony


【解决方案1】:

Pony 需要知道如何发送电子邮件,而不仅仅是收件人、发件人、主题和正文等。

pony documentation开始,默认使用sendmail,否则配置SMTP使用localhost。根据此应用程序的运行位置,sendmail 很可能不可用,并且localhost 上没有配置 SMTP。

我已经将 Pony 用于多个应用程序。每一个,我都为 Pony 配置了一个“noreply@”电子邮件地址,用于对 SMTP 进行身份验证,因此使用我自己的域电子邮件(通常是 Google Apps,甚至是 Gmail)进行我的 SMTP 连接。例如:

Pony.options = {
  :subject => "Some Subject",
  :body => "This is the body.",
  :via => :smtp,
  :via_options => {
    :address              => 'smtp.gmail.com',
    :port                 => '587',
    :enable_starttls_auto => true,
    :user_name            => 'noreply@cdubs-awesome-domain.com',
    :password             => ENV["SMTP_PASSWORD"],
    :authentication       => :plain, # :plain, :login, :cram_md5, no auth by default
    :domain               => "localhost.localdomain"
  }
}

对于 Sinatra 应用程序,我在调用之前执行了上面的代码(带有明显的替换):

Pony.mail(:to => <some_email>)

我已多次配置 Pony - 如果您仍有问题,请发表评论,我很乐意提供帮助。

【讨论】:

  • 感谢您的帮助!诚然,我对电子邮件的内部运作一无所知,所以我确实有几个问题:我是否需要设置一个域来替换“noreply@cdubs-awesome-domain.com”?目前我正在使用 my-email-address@gmail.com。当我使用 noreply@gmail.com 时,我在浏览器中收到“不接受用户名和密码”错误。我正在使用 OS X 进行开发,并计划部署到 Heroku。
  • 您可以为 Pony 使用您的个人电子邮件凭据,但我强烈建议您不要这样做,因为您的个人电子邮件和密码将被泄露,即使是 Heroku 的配置。
  • 我与我拥有域名的公司 1and1 建立了一封电子邮件。我已经在成功的道路上走得更远,但它还没有奏效。我花了一段时间与 1and1 的人通电话,以确保我拥有所有正确的设置。我现在得到的错误是:Net::SMTPServerBusy at /thankyou 421 invalid sender domain 'unknown' (misconfigured dns?) postmaster.1and1.com/error-messages/#invalidsenderdomain
  • 听起来Pony.options 哈希的:domain 部分配置不正确。不幸的是,如果没有看到更多细节,就很难排除故障。
  • :enable_starttls_aut 在做什么?
【解决方案2】:

如果您使用带有两步验证的 gmail 帐户,您必须为 Pony 邮件程序生成一个应用程序专用密码,而不是使用您通常的 SMTP 密码。

https://support.google.com/accounts/answer/185833?hl=en

在您常用的密码位置插入应用程序专用密码。

这是来自Pony project page on Github

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多