Bamboo issue - no emails sent error

Hi guys! I have created a system, which will be sent info to the user’s mail (everything locally). However, I am getting this type of error

Path which I am using http://localhost:4000/dev/mailbox

I have added this to my config/configs.exs

config :rewardapp, Rewardapp.Mailer,
  adapter: Bamboo.LocalAdapter

My mailer.ex

defmodule Rewardapp.Email do
  import Bamboo.Email
  import Bamboo.Phoenix

  def rewardEmail(user) do
    base_email()
    |> to(user)
    |> subject("You were granted points!")
    |> text_body("You were granted some points! To check, log into your account!")
  end

  defp base_email() do
    new_email()
    |> from("rewardapp@gmail.com") # Set a default from
  end
end

This is the IO.inspect of my function

function:

Rewardapp.Email.rewardEmail(userEmail)
IO.inspect(Rewardapp.Email.rewardEmail(userEmail))

result:

%Bamboo.Email{
  assigns: %{},
  attachments: [],
  bcc: nil,
  cc: nil,
  from: "rewardapp@gmail.com",
  headers: %{},
  html_body: nil,
  private: %{},
  subject: "You were granted points!",
  text_body: "You were granted some points! To check, log into your account!",
  to: "kamig@gmail.com"
}

I am using bamboo v.1.5.

In my router.ex I have configured the path:

  if Mix.env() == :dev do
    scope "/dev" do
      pipe_through :browser

      #forward "/mailbox", Plug.Swoosh.MailboxPreview
      forward "/mailbox", Bamboo.SentEmailViewerPlug
    end
  end

Why am I not able to see the output in the directory localhost:4000/dev/mailbox?

You are missing this part:

defmodule MyApp.SomeControllerPerhaps do
  def send_welcome_email do
    Email.welcome_email()   # Create your email
    |> Mailer.deliver_now!() # Send your email
  end
end

Kindly check the official documentation here: GitHub - thoughtbot/bamboo at master

You have to use your Application Mailer module to deliver the emails.

In your case, try to import this on top of the Rewardapp.Email:

import Rewardapp.Mailer
....
...
# in your email fn:
def rewardEmail(user) do
    base_email()
    |> to(user)
    |> subject("You were granted points!")
    |> text_body("You were granted some points! To check, log into your account!")
    |> Mailer.deliver_now!() # to deliver immediately
  end
2 Likes

I have added mentioned things, however I do still have an error


# function Mailer.deliver_now/1 is undefined (module Mailer is not available)

This is how my file looks like now


defmodule Rewardapp.Email do
  import Bamboo.Email
  import Bamboo.Phoenix
  import Bamboo.Mailer



 def rewardEmail(user) do
    base_email()
    |> to(user)
    |> subject("You were granted points!")
    |> text_body("You were granted some points! To check, log into your account!")
    |> Mailer.deliver_now()
  end

  defp base_email() do
    new_email()
    |> from("rewardapp@gmail.com") # Set a default from
  end
end

Have you created the Rewardapp.Mailer file with the relevant config:

# some/path/within/your/app/mailer.ex
defmodule MyApp.Mailer do
  use Bamboo.Mailer, otp_app: :my_app
end

To send emails, define a mailer module for your application that uses Bamboo’s mailer.

https://hexdocs.pm/bamboo/readme.html

After creating Mailer.ex

defmodule Rewardapp.Mailer do
  use Bamboo.Mailer, otp_app: :rewardapp
end

I still can not send emails and I am getting error, that Mailer. deliver_now is undefined.

However, when I change the import Bamboo.Mailer into user Bamboo.Mailer I am getting this in console:

== Compilation error in file lib/rewardapp_web/controllers/mail.ex ==
** (KeyError) key :otp_app not found in: []
    (elixir 1.13.3) lib/keyword.ex:559: Keyword.fetch!/2
    lib/rewardapp_web/controllers/mail.ex:4: (module)

@MatOsinski Can you host your code in github and provide the link for reference? That would make things easier…

Yes! Could text me in a private message?

@MatOsinski Kindly look at this video here: Sending Email in Elixir with Bamboo Part 1 - YouTube

That kind of gives the step by step instructions on how to use Bamboo. Hope this helps!

Also this link: Using Bamboo to Send Emails in Phoenix - DEV Community

1 Like

