Heroku 上的环境变量和 Phoenix 框架的 Mailgun 问题
Environment Variables on Heroku and Mailgun Problems with Phoenix Framework
我正在关注 this guide on deploying to Heroku and this 一个发送电子邮件的人。
开发中一切正常。我的变量在 Heroku 中设置:
heroku config
...
MAILGUN_DOMAIN: https://api.mailgun.net/v3/xxxxxx.mailgun.org
MAILGUN_KEY: key-3-xxxxxx
...
并像这样从配置文件加载:
config :take_two, Mailer,
domain: System.get_env("MAILGUN_DOMAIN"),
key: System.get_env("MAILGUN_KEY")
然而,当我尝试在从环境变量设置 Mailgun 配置的情况下在 Heroku 上发送电子邮件时,我收到此错误:
** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
(elixir) lib/io.ex:346: IO.chardata_to_string(nil)
(elixir) lib/path.ex:467: Path.join/2
(elixir) lib/path.ex:449: Path.join/1
lib/client.ex:44: Mailgun.Client.send_without_attachments/2
当没有为 Mailgun 客户端设置域时会发生这种情况。但它应该是从环境变量中设置的。我做了一个简单的模块来测试:
defmodule TakeTwo.Mailer do
require Logger
use Mailgun.Client,
Application.get_env(:take_two, Mailer)
def blank_shot do
Logger.info Application.get_env(:take_two, Mailer)[:domain]
Logger.info Application.get_env(:take_two, Mailer)[:key]
send_email from: "steve@xxx.com", to: "speggy@xxx.com", subject: "Hello", text: "This is a blank shot"
end
当我 运行 TakeTwo.Mailer.blank_shot
时,我看到记录了正确的 domain/key 变量,然后是错误。我不确定如何远程调试 Mailgun 客户端。
最后,如果我在 shell 中重新创建 上面的模块(在 运行ning heroku run iex -S mix
之后)它工作得很好!?
感觉原模块加载的时候可能环境变量还没有加载??
环境变量在构建时不可用。我有同样的问题,决定摆脱携带配置的宏。您可以使用 this patch 继续。
答案有点隐藏在评论中,所以我想让它更容易找到。正如另一个答案提到的,环境变量不可用,但 buildpack 允许您将它们配置为:
我创建了一个 elixir_buildpack.config
文件并添加了以下内容:
config_vars_to_export=(DATABASE_URL MAILGUN_DOMAIN MAILGUN_KEY SECRET_KEY_BASE)
我正在关注 this guide on deploying to Heroku and this 一个发送电子邮件的人。
开发中一切正常。我的变量在 Heroku 中设置:
heroku config
...
MAILGUN_DOMAIN: https://api.mailgun.net/v3/xxxxxx.mailgun.org
MAILGUN_KEY: key-3-xxxxxx
...
并像这样从配置文件加载:
config :take_two, Mailer,
domain: System.get_env("MAILGUN_DOMAIN"),
key: System.get_env("MAILGUN_KEY")
然而,当我尝试在从环境变量设置 Mailgun 配置的情况下在 Heroku 上发送电子邮件时,我收到此错误:
** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
(elixir) lib/io.ex:346: IO.chardata_to_string(nil)
(elixir) lib/path.ex:467: Path.join/2
(elixir) lib/path.ex:449: Path.join/1
lib/client.ex:44: Mailgun.Client.send_without_attachments/2
当没有为 Mailgun 客户端设置域时会发生这种情况。但它应该是从环境变量中设置的。我做了一个简单的模块来测试:
defmodule TakeTwo.Mailer do
require Logger
use Mailgun.Client,
Application.get_env(:take_two, Mailer)
def blank_shot do
Logger.info Application.get_env(:take_two, Mailer)[:domain]
Logger.info Application.get_env(:take_two, Mailer)[:key]
send_email from: "steve@xxx.com", to: "speggy@xxx.com", subject: "Hello", text: "This is a blank shot"
end
当我 运行 TakeTwo.Mailer.blank_shot
时,我看到记录了正确的 domain/key 变量,然后是错误。我不确定如何远程调试 Mailgun 客户端。
最后,如果我在 shell 中重新创建 上面的模块(在 运行ning heroku run iex -S mix
之后)它工作得很好!?
感觉原模块加载的时候可能环境变量还没有加载??
环境变量在构建时不可用。我有同样的问题,决定摆脱携带配置的宏。您可以使用 this patch 继续。
答案有点隐藏在评论中,所以我想让它更容易找到。正如另一个答案提到的,环境变量不可用,但 buildpack 允许您将它们配置为:
我创建了一个 elixir_buildpack.config
文件并添加了以下内容:
config_vars_to_export=(DATABASE_URL MAILGUN_DOMAIN MAILGUN_KEY SECRET_KEY_BASE)