我创建了一个凤凰应用程序,然后添加了用于发送电子邮件的竹子模块,今天下午我使用Elixir成功发送了我的第一封电子邮件,但我不得不将用户名和密码硬编码到config.exs
中。
我阅读了这篇文章并在 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("me@example.com") |> CrjApi.Mailer.deliver_now
但是,只有当用户名/密码硬编码到config.exs
文件中时,才会发送电子邮件。 如何使用我设置的.env
文件,这样我就不必将用户名/密码硬编码到config.exs
中?
注意:我正在运行OS X,并使用鱼壳。
您可以在项目中使用 confex 模块。 https://github.com/Nebo15/confex
这是一个帮助程序模块,为您提供了在运行时读取 env 配置的选项。
配置示例
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")
您可以将所有环境变量放在一个名为.env.dev
或.env.prod
的文件中(不要忘记将.env.*
添加到 .gitignore 文件中):
export SMTP_DOMAIN=smtp.trumpy.xyz
export SMTP_USERNAME=donny@trumpy.xyz
export SMTP_PASSWORD=donny123
export SMTP_PORT=587
...
加载该文件并运行凤凰服务器:
source .env.dev && mix phx.server
请记住使用此语法
port: {:system, "SMTP_PORT"},
username: {:system, "SMTP_USERNAME"},
取而代之的是
port: System.get_env("SMTP_PORT"),
username: System.get_env("SMTP_USERNAME"),
为了在运行时加载 ENV 变量。
我最终在目录中创建了一个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
加载应用程序时,它每次都会加载到这些应用程序变量中,并且我没有为每个终端会话提供环境变量。
就像你写的文章一样,我从我的系统中为凤凰城使用 ENV vars。只需通过导出创建它们:
export SMTP_USERNAME=you_variable
依此类推,凤凰城将满足它们并在启动服务器时间获取。 也可以使用.env文件,但我只将其与"heroku local"一起使用。
检查这个十六进制dotenv_elixir但它真的不是灵丹妙药的方式。