class Mail::Message

def address_list(obj)

def address_list(obj)
  if obj&.respond_to?(:element)
    # Mail 2.8+
    obj.element
  else
    # Mail <= 2.7.x
    obj&.address_list
  end
end

def bcc_addresses

def bcc_addresses
  Array(address_list(header[:bcc])&.addresses)
end

def cc_addresses

def cc_addresses
  Array(address_list(header[:cc])&.addresses)
end

def from_address

def from_address
  address_list(header[:from])&.addresses&.first
end

def recipients

def recipients
  Array(to) + Array(cc) + Array(bcc) + Array(header[:x_original_to]).map(&:to_s)
end

def recipients_addresses

def recipients_addresses
  to_addresses + cc_addresses + bcc_addresses + x_original_to_addresses
end

def to_addresses

def to_addresses
  Array(address_list(header[:to])&.addresses)
end

def x_original_to_addresses

def x_original_to_addresses
  Array(header[:x_original_to]).collect { |header| Mail::Address.new header.to_s }
end