2017-02-15 134 views
8

我創建了一個Phoenix應用程序,然後添加了用於發送電子郵件的竹模塊,並且今天下午我成功使用Elixir發送了我的第一封電子郵件,但我必須硬編碼用戶名密碼分成config.exs如何爲phoenix框架項目加載環境變量

我讀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'。並感謝您指引我在正確的方向;) – Chris

回答

2

我結束了創建config目錄,看起來像內的smtp.exs文件以下,

smtp。EXS

use Mix.Config 

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

,然後添加以下到config.exs

import_config "smtp.exs"

現在,當我與iex -S mix加載應用程序加載在這些應用程序變量每次,我沒有源環境每個終端會話的變量。

0

就像你寫的文章一樣,我使用我的系統中的Phoenix vars。只需通過出口創造他們:

export SMTP_USERNAME=you_variable

等和鳳凰衛視將它們本身並在啓動服務器時獲得。 也有可能使用.env文件,但我只用'heroku本地'。

檢查這個十六進制dotenv_elixir但它真的不是靈藥的方式。

+0

他沒有指定他是否在Windows或Mac OSX/Linux。在Windows上,該命令將被設置爲「SET SMTP_USERNAME = your_variable」。 –

+0

你說得對,我用'出口' – khusnetdinov

5

您可以在您的項目中使用confex模塊。 https://github.com/Nebo15/confex

這是一個幫助模塊,它爲您提供了在運行時讀取env配置的選項。

config.exs例如

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

在你的模塊

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

進入您的IEX型

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