Mailgun :: CommunicationError通过nginx'301 Moved Permanently'错误

时间:2017-01-27 16:08:03

标签: ruby nginx sinatra http-status-code-301 mailgun

我有一个Ruby Web应用程序,可以通过Mailgun发送电子邮件。

我的Mailgun帐户& gem已正确设置,我可以手动发送电子邮件(例如通过curl)。

API密钥和API基本URL(https沙箱域)存储在环境变量中。

当我尝试从应用程序发送电子邮件时,这样:

  def initialize(mailer: nil)
    @mailer = mailer || Mailgun::Client.new(ENV['MAILGUN_API_KEY'])
  end

然后:

  def call(user)
    mailer.send_message(ENV['MAILGUN_SANDBOX'], {from: '...',
        to: user.email,
        subject: '...',
        text: "..."})
  end

当我通过localhost:xxxx运行带有Sinatra的应用程序时,我在/ ... /得到一个Mailgun :: CommunicationError ... 301永久移动:... nginx指向这一行:

mailer.send_message(ENV['MAILGUN_SANDBOX'], ...

知道为什么会这样吗?我已经研究了几个小时的问题,但无法找到下一步该做什么的线索。

谢谢!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。如果您已经修复了这个,那么希望这可以帮助其他人。

我切换到了消息构建器以便于使用,并能够render我的HTML但我很确定它仍会使用:text

设置的格式发送

当我切换到domain文件中的正确.env时,我认为它解决了我的问题。您需要2个不同的域才能使用Mailgun。第一个是沙盒的完整域。 ENV['MAILGUN_DOMAIN']沙盒域是完整的https://api.mailgun.net/v3/sandboxXXXXxxxXXXXXX.mailgun.org,可以发送大部分邮件格式。

您还需要完整域的后半部分来发送消息。这只是传递到sandboxXXXXxxxXXXXXX.mailgun.org或其他消息MessageBuilder方法的.send_message。当我把它们混合起来或两者都是一样的时候我一直在犯这个错误。当我切换到我的development.rbsome_mailer.rb中的两个分开时,我可以毫无问题地发送邮件。

以下是我的文件设置,供参考。我对这一切都很陌生,但这就是我的设置方式,它对我有用,所以希望它有所帮助。

# .env 
MAILGUN_DOMAIN='https://api.mailgun.net/v3/sandboxXXXXxxxXXXXXX.mailgun.org'
MAILGUN_SEND_DOMAIN='sandboxXXXXxxxXXXXXX.mailgun.org'

# development.rb
ActionMailer::Base.smtp_settings = {
  :authentication => :plain,
  :address => "smtp.mailgun.org",
  :port => 587,
  :domain => "ENV['MAILGUN_DOMAIN']",
  :user_name => "ENV['MAILGUN_USERNAME']",
  :password => "ENV['MAILGUN_PASSWORD']"
}


# some_mailer.rb
def some_mail_notification(user)
  @user = user

  mg_client = Mailgun::Client.new ENV['MAILGUN_KEY']
  mb_obj = Mailgun::MessageBuilder.new
  mb_obj.from "email@testing.com", {'first' => 'Customer', 'last' => 'Support'}
  mb_obj.add_recipient :to, @user.email, { 'first' => @user.first_name, 'last' => @user.last_name }
  mb_obj.subject "Your Recent Purchase on Some Site"
  mb_obj.body_html ("#{render 'some_mail_notification.html.erb'}")
  mg_client.send_message("sandboxXXXXxxxXXXXXX.mailgun.org", mb_obj)
end

我将上面的send_message留给了沙箱域,但您可以将其设置为.env文件中的环境变量。