使用 Heroku SendGrid 附加组件从 Sinatra 网络应用程序发送电子邮件

Sending email from a Sinatra web app using the Heroku SendGrid add-on

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

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

我也在SendGrid网站上创建了一个Sender Identity,已经过验证。

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

"550 Unauthenticated senders not allowed"

当我在 Heroku 仪表板上单击“Twilio SendGrid”附加组件 link 时,我被转到 SendGrid 网站上的一个页面,上面写着:

Access to sendgrid.com was denied. You don't have authorisation to view this page. HTTP ERROR 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

谢谢!

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