私は、Herokuへのデプロイ時にはthisガイドを、電子メールを送信する場合はthisに従っていました。HerokuとMailgunの環境変数Phoenix Frameworkの問題
開発中はすべて正常に動作します。私の変数は、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 Client用に設定されていない場合に発生します。しかし、環境変数から設定されているはずです。私はテストを簡単なモジュールを作った:
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: "[email protected]", to: "[email protected]", subject: "Hello", text: "This is a blank shot"
end
私はTakeTwo.Mailer.blank_shot
を実行すると、私は正しいドメイン/キー変数はエラーが続いログ出力さご覧ください。私は、リモートでMailgunクライアントをデバッグする方法がわかりません。
最後に、(上記のモジュールをシェルのheroku run iex -S mix
の後に再作成した場合)はうまく動作します。
元のモジュールがロードされているような気がしますが、おそらく環境変数はまだロードされていませんか?
私が気づいた違いは、 '' use'''がモジュールに渡され、次にドメインとキーを含むキーワードリストが渡されたことです。この例では、モジュールと '' Application.get_env((:take_two、Mailer)) '' 'を渡すだけです。これはタプルを返します。 https://github.com/chrismccord/mailgun –
ありがとう@ TheBrofessor、私はそれを両方の方法で試してみたところ、ローカルで動作するようでした。私は、Application.get_envがキーワードリストを返したことを確信しています。私はChrisの例がモジュール属性を使用しているので、同じ結果を試してみたことに気づいています。 'TakeTwo.Mailer.conf'は両方の値が' nil'であることを示します。私はそのレポに関する関連する問題を発見しました。 - Herokuビルドパックがコンパイルする前に環境変数をロードしていないような気がします。だから私はこれが次の作品だと思う。 – speg
オハイオ州スナップ。 https://github.com/HashNuke/heroku-buildpack-elixir#specifying-config-vars-to-export-at-compile-timeには答えがあります。コンパイル時にどのHeroku設定変数をエクスポートするかを明示的に定義する必要があることが分かります。愚かな私は彼らがすべて自動的に輸出されると仮定した。 – speg