class Mail::Address

Mail::Address handles all email addresses in Mail. It takes an email address string and parses it, breaking it down into its component parts and allowing you to get the address, comments, display name, name, local part, domain part and fully formatted address.

Mail::Address requires a correctly formatted email address per RFC2822 or RFC822. It handles all obsolete versions including obsolete domain routing on the local part.

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.format       #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
a.address      #=> 'mikel@test.lindsaar.net'
a.display_name #=> 'Mikel Lindsaar'
a.local        #=> 'mikel'
a.domain       #=> 'test.lindsaar.net'
a.comments     #=> ['My email address']
a.to_s         #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'

Public Class Methods

new(value = nil) click to toggle source
# File lib/mail/elements/address.rb, line 25
def initialize(value = nil)
  if value.nil?
    @parsed = false
    @data = nil
  else
    parse(value)
  end
end

Public Instance Methods

address(output_type = :decode) click to toggle source

Returns the address that is in the address itself. That is, the local@domain string, without any angle brackets or the like.

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.address #=> 'mikel@test.lindsaar.net'
# File lib/mail/elements/address.rb, line 65
def address(output_type = :decode)
  parse unless @parsed
  if d = domain(output_type)
    "#{local(output_type)}@#{d}"
  else
    local(output_type)
  end
end
address=(value) click to toggle source

Provides a way to assign an address to an already made Mail::Address object.

a = Address.new
a.address = 'Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>'
a.address #=> 'mikel@test.lindsaar.net'
# File lib/mail/elements/address.rb, line 79
def address=(value)
  parse(value)
end
comments() click to toggle source

Returns an array of comments that are in the email, or nil if there are no comments

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.comments #=> ['My email address']

b = Address.new('Mikel Lindsaar <mikel@test.lindsaar.net>')
b.comments #=> nil
# File lib/mail/elements/address.rb, line 132
def comments
  parse unless @parsed
  comments = get_comments
  if comments.nil? || comments.none?
    nil
  else
    comments.map { |c| c.squeeze(Constants::SPACE) }
  end
end
decoded() click to toggle source
# File lib/mail/elements/address.rb, line 173
def decoded
  format :decode
end
display_name(output_type = :decode) click to toggle source

Returns the display name of the email address passed in.

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.display_name #=> 'Mikel Lindsaar'
# File lib/mail/elements/address.rb, line 87
def display_name(output_type = :decode)
  parse unless @parsed
  @display_name ||= get_display_name
  Encodings.decode_encode(@display_name.to_s, output_type) if @display_name
end
display_name=( str ) click to toggle source

Provides a way to assign a display name to an already made Mail::Address object.

a = Address.new
a.address = 'mikel@test.lindsaar.net'
a.display_name = 'Mikel Lindsaar'
a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net>'
# File lib/mail/elements/address.rb, line 99
def display_name=( str )
  @display_name = str.nil? ? nil : str.dup # in case frozen
end
domain(output_type = :decode) click to toggle source

Returns the domain part (the right hand side of the @ sign in the email address) of the address

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.domain #=> 'test.lindsaar.net'
# File lib/mail/elements/address.rb, line 118
def domain(output_type = :decode)
  parse unless @parsed
  Encodings.decode_encode(strip_all_comments(get_domain), output_type) if get_domain
end
encoded() click to toggle source
# File lib/mail/elements/address.rb, line 169
def encoded
  format :encode
end
format(output_type = :decode) click to toggle source

Returns a correctly formatted address for the email going out. If given an incorrectly formatted address as input, Mail::Address will do its best to format it correctly. This includes quoting display names as needed and putting the address in angle brackets etc.

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
# File lib/mail/elements/address.rb, line 47
def format(output_type = :decode)
  parse unless @parsed
  if @data.nil?
    Constants::EMPTY
  elsif name = display_name(output_type)
    [Utilities.quote_phrase(name), "<#{address(output_type)}>", format_comments].compact.join(Constants::SPACE)
  elsif a = address(output_type)
    [a, format_comments].compact.join(Constants::SPACE)
  else
    raw
  end
