addict icon indicating copy to clipboard operation
addict copied to clipboard

Email Templates

Open note89 opened this issue 8 years ago • 2 comments

Hi im trying to get email templates to work but without success.

  email_reset_password_template: App.EmailTemplate.reset,

gives me this

$ mix phoenix.server
** (Mix.Config.LoadError) could not load config config/config.exs
    ** (UndefinedFunctionError) function App.EmailTemplate.reset/0 is undefined (module App.EmailTemplate is not available)
    App.EmailTemplate.reset()
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (stdlib) erl_eval.erl:878: :erl_eval.expr_list/6
    (stdlib) erl_eval.erl:236: :erl_eval.expr/5
    (stdlib) erl_eval.erl:228: :erl_eval.expr/5
    (stdlib) erl_eval.erl:229: :erl_eval.expr/5
    (stdlib) erl_eval.erl:878: :erl_eval.expr_list/6
    (stdlib) erl_eval.erl:236: :erl_eval.expr/5

this compiles

  email_reset_password_template: {App.EmailTemplate, :reset},

But gives me this runtime exception.

[error] #PID<0.457.0> running App.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /recover_password
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in EEx.Tokenizer.tokenize/5
        (eex) lib/eex/tokenizer.ex:27: EEx.Tokenizer.tokenize({App.EmailTemplate, :reset}, 1, [trim: false], [], [])
        (eex) lib/eex/compiler.ex:16: EEx.Compiler.compile/2
        (eex) lib/eex.ex:192: EEx.eval_string/3
        lib/addict/mailers/mail_sender.ex:21: Addict.Mailers.MailSender.send_reset_token/3
        lib/addict/interactors/send_reset_password_link.ex:16: Addict.Interactors.SendResetPasswordEmail.call/2
        lib/addict/controller.ex:83: Addict.AddictController.recover_password/2
        lib/addict/controller.ex:1: Addict.AddictController.action/2
        lib/addict/controller.ex:1: Addict.AddictController.phoenix_controller_pipeline/2
        (app) lib/phoenix/router.ex:261: App.Router.dispatch/2
        (app) web/router.ex:1: App.Router.do_call/2
        (app) lib/app/endpoint.ex:1: App.Endpoint.phoenix_pipeline/1
        (app) lib/plug/debugger.ex:122: App.Endpoint."call (overridable 3)"/2
        (app) lib/phoenix/endpoint/render_errors.ex:34: App.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

Here is my file controllers/email_templates.ex

defmodule App.EmailTemplate do
  def reset do
    host = Addict.Configs.host || "http://localhost:4000"
    """
    <p> You have requested a password reset. </p>
    <p> Follow the link below and set a new password </p>
    <p> Click <a href='#{host}<%= path %>'>here</a> to proceed!</p>
    <p> Test <%= name %>, </p>
    <p> <a href="https://xkcd.com/936/" tabindex="-1" target="_blank" style="font-style: italic;">How to pick a password</a></p>
    """
  end
end

note89 avatar Aug 25 '16 11:08 note89

I can replicate all these errors, but also cannot see what to do next. This a real problem as the only other way seeming to override the default text is to add to config.exs something like

email_reset_password_template: "<p>Welcome to the Business Center!<br>  A new user account has been created for you (or your password has been reset). 
Please click <a href='#{host}<%= path %>'>here</a> to proceed!</p>",

But this will not compile because of the #{host}.

Any thoughts @trenpixster ?

simonh1000 avatar Sep 28 '16 07:09 simonh1000

I've got the same problem with another project. The problem is that the config.exs is parsed before anything else is compiled. So your first effort:

email_reset_password_template: App.EmailTemplate.reset,

fails because that function doesn't yet exist.

I haven't read the source, but the second one fails either because addict needs to know to use Kernel.apply with your arguments, or because that function is not available from addict, even though it is within the context of your entire application (which is where I'm presently floundering)

I'm still sifting around for a solution.

jeffdeville avatar Oct 13 '16 12:10 jeffdeville