Изменение адреса электронной почты, но не связанного с ним имени в перехватчике Ruby on Rails Mail

Предыстория: в приложении 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 дает мне массив только адресов электронной почты без имен, независимо от того, было ли указано имя или нет.

Вопрос: как правильно изменить адрес электронной почты без изменения имени, связанного с адресом электронной почты в перехватчике почты?


person Jonn Beames    schedule 12.12.2013    source источник


Ответы (1)


Это не похоже на «правильный» способ сделать это, но захват заголовка «Кому» сообщения, выполнение замены и настройка с помощью message.to= позволяют мне сохранить имена при изменении адреса электронной почты. Итак, мой перехватчик стал:

# lib/stage_mail_interceptor.rb
class StageMailInterceptor

  def self.delivering_email(message)
    message.to = message.header["To"].to_s.gsub(/_\d+_p(er|re)@/, '@')
  end

end
person Jonn Beames    schedule 16.12.2013