end
group() click to toggle source
# File lib/mail/elements/address.rb, line 177
def group
  @data && @data.group
end
inspect() click to toggle source

Shows the Address object basic details, including the Address

a = Address.new('Mikel (My email) <mikel@test.lindsaar.net>')
a.inspect #=> "#<Mail::Address:14184910 Address: |Mikel <mikel@test.lindsaar.net> (My email)| >"
# File lib/mail/elements/address.rb, line 164
def inspect
  parse unless @parsed
  "#<#{self.class}:#{self.object_id} Address: |#{to_s}| >"
end
local(output_type = :decode) click to toggle source

Returns the local part (the left hand side of the @ sign in the email address) of the address

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.local #=> 'mikel'
# File lib/mail/elements/address.rb, line 108
def local(output_type = :decode)
  parse unless @parsed
  Encodings.decode_encode("#{@data.obs_domain_list}#{get_local.strip}", output_type) if get_local
end
name() click to toggle source

Sometimes an address will not have a display name, but might have the name as a comment field after the address. This returns that name if it exists.

a = Address.new('mikel@test.lindsaar.net (Mikel Lindsaar)')
a.name #=> 'Mikel Lindsaar'
# File lib/mail/elements/address.rb, line 147
def name
  parse unless @parsed
  get_name
end
raw() click to toggle source

Returns the raw input of the passed in string, this is before it is passed by the parser.

# File lib/mail/elements/address.rb, line 36
def raw
  @data.raw
end
to_s() click to toggle source

Returns the format of the address, or returns nothing

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
# File lib/mail/elements/address.rb, line 156
def to_s
  parse unless @parsed
  format
end

Private Instance Methods

format_comments() click to toggle source
# File lib/mail/elements/address.rb, line 237
def format_comments
  if comments
    comment_text = comments.map {|c| Utilities.escape_paren(c) }.join(Constants::SPACE).squeeze(Constants::SPACE)
    @format_comments ||= "(#{comment_text})"
  else
    nil
  end
end
get_comments() click to toggle source
# File lib/mail/elements/address.rb, line 254
def get_comments
  @data && @data.comments
end
get_display_name() click to toggle source
# File lib/mail/elements/address.rb, line 218
def get_display_name
  if @data && @data.display_name
    str = strip_all_comments(@data.display_name.to_s)
  elsif @data && @data.comments && @data.domain
    str = strip_domain_comments(format_comments)
  end
  str unless Utilities.blank?(str)
end
get_domain() click to toggle source
# File lib/mail/elements/address.rb, line 250
def get_domain
  @data && @data.domain
end
get_local() click to toggle source
# File lib/mail/elements/address.rb, line 246
def get_local
  @data && @data.local
end
get_name() click to toggle source
# File lib/mail/elements/address.rb, line 227
def get_name
  if display_name
    str = display_name
  elsif comments
    str = "(#{comments.join(Constants::SPACE).squeeze(Constants::SPACE)})"
  end

  Utilities.unparen(str) unless Utilities.blank?(str)
end
parse(value = nil) click to toggle source
# File lib/mail/elements/address.rb, line 183
def parse(value = nil)
  @parsed = true
  @data = nil

  case value
  when Mail::Parsers::AddressListsParser::AddressStruct
    @data = value
  when String
    unless Utilities.blank?(value)
      address_list = Mail::Parsers::AddressListsParser.parse(value)
      @data = address_list.addresses.first
    end
  end
end
strip_all_comments(string) click to toggle source
# File lib/mail/elements/address.rb, line 198
def strip_all_comments(string)
  unless Utilities.blank?(comments)
    comments.each do |comment|
      string = string.gsub("(#{comment})", Constants::EMPTY)
    end
  end
  string.strip
end
strip_domain_comments(value) click to toggle source
# File lib/mail/elements/address.rb, line 207
def strip_domain_comments(value)
  unless Utilities.blank?(comments)
    comments.each do |comment|
      if @data.domain && @data.domain.include?("(#{comment})")
        value = value.gsub("(#{comment})", Constants::EMPTY)
      end
    end
  end
  value.to_s.strip
end