【问题标题】:Sending email from a Sinatra web app using the Heroku SendGrid add-on使用 Heroku SendGrid 插件从 Sinatra Web 应用程序发送电子邮件
【发布时间】:2021-08-13 09:56:25
【问题描述】:

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

我在 Heroku 中启用了 SendGrid 插件,并通过 heroku config 检查了环境变量; SENDGRID_USERNAMESENDGRID_PASSWORD 都已设置。

我还在 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

谢谢!

【问题讨论】:

  • 一个可以节省大量调试时间的建议是使用ENV.fetch('SENDGRID_USERNAME')。如果密钥丢失并提前失败,它将引发 KeyError,而不是仅仅得到nil,这会导致崩溃。
  • 我在尝试这个命令时得到-bash: ENV.fetch: command not found
  • 您应该在 Ruby 代码中使用它而不是 ENV['SENDGRID_USERNAME']。不是来自 bash。 ruby-doc.org/core-2.5.1/Hash.html#method-i-fetch
  • 这有点奇怪。如果您启动 IRB 或使用heroku run irb 进行窥探,ENV 哈希是否包含预期值?
  • 对不起,我很难过。 Ruby 将允许您重新分配带有警告的常量。因此,您的代码可能会覆盖 ENV 哈希。不过,您会在本地机器上注意到这一点。

标签: ruby email heroku sinatra sendgrid


【解决方案1】:

SendGrid 不接收任何邮件,因此您向 SendGrid 发出的任何请求都是发送邮件。

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

您可以通过创建发件人身份来做到这一点。这是通过 SMTP 发送邮件的过程:

https://sendgrid.com/docs/for-developers/sending-email/integrating-with-the-smtp-api/

接下来,您需要创建一个 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

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2014-11-03
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多