travisf
Setting up Swoosh mailer in production
I have an app called Ciao. Swoosh came out of the box in development and I’ve configured it for production based on the documentation but anytime I try to use the mailer I get this error:
04:08:02.967 [warning] Failed to lookup telemetry handlers. Ensure the telemetry application has been started.
** (KeyError) key :adapter not found in: [otp_app: :ciao]
(elixir 1.13.1) lib/keyword.ex:559: Keyword.fetch!/2
lib/swoosh/mailer.ex:192: Swoosh.Mailer.deliver/2
lib/ciao/mailer.ex:2: anonymous fn/2 in Ciao.Mailer.instrument/3
/app/deps/telemetry/src/telemetry.erl:321: :telemetry.span/3
lib/ciao/accounts/user_notifier.ex:15: Ciao.Accounts.UserNotifier.deliver/3
My setup config.exs:
config :ciao, Ciao.Mailer,
adapter: Swoosh.Adapters.Sendgrid,
api_key: System.get_env("SENDGRID_KEY")
Then in mailer.ex:
use Swoosh.Mailer, otp_app: :ciao
I’ve tried these configs locally and I was able to connect to Sendgrid but not once I deploy to Fly.
Most Liked
travisf
Ah! That solved my problem not seeing any .env configs. I was accessing it with fly ssh console -s -C "/app/bin/ciao remote" rather than just fly ssh console then remoting in.
Now I can see the Swoosh configs, Application.get_all_env(:ciao)
{Ciao.Mailer,
[
adapter: Swoosh.Adapters.Sendgrid,
api_key: "SECRET_SENDGRID_KEY_REDACTED"
]},
After that the problem became much more manageable (having access to Application .env is so helpful). The next issue I had was the api client, I thought with SendGrid I could set the :api_client to false, but apparently you need one.
config :swoosh, :api_client, Swoosh.ApiClient.Hackney
Did the tick! Thanks for all the help everyone!
jswanner
03juan
Check if maybe the runtime.exs is somehow overriding the settings from config.exs?
That would be the best place to put the config so you don’t have to recompile the app to change the api_key, for instance.
Popular in Questions
Other popular topics
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









