凤凰框架Heroku和Mailgun问题的环境变量

spe*_*peg 7 heroku elixir phoenix-framework

我正在按照指南部署到Heroku,这个用于发送电子邮件.

一切都在开发中运作良好.我的变量在Heroku中设置:

heroku config
...
MAILGUN_DOMAIN:  https://api.mailgun.net/v3/xxxxxx.mailgun.org
MAILGUN_KEY:     key-3-xxxxxx
...
Run Code Online (Sandbox Code Playgroud)

并从配置文件中加载如下:

config :take_two, Mailer,
    domain: System.get_env("MAILGUN_DOMAIN"),
    key: System.get_env("MAILGUN_KEY")
Run Code Online (Sandbox Code Playgroud)

但是,当我从环境变量设置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
Run Code Online (Sandbox Code Playgroud)

如果没有为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
Run Code Online (Sandbox Code Playgroud)

当我运行时,TakeTwo.Mailer.blank_shot我看到记录了正确的域/密钥变量,然后是错误.我不确定如何远程调试Mailgun客户端.

最后,如果我在shell中重新创建上面的模块(在运行之后heroku run iex -S mix)它可以正常工作!?

我觉得当加载原始模块时可能还没有加载环境变量?

Pet*_*own 7

答案有点埋没在评论中,所以我想让它更容易找到.正如其他答案所提到的,环境变量不可用,但buildpack允许您将它们配置为:

我创建了一个elixir_buildpack.config文件并添加了以下内容:

config_vars_to_export=(DATABASE_URL MAILGUN_DOMAIN MAILGUN_KEY SECRET_KEY_BASE)
Run Code Online (Sandbox Code Playgroud)