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

时间:2015-02-16 18:48:06

标签: ruby email sinatra pony

我正在与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

2 个答案:

答案 0 :(得分:3)

Pony需要知道 如何发送电子邮件,而不仅仅是它是谁,来自,主题和身体是什么等等。

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

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

答案 1 :(得分:0)

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

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

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

这来自Pony project page on Github