Firstly, I would like to say thank you for your help. But unfortunately, I have done everything literally the same, and it is still not working. Error from browser:

# function Mailer.deliver_now/1 is undefined (module Mailer is not available)

and from console:

[error] #PID<0.642.0> running RewardappWeb.Endpoint (connection #PID<0.621.0>, stream id 6) terminated
Server: localhost:4000 (http)
Request: POST /add/2
** (exit) an exception was raised:
    ** (UndefinedFunctionError) function Mailer.deliver_now/1 is undefined (module Mailer is not available)
        Mailer.deliver_now(%Bamboo.Email{assigns: %{}, bcc: nil, cc: nil, from: "rewardapp@gmail.com", headers: %{}, html_body: nil, private: %{}, subject: "You were granted points!", text_body: "You were granted some points! To check, log into your account!", to: "dag.kaz@gmail.com"})
        (rewardapp 0.1.0) lib/rewardapp_web/controllers/grant_controller.ex:144: RewardappWeb.GrantController.update/2
        (rewardapp 0.1.0) lib/rewardapp_web/controllers/grant_controller.ex:1: RewardappWeb.GrantController.action/2
        (rewardapp 0.1.0) lib/rewardapp_web/controllers/grant_controller.ex:1: RewardappWeb.GrantController.phoenix_controller_pipeline/2
        (phoenix 1.6.6) lib/phoenix/router.ex:355: Phoenix.Router.__call__/2
        (rewardapp 0.1.0) lib/rewardapp_web/endpoint.ex:1: RewardappWeb.Endpoint.plug_builder_call/2
        (rewardapp 0.1.0) lib/plug/debugger.ex:136: RewardappWeb.Endpoint."call (overridable 3)"/2
        (rewardapp 0.1.0) lib/rewardapp_web/endpoint.ex:1: RewardappWeb.Endpoint.call/2
        (phoenix 1.6.6) lib/phoenix/endpoint/cowboy2_handler.ex:54: Phoenix.Endpoint.Cowboy2Handler.init/4
        (cowboy 2.9.0) /Users/mateuszosinski/Desktop/elixir/rewardapp/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2
        (cowboy 2.9.0) /Users/mateuszosinski/Desktop/elixir/rewardapp/deps/cowboy/src/cowboy_stream_h.erl:306: :cowboy_stream_h.execute/3
        (cowboy 2.9.0) /Users/mateuszosinski/Desktop/elixir/rewardapp/deps/cowboy/src/cowboy_stream_h.erl:295: :cowboy_stream_h.request_process/3
        (stdlib 3.17.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3

mailer.ex :


defmodule Rewardapp.Mailer do
  use Bamboo.Mailer, otp_app: :rewardapp
end

mail.ex


defmodule Rewardapp.Email do
  import Bamboo.Email
  import Bamboo.Phoenix

  def rewardEmail(user) do
    base_email()
    |> to(user)
    |> subject("You were granted points!")
    |> text_body("You were granted some points! To check, log into your account!")
    |> Mailer.deliver_now()
  end

  defp base_email() do
    new_email()
    |> from("rewardapp@gmail.com") # Set a default from
  end
end

The way I am trying to use it (in gran_controller.ex, RewardappWeb.GrantController)


                    Email.rewardEmail(userEmail) |> Mailer.deliver_now()
                    IO.inspect(Rewardapp.Email.rewardEmail(userEmail))

And this is how my mail looks like (or ought to, taken from logs)

1. %Bamboo.Email{assigns: %{}, bcc: nil, cc: nil, from: "rewardapp@gmail.com", headers: %{}, html_body: nil, private: %{}, subject: "You were granted points!", text_body: "You were granted some points! To check, log into your account!", to: "kamig@gmail.com"}

OK. I have handle it, and right now sending emails is available. However, I do still have some troubles
# function Bamboo.SentEmailViewerPlug.init/1 is undefined (module Bamboo.SentEmailViewerPlug is not available)

This is how I added it to my router file

  if Mix.env == :dev do
    forward "/mailbox", Bamboo.SentEmailViewerPlug
  end

@MatOsinski Kindly create a minimal app reference and create a repo in github to be able to get help! It’s tough without the full code context or scenario.

Hi @pmangalakader. I have managed to make it work. There was error with Bamboo module name. However, I do really appreciate your help!!!

1 Like