Ruby 使用Heroku SendGrid插件从Sinatra web应用发送电子邮件

Ruby 使用Heroku SendGrid插件从Sinatra web应用发送电子邮件,ruby,email,heroku,sinatra,sendgrid,Ruby,Email,Heroku,Sinatra,Sendgrid,我正在尝试设置SendGrid,以便在Sinatra应用程序中通过简单的web表单发送电子邮件 我已经在Heroku中启用了SendGrid插件,并通过Heroku config检查了环境变量;设置了SENDGRID\u用户名和SENDGRID\u密码 我还在SendGrid网站上创建了一个发件人身份,该身份已经过验证 当我提交表格时,我得到: “不允许550个未经身份验证的发件人” 当我单击Heroku仪表板上的“Twilio SendGrid”加载项链接时,我会被转发到SendGrid网站上

我正在尝试设置SendGrid,以便在Sinatra应用程序中通过简单的web表单发送电子邮件

我已经在Heroku中启用了SendGrid插件,并通过Heroku config检查了环境变量;设置了
SENDGRID\u用户名
SENDGRID\u密码

我还在SendGrid网站上创建了一个发件人身份,该身份已经过验证

当我提交表格时,我得到:

“不允许550个未经身份验证的发件人”

当我单击Heroku仪表板上的“Twilio SendGrid”加载项链接时,我会被转发到SendGrid网站上的一个页面,上面写着:

拒绝访问sendgrid.com。您没有查看此页面的授权。 HTTP错误403

发送电子邮件的方法和设置如下:

post '/contact' do
 configure_options
 Pony.mail(
    :from => [params[:name], "<", params[:email], ">"].join,
    :to => 'hi@mydomain.com',
    :subject =>  ["Opt-in via /contact: ", params[:name]].join,
    :body => [params[:name], params[:email]].join(": ")
  )
  redirect '/'
end

def configure_options
  Pony.options = {
    :via => :smtp,
    :via_options => {
      :address              => 'smtp.sendgrid.net',
      :port                 => '587',
      :domain               => 'heroku.com',
      :user_name            => ENV['SENDGRID_USERNAME'],
      :password             => ENV['SENDGRID_PASSWORD'],
      :authentication       => :plain,
      :enable_starttls_auto => true
    }
  }
end
post'/contact'do
配置\u选项
小马邮件(
:from=>[params[:name],“”。加入,
:to=>'hi@mydomain.com',
:subject=>[“通过/联系人选择加入:”,参数[:name]]。加入,
:body=>[params[:name],params[:email]]。加入(“:”)
)
重定向“/”
结束
def配置_选项
小马。选项={
:via=>:smtp,
:via_options=>{
:address=>smtp.sendgrid.net',
:端口=>'587',
:domain=>'heroku.com',
:user_name=>ENV['SENDGRID_USERNAME'],
:password=>ENV['SENDGRID_password'],
:身份验证=>:普通,
:enable_starttls_auto=>true
}
}
结束
谢谢

SendGrid没有收到任何邮件,因此您向SendGrid发出的任何请求都将是发送邮件

这意味着您首先需要设置一个您控制的实体,该实体可以充当发件人,即使收件人是您自己

您可以通过创建发件人标识来实现这一点。以下是通过SMTP发送邮件时的过程:

接下来,您需要装箱一个API密钥。SendGrid不再支持基本身份验证,因此此代码将不起作用:

  :user_name            => ENV['SENDGRID_USERNAME'],
  :password             => ENV['SENDGRID_PASSWORD'],
相反,您需要使用:

  :user_name            => 'apikey',
  :password             => 'your-api-key',
其中
'apikey'
是文本字符串
'apikey'
,而
'your-api-key'
是SendGrid生成的69个字符的api密钥(仅显示一次)

然后,在您的POST方法中:

    post '/contact' do
     configure_options
     Pony.mail(

        # the :from field below is the email address 
        # associated with your SendGrid Sender Identity:
        :from => 'yourname@email.com',
        :to => 'someother@email.com',

        :subject =>  ["Opt-in via /contact: ", params[:name]].join,
        :body => [params[:name], params[:email]].join(": ")
      )
      redirect '/'
    end

可以为您节省大量调试时间的一个协议是使用
ENV.fetch('SENDGRID\u USERNAME')
。如果密钥丢失并提前失败,而不是仅仅得到
nil
,这将引发一个KeyError,这将导致线路崩溃。尝试此命令时,我得到
-bash:ENV.fetch:command not found
!您应该在Ruby代码中使用它而不是
ENV['SENDGRID\u USERNAME']
。不是从bash来的。这有点奇怪。如果您使用heroku run IRB启动IRB或pry,ENV散列是否包含预期值?对不起,我被难住了。Ruby将允许您重新分配带有警告的常量。因此,您的代码可能会覆盖ENV散列。不过,在本地机器上,您可能已经注意到了这一点。