class Mail::Field - mail-2.5.4 Documentation

# class Mail::Field

Provides a single class to call to create a new structured or unstructured field. Works out per RFC what field of field it is being given and returns the correct field of class back on new.

### Per RFC 2822¶ ↑

    2.2. Header Fields

       Header fields are lines composed of a field name, followed by a colon
       (":"), followed by a field body, and terminated by CRLF.  A field
       name MUST be composed of printable US-ASCII characters (i.e.,
       characters that have values between 33 and 126, inclusive), except
       colon.  A field body may be composed of any US-ASCII characters,
       except for CR and LF.  However, a field body may contain CRLF when
       used in header "folding" and  "unfolding" as described in section
       2.2.3.  All field bodies MUST conform to the syntax described in
       sections 3 and 4 of this standard.

### Constants

FIELDS_MAP
FIELD_ORDER
FIELD_ORDER_LOOKUP
KNOWN_FIELDS
STRUCTURED_FIELDS

### Public Class Methods

new(name, value = nil, charset = 'utf-8') click to toggle source

Accepts a string:

    Field.new("field-name: field data")

Or name, value pair:

    Field.new("field-name", "value")

Or a name by itself:

    Field.new("field-name")

Note, does not want a terminating carriage return. Returns self appropriately parsed. If value is not a string, then it will be passed through as is, for example, content-type field can accept an array with the type and a hash of parameters:

    Field.new('content-type', ['text', 'plain', {:charset => 'UTF-8'}])

    # File lib/mail/field.rb, line 110
    def initialize(name, value = nil, charset = 'utf-8')
      case
      when name =~ /:/                  # Field.new("field-name: field data")
        charset = value unless value.blank?
        name, value = split(name)
        create_field(name, value, charset)
      when name !~ /:/ && value.blank?  # Field.new("field-name")
        create_field(name, nil, charset)
      else                              # Field.new("field-name", "value")
        create_field(name, value, charset)
      end
      return self
    end

### Public Instance Methods

<=>( other ) click to toggle source

    # File lib/mail/field.rb, line 158
    def <=>( other )
      self.field_order_id <=> other.field_order_id
    end

==( other )
Alias for: same
field() click to toggle source

    # File lib/mail/field.rb, line 128
    def field
      @field
    end

field=(value) click to toggle source

    # File lib/mail/field.rb, line 124
    def field=(value)
      @field = value
    end

field_order_id() click to toggle source

    # File lib/mail/field.rb, line 162
    def field_order_id
      @field_order_id ||= (FIELD_ORDER_LOOKUP[self.name.to_s.downcase] || 100)
    end

method_missing(name, *args, &block) click to toggle source

    # File lib/mail/field.rb, line 166
    def method_missing(name, *args, &block)
      field.send(name, *args, &block)
    end

name() click to toggle source

    # File lib/mail/field.rb, line 132
    def name
      field.name
    end

same( other ) click to toggle source

    # File lib/mail/field.rb, line 152
    def same( other )
      match_to_s(other.name, field.name)
    end

Also aliased as: ==
to_s() click to toggle source

    # File lib/mail/field.rb, line 144
    def to_s
      field.to_s
    end

update(name, value) click to toggle source

    # File lib/mail/field.rb, line 148
    def update(name, value)
      create_field(name, value, charset)
    end

value() click to toggle source

    # File lib/mail/field.rb, line 136
    def value
      field.value
    end

value=(val) click to toggle source

    # File lib/mail/field.rb, line 140
    def value=(val)
      create_field(name, val, charset)
    end

### Private Instance Methods

create_field(name, value, charset) click to toggle source

    # File lib/mail/field.rb, line 190
    def create_field(name, value, charset)
      begin
        self.field = new_field(name, value, charset)
      rescue Mail::Field::ParseError => e
        self.field = Mail::UnstructuredField.new(name, value)
        self.field.errors << [name, value, e]
        self.field
      end
    end

new_field(name, value, charset) click to toggle source

    # File lib/mail/field.rb, line 200
    def new_field(name, value, charset)
      lower_case_name = name.to_s.downcase
      if field_klass = FIELDS_MAP[lower_case_name]
        field_klass.new(value, charset)
      else
        OptionalField.new(name, value, charset)
      end
    end

split(raw_field) click to toggle source

    # File lib/mail/field.rb, line 183
    def split(raw_field)
      match_data = raw_field.mb_chars.match(FIELD_SPLIT)
      [match_data[1].to_s.mb_chars.strip, match_data[2].to_s.mb_chars.strip]
    rescue
      STDERR.puts "WARNING: Could not parse (and so ignoring) '#{raw_field}'"
    end