2017-02-15 3 views
8

フェニックスのアプリケーションを作成し、電子メールを送信するためのbambooモジュールを追加しました。今週の午後はElixirを使用して最初のメールを送信しましたが、のユーザ名およびパスワードconfig.exsに入力します。フェニックスフレームワークプロジェクトの環境変数をロードするには

私はthis articleを読んで、私のphoenixプロジェクトのルートに.envファイルを設定して、config.exsファイル内で次の文を使って環境変数を読み込もうとしています。

username: System.get_env("SMTP_USERNAME"), 
password: System.get_env("SMTP_PASSWORD"), 

しかし、電子メールは送信されていません。竹は私にかなり奇妙なエラーメッセージを表示しています。私はターミナルから次のコマンドを使用して、フェニックスアプリを構築してい

iex -S mix 

と私は手動で以下のようなコマンドを使用して、IEXセッション内でメールを送信しています、

CrjApi.Email.hello_text_email("[email protected]") |> CrjApi.Mailer.deliver_now 

メールは、ユーザ名/パスワードがconfig.exsファイルにハードコードされている場合にのみ送信されます。 .envファイルを使用するにはどうすればいいですか?config.exsにユーザー名とパスワードをハードコードする必要はありませんか?

注:私はOS Xを実行しており、魚のシェルを使用しています。

+2

'iex'に入り、' System.get_env( "SMTP_USERNAME") 'と打つと、期待値が得られますか?パスワードも同じです。 –

+0

@JustinWoodあなたが提案したコマンドは 'nil'を返しています。彼はWindowsやMac OSX/Linux上にいるかどうかを指定していません。 – Chris

答えて

2

私は次のようになりますconfigディレクトリ内smtp.exsファイルを作成することになりました以下、

smtp。その後、EXS

use Mix.Config 

config :crj_api, CrjApi.Mailer, 
    username: "foo", 
    password: "secret_password" 

とは、私がiex -S mixでアプリケーションをロードするとき今では毎回これらのアプリケーション変数にロードし、私は元の環境を持っていないconfig.exs

import_config "smtp.exs"

に次を追加しました各端末セッションの変数。

0

あなたが書いた記事のように、私はENV varsをPhoenixのシステムから使います。

export SMTP_USERNAME=you_variable

などとフェニックスはSEそれら意志をし、開始サーバー時間で取得:ちょうど輸出を経由して、それらを作成します。 また、.envファイルを使用することは可能ですが、私はそれを 'heroku local'とだけ使用します。

この16進数を確認してください。dotenv_elixir実際はエリクシールな方法ではありません。

+0

コマンドは、Windows上のオフチャンスで 'SET SMTP_USERNAME = your_variable'になります。 –

+0

あなたは正しく、私はMacOSを「輸出」 – khusnetdinov

5

プロジェクトでは、confexモジュールを使用できます。 https://github.com/Nebo15/confex

実行時にenv設定を読み取るオプションを提供するヘルパーモジュールです。あなたのIEXタイプにあなたのモジュール

username = Confex.get(:app_name, :smtp_username) 
password = Confex.get(:app_name, :smtp_password) 

config.exs例

config :app_name, 
    smtp_username: {:system, "SMTP_USERNAME", "default_user_name"}, 
    smtp_password: {:system, "SMTP_PASSWORD", "default_password"} 

System.put_env("SMTP_USERNAME", "real_username") 
System.put_env("SMTP_PASSWORD", "real_password")