Skip to content

Commit 0bfc22e

Browse files
committed
introduce the before_interceptor
1 parent 2217dec commit 0bfc22e

File tree

5 files changed

+82
-16
lines changed

5 files changed

+82
-16
lines changed

lib/bamboo/mailer.ex

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,9 @@ defmodule Bamboo.Mailer do
203203

204204
@doc false
205205
def deliver_now(adapter, email, config, opts) do
206-
with %Bamboo.Email{blocked: false} = email <- apply_interceptors(email, config),
207-
{:ok, email} <- validate_and_normalize(email, adapter) do
206+
with %Bamboo.Email{blocked: false} = email <- apply_before_interceptors(email, config),
207+
{:ok, email} <- validate_and_normalize(email, adapter),
208+
%Bamboo.Email{blocked: false} = email <- apply_interceptors(email, config) do
208209
if empty_recipients?(email) do
209210
debug_unsent(email)
210211

@@ -244,8 +245,9 @@ defmodule Bamboo.Mailer do
244245

245246
@doc false
246247
def deliver_later(adapter, email, config) do
247-
with %Bamboo.Email{blocked: false} = email <- apply_interceptors(email, config),
248-
{:ok, email} <- validate_and_normalize(email, adapter) do
248+
with %Bamboo.Email{blocked: false} = email <- apply_before_interceptors(email, config),
249+
{:ok, email} <- validate_and_normalize(email, adapter),
250+
%Bamboo.Email{blocked: false} = email <- apply_interceptors(email, config) do
249251
if empty_recipients?(email) do
250252
debug_unsent(email)
251253
else
@@ -355,6 +357,14 @@ defmodule Bamboo.Mailer do
355357
end)
356358
end
357359

360+
defp apply_before_interceptors(email, config) do
361+
interceptors = config[:before_interceptors] || []
362+
363+
Enum.reduce(interceptors, email, fn interceptor, email ->
364+
interceptor.call(email)
365+
end)
366+
end
367+
358368
@doc """
359369
Wraps to, cc and bcc addresses in a list and normalizes email addresses.
360370

test/lib/bamboo/mailer_test.exs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ defmodule Bamboo.MailerTest do
22
use ExUnit.Case
33
alias Bamboo.Email
44

5-
@mailer_config adapter: __MODULE__.DefaultAdapter, foo: :bar, interceptors: nil
5+
@mailer_config adapter: __MODULE__.DefaultAdapter, foo: :bar, interceptors: nil, before_interceptors: nil
66

77
setup context do
88
config =
99
Keyword.merge(
1010
@mailer_config,
11-
[adapter: context[:adapter], interceptors: context[:interceptors]],
11+
[
12+
adapter: context[:adapter],
13+
before_interceptors: context[:before_interceptors],
14+
interceptors: context[:interceptors]
15+
],
1216
fn
1317
_key, default, nil -> default
1418
_key, _default, override -> override
@@ -459,6 +463,44 @@ defmodule Bamboo.MailerTest do
459463
end
460464
end
461465

466+
describe "before_interceptors" do
467+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
468+
test "deliver_now/1 must apply before_interceptors and block email if user is inactive" do
469+
email = new_email(to: %Bamboo.User{email: "inactive@bar.com", active: false})
470+
assert {:ok, %Bamboo.Email{blocked: true}} = Mailer.deliver_now(email)
471+
end
472+
473+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
474+
test "deliver_later/1 must apply before_interceptors and block email if user is inactive" do
475+
email = new_email(to: %Bamboo.User{email: "inactive@bar.com", active: false})
476+
assert {:ok, %Bamboo.Email{blocked: true}} = Mailer.deliver_later(email)
477+
end
478+
479+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
480+
test "deliver_now/1 must apply before_interceptors and block email if user has no email" do
481+
email = new_email(to: %Bamboo.User{email: nil})
482+
assert {:ok, %Bamboo.Email{blocked: true}} = Mailer.deliver_now(email)
483+
end
484+
485+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
486+
test "deliver_later/1 must apply before_interceptors and block email if user has no email" do
487+
email = new_email(to: %Bamboo.User{email: nil})
488+
assert {:ok, %Bamboo.Email{blocked: true}} = Mailer.deliver_later(email)
489+
end
490+
491+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
492+
test "deliver_now/1 does not block regular email on deliver now" do
493+
email = new_email(to: %Bamboo.User{name: "John Doe", email: "active@bar.com", active: true})
494+
assert {:ok, %Bamboo.Email{blocked: false, to: [{"John Doe", "active@bar.com"}]}} = Mailer.deliver_now(email)
495+
end
496+
497+
@tag before_interceptors: [Bamboo.InactiveUsersInterceptor]
498+
test "deliver_later/1 does not block regular email on deliver later" do
499+
email = new_email(to: %Bamboo.User{name: "John Doe", email: "active@bar.com", active: true})
500+
assert {:ok, %Bamboo.Email{blocked: false}} = Mailer.deliver_later(email)
501+
end
502+
end
503+
462504
describe "interceptors" do
463505
@tag interceptors: [Bamboo.DenyListInterceptor, Bamboo.EnvInterceptor]
464506
test "deliver_now/1 must apply interceptors and send email if not intercepted" do

test/support/deny_list_interceptor.ex

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,11 @@ defmodule Bamboo.DenyListInterceptor do
33

44
@deny_list ["blocked@blocked.com"]
55

6-
def call(%{to: recipients} = email) when is_list(recipients) do
7-
if Enum.any?(recipients, &(&1 in @deny_list)) do
6+
def call(email) do
7+
if Enum.any?(email.to, &(elem(&1, 1) in @deny_list)) do
88
Bamboo.Email.block(email)
99
else
1010
email
1111
end
1212
end
13-
14-
def call(%{to: recipient} = email) when recipient in @deny_list do
15-
Bamboo.Email.block(email)
16-
end
17-
18-
def call(email) do
19-
email
20-
end
2113
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
defmodule Bamboo.InactiveUsersInterceptor do
2+
@behaviour Bamboo.Interceptor
3+
4+
def call(%{to: %{active: false}} = email) do
5+
Bamboo.Email.block(email)
6+
end
7+
8+
def call(%{to: %{email: nil}} = email) do
9+
Bamboo.Email.block(email)
10+
end
11+
12+
def call(email), do: email
13+
end

test/support/user.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule Bamboo.User do
2+
defstruct [:name, :email, :active]
3+
end
4+
5+
defimpl Bamboo.Formatter, for: Bamboo.User do
6+
def format_email_address(%{name: name, email: email}, _opts) do
7+
{name, email}
8+
end
9+
end

0 commit comments

Comments
 (0)