Предыстория: в приложении Rails 3.2 у меня есть электронное письмо с подтверждением покупки ActionMailer, которое обрабатывается в «этапной» среде, так что электронное письмо, предназначенное для адресов, связанных с учетными записями песочницы платежного процессора, фактически отправляется на электронную почту. адреса людей, которые управляют учетными записями песочницы. В настоящее время это делается внутри класса почтовой программы:
# app/mailers/purchase_mailer.rb
class PurchaseMailer < ActionMailer::Base
default :from => "\"#{SiteConfig.name}\" <#{SiteConfig.support_email}>"
def purchase_notification(purchase)
@purchase = purchase
mail :to => "\"#{purchase.customer_name}\" <#{address_filter(purchase.customer_email)}>",
:subject => "[#{SiteConfig.name}] Purchase Confirmation"
end
private
def address_filter(email_address)
# Check for and remove sandbox identifiers
if Rails.env.stage?
email_address.sub(/_\d+_p(er|re)@/, '@')
else
email_address
end
end
end
Но, эй, это похоже на отличный вариант использования перехватчика, не так ли? Поэтому я вытащил метод address_filter выше и добавил его в приложение Rails.
# config/initializers/mail.rb
Mail.register_interceptor(StageMailInterceptor) if Rails.env.stage?
# lib/stage_mail_interceptor.rb
class StageMailInterceptor
def self.delivering_email(message)
receivers = []
message.to.each do |to|
receivers << to.sub(/_\d+_p(er|re)@/, '@')
end
message.to = receivers
end
end
На первый взгляд кажется, что это отлично работает. В рабочей среде электронное письмо перехватывается, и адрес «кому» становится адресом электронной почты, на который я хочу отправить электронное письмо. Электронное письмо получает человек, управляющий учетной записью песочницы, которая использовалась для совершения покупки. Отлично... за исключением того, что имя учетной записи песочницы исчезло. То, что когда-то было "Joe Example" <[email protected]>
изменено на "Joe Example" <[email protected]>
, теперь изменено на [email protected]
... имени больше нет.
Глядя на интерфейс почтового сообщения, я вижу, что message.to=
можно установить с именем, но вызов message.to
дает мне массив только адресов электронной почты без имен, независимо от того, было ли указано имя или нет.
Вопрос: как правильно изменить адрес электронной почты без изменения имени, связанного с адресом электронной почты в перехватчике почты?