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
# 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
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
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
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
# File lib/mail/elements/address.rb, line 173 def decoded format :decode end
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
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
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
# File lib/mail/elements/address.rb, line 169 def encoded format :encode end
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
# File lib/mail/elements/address.rb, line 177 def group @data && @data.group end
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
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
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
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
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
# 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
# File lib/mail/elements/address.rb, line 254 def get_comments @data && @data.comments end
# 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
# File lib/mail/elements/address.rb, line 250 def get_domain @data && @data.domain end
# File lib/mail/elements/address.rb, line 246 def get_local @data && @data.local end
# 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
# 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
# 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
# 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