使用 Pony 从简单的 Sinatra 应用程序发送电子邮件

Sending email from simple Sinatra app using Pony

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

我有一个 'textbook' 联系页面,其中包含 'name'、'email' 和 'content' 字段的简单表格。当有人提交表单时,我想收到一封电子邮件通知。

Pony 声称它可以通过简单的 'one-line' 代码发送电子邮件。我看过the Pony documentation但是关于如何设置不是很详细

不知道是我设置不当,还是代码不对,还是Pony不是最好的工具,还是我的开发环境不允许发邮件。[​​=13= ]

下面的代码应该从 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

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

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

上没有配置 SMTP

我已经将 Pony 用于多个应用程序。每一个,我都为 Pony 配置了一个 "noreply@" 电子邮件地址,用于对 SMTP 进行身份验证,因此使用我自己的域电子邮件(通常是 Google 应用程序,甚至是 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 - 如果您仍有问题,请发表评论,我很乐意提供帮助。

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

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

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

这是来自 Pony project page on Github.