我有一个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'], ...
知道为什么会这样吗?我已经研究了几个小时的问题,但无法找到下一步该做什么的线索。
谢谢!
答案 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.rb
和some_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
文件中的环境变量。