Swoosh isn't working straight from hexdocs

I was following this for sending Gmails from Phoenix whenever someone registers an account.

I modified my user controller to this

def create(conn, %{"_action" => "registered" , "user" => user_params} = params) do 
  Swoosh.Email.new() 
  |> Swoosh.Email.to({nil ,user_params["email"]}) 
  |> Swoosh.Email.from({"outsider", "outsideemail@home.here"}) 
  |> Swoosh.Email.subject("FINALLY!") 
  |> Swoosh.Email.html_body("<h1>FINALLY!</h1>") 
  |> Swoosh.Email.text_body("FINALLY!\n") 
  |> Pento.Mailer.deliver() 

  create(conn, params, "Account created successfully!") 
end

And my config/runtime.exs (for I got a warning from console that it’s better to place it there than config/config.exs)

config :pento, Pento.Mailer, 
  adapter: Swoosh.Adapters.Gmail, 
  access_token: {:system, "gmail-api-access-token-from-playground"}

I don’t get an email but I get this error

from console

[error] GenServer #PID<0.658.0> terminating
** (stop) :econnaborted
Last message: {:tcp_error, #Port<0.22>, :econnaborted}
State: {%ThousandIsland.Socket{socket: #Port<0.22>, transport_module: ThousandIsland.Transports.TCP, read_timeout: 60000, silent_terminate_on_error: false, span: %ThousandIsland.Telemetry{span_name: :connection, telemetry_span_context: #Reference<0.2682427495.2491154433.212811>, start_time: -8253868621053248, start_metadata: %{handler: Bandit.DelegatingHandler, remote_port: 55554, remote_address: {127, 0, 0, 1}, telemetry_span_context: #Reference<0.2682427495.2491154433.212811>, parent_telemetry_span_context: #Reference<0.2682427495.2491154435.210270>}}}, %{opts: %{http: [ ], websocket: `[ ]`, http_1: [ ], http_2: [ ]}, plug: {Phoenix.Endpoint.SyncCodeReloadPlug, {PentoWeb.Endpoint, [ ]}}, handler_module: Bandit.HTTP1.Handler, http_1_enabled: true, http_2_enabled: true, requests_processed: 40}}

This is equivalent to System.get_env("gmail-api-access-token-from-playground"), do you have an environment variable by that name?

Generally system tuples are a thing of the past though.

You’d much rather use `System.get_env` calls directly in runtime.exs nowadays.

The "gmail-api-access-token-from-playground"

is taken from here in step 2 OAuth 2.0 Playground after clicking “Exchange authorization code for tokens“

I think what you want is:

access_token: "gmail-api-access-token-from-playground"

Next step is to create a environment variable and then use it:

GMAIL_API_ACCESS_TOKEN=gmail-api-access-token-from-playground
access_token: System.get_env("GMAIL_API_ACCESS_TOKEN")

I had to lower case gmail_api_access_token to get it to save rather than raising an invalid match and it still doesn’t deliver

Environment variables are set in your shell (or whatever is starting elixir). It’s more of a deployment/security concern, if you are just getting started you can hard code the API key, just don’t push the code to a public repository