zammad/zammad

View on GitHub
app/models/channel/filter/reply_to_based_sender.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

module Channel::Filter::ReplyToBasedSender

  def self.run(_channel, mail, _transaction_params)

    return if mail[:'reply-to'].blank?

    reply_to = mail[:'reply-to'].gsub('<>', '').strip
    return if reply_to.blank?

    # Check if the reply-to address can be parsed and otherwise skip the filter.
    return if !valid_address?(reply_to)

    setting = Setting.get('postmaster_sender_based_on_reply_to')
    return if setting.blank?

    # remember original sender
    mail[:'raw-origin_from']        = mail[:'raw-from']
    mail[:origin_from]              = mail[:from]
    mail[:origin_from_email]        = mail[:from_email]
    mail[:origin_from_local]        = mail[:from_local]
    mail[:origin_from_domain]       = mail[:from_domain]
    mail[:origin_from_display_name] = mail[:from_display_name]

    # get properties of reply-to header
    result = Channel::EmailParser.sender_attributes(reply_to)

    if setting == 'as_sender_of_email'

      # set new sender
      mail[:'raw-from']        = mail[:'raw-reply-to']
      mail[:from]              = reply_to
      mail[:from_email]        = result[:from_email]
      mail[:from_local]        = result[:from_local]
      mail[:from_domain]       = result[:from_domain]
      mail[:from_display_name] = result[:from_display_name]
      return
    end

    if setting == 'as_sender_of_email_use_from_realname'

      # set new sender
      mail[:'raw-from']  = mail[:'raw-reply-to']
      mail[:from]        = reply_to
      mail[:from_email]  = result[:from_email]
      mail[:from_local]  = result[:from_local]
      mail[:from_domain] = result[:from_domain]
      return
    end

    Rails.logger.error "Invalid setting value for 'postmaster_sender_based_on_reply_to' -> #{setting.inspect}"
  end

  def self.valid_address?(address)
    begin
      Mail::AddressList.new(address)&.addresses&.first&.address

      true
    rescue
      false
    end
  end
end