
=head1 NAME

Mail::Message::Head::Complete - the header of one message

=head1 CLASS INHERITANCE

 Mail::Message::Head::Complete
   is a Mail::Message::Head
   is a Mail::Reporter

 Mail::Message::Head::Complete is realized by
   Mail::Message::Head::Delayed
   Mail::Message::Head::Subset

=head1 SYNOPSIS

 my $head = Mail::Message::Head::Complete->new;
 See Mail::Message::Head

=head1 DESCRIPTION

E-mail's message can be in various states: unread, partially read, and
fully read.  The class stores a message of which all header lines are
known for sure.

=head1 METHODS

=head2 Initiation

=over 4

=item B<build> FIELDS

See Mail::Message::Head::build()

=item B<new> OPTIONS

(Class method)

 OPTION               DEFAULT
 field_type           'Mail::Message::Field::Fast'
 log                  'WARNINGS'
 message              undef
 modified             <false>
 trace                'WARNINGS'

=over 4

=item B<field_type> =E<gt> CLASS

See Mail::Message::Head::new(field_type)

=item B<log> =E<gt> LEVEL

See Mail::Reporter::new(log)

=item B<message> =E<gt> MESSAGE

See Mail::Message::Head::new(message)

=item B<modified> =E<gt> BOOLEAN

See Mail::Message::Head::new(modified)

=item B<trace> =E<gt> LEVEL

See Mail::Reporter::new(trace)

=back

=back

=head2 The Header

=over 4

=item B<clone> [FIELDS]

Make a copy of the header, optionally limited only to the header lines
specified by FIELDS.  The lines which are taken must start with one of the
list.  If no list is specified, all will be taken.

Examples:

 my $newhead = $head->clone('Subject', 'Received');

=item B<isDelayed> 

See Mail::Message::Head::isDelayed()

=item B<isEmpty> 

See Mail::Message::Head::isEmpty()

=item B<isModified> 

See Mail::Message::Head::isModified()

=item B<isMultipart> 

See Mail::Message::Head::isMultipart()

=item B<message> [MESSAGE]

See Mail::Message::Head::message()

=item B<modified> [BOOLEAN]

See Mail::Message::Head::modified()

=back

=head2 Constructing a Header

=over 4

=item B<add> FIELD | LINE | (NAME,BODY[,ATTRS])

Add a field to the header.  If a field is added more than once, all values
are stored in the header, in the order they are added.

When a FIELD object is specified (some Mail::Message::Field instance), that
will be added.  Another possibility is to specify a raw header LINE, or a
header line nicely split-up in NAME and BODY, in which case the
field constructor is called for you.

LINE or BODY specifications which are terminated by a new-line are considered 
to be correctly folded.  Lines which are not terminated by a new-line will
be folded when needed: new-lines will be added where required.  It is strongly
adviced to let Mail::Box do the folding for you.

The return value of this method is the Mail::Message::Field object
which is created (or was specified).

Examples:

 my $head  = Mail::Message::Head->new;
 $head->add('Subject: hi!');
 $head->add(From => 'me@home');
 my $field = Mail::Message::Field->new('To: you@there');
 $head->add($field);
 my Mail::Message::Field $s = $head->add(Sender => 'I');

=item B<delete> NAME

Remove the field with the specified name.  If the header contained
multiple lines with the same name, they will be replaced all together.
This method simply calls reset() without replacement fields.

=item B<removeField> FIELD

Remove the specified FIELD from the header.  This is useful when there
are possible more than one fields with the same name, and you need to
remove exactly one of them.  Also have a look at delete(), reset() and set().

=item B<reset> NAME, FIELDS

Replace the values in the header fields named by NAME with the values
specified in the list of FIELDS. A single name can correspond to multiple
repeated fields.

For C<Received> fields, you should take a look at I<resent groups>, as
implemented in Mail::Message::Head::ResentGroup.  Removing those
lines without their related lines is not a smart idea.  Read the
details Mail::Message::Head::ResentGroup::delete().

If FIELDS is empty, the corresponding NAME fields will
be removed. The location of removed fields in the header order will be
remembered. Fields with the same name which are added later will appear at
the remembered position.  This is equivalent to the delete() method.

Examples:

 # reduce number of 'Keywords' lines to last 5)
 my @keywords = $head->get('Keywords');
 $head->reset('Keywords', @keywords[-5..-1]) if @keywords > 5;

 # Reduce the number of Received lines to only the last added one.
 my @rgs = $head->resentGroups;
 shift @rgs;     # keep this one (later is added in front)
 $_->delete foreach @rgs;

=item B<set> FIELD | LINE | (NAME, BODY [,ATTRS])

The C<set> method is similar to the add() method, and takes the same
options. However, existing values for fields will be removed before a new
value is added.

=back

=head2 Access to the Header

=over 4

=item B<addResentGroup> RESENT-GROUP|DATA

Add a RESENT-GROUP (a Mail::Message::Head::ResentGroup object) to
the header.  If you specify DATA, that is used to create such group
first.  If no C<Received> line is specified, it will be created
for you.

These header lines have nothing to do with the user's sense
of C<reply> or C<forward> actions: these lines trace the e-mail
transport mechanism.

Examples:

 my $rg = Mail::Message::Head::ResentGroup->new(head => $head, ...);
 $head->addResentGroup($rg);

 my $rg = $head->addResentGroup(From => 'me');

=item B<count> NAME

Count the number of fields with this NAME.  Most fields will return 1: only one
occurance in the header.  As example, the C<Received> fields are usually present
more than once.

=item B<get> NAME [,INDEX]

See Mail::Message::Head::get()

=item B<grepNames> [NAMES|ARRAY-OF-NAMES|REGEXS]

Filter from all header names the names which start will any of the
specified list.  When no names are specified, all names will be returned.
The list is ordered as they where read from file, or added later.

The NAMES are regular expressions, and will all be matched case insensitive
and attached to the front of the string only.  You may also specify
one or more prepared regexes.

Examples:

 print $head->grepNames();         # same as $head->names
 print $head->grepNames('X-', 'Subject', ');
 print $head->grepNames('To\b');   # will only select To

=item B<guessBodySize> 

Try to estimate the size of the body of this message, but without parsing
the header or body.  The result might be C<undef> or a few percent of
the real size.  It may even be very far of the real value, that's why
this is a guess.

=item B<guessTimeStamp> 

Make a guess about when the message was origanally posted, based on the
information found in the header.

For some kinds of folders, Mail::Box::guessTimestamp() may produce a better
result, for instance by looking at the modification time of the file in
which the message is stored.  Also some protocols, like POP can supply that
information.

=item B<knownNames> 

See Mail::Message::Head::knownNames()

=item B<names> 

Returns a full ordered list of known field names, as defined in the
header.  Fields which were reset() to be empty will still be
listed here.

=item B<nrLines> 

Return the number of lines needed to display this header (including
the trailing newline)

=item B<print> [FILEHANDLE]

Print all headers to the specified FILEHANDLE, by default the selected
filehandle.  See printUndisclosed() to limit the headers to include
only the public headers.

Examples:

 $head->print(\*OUT);
 $head->print;

 my $fh = IO::File->new(...);
 $head->print($fh);

=item B<printUndisclosed> [FILEHANDLE]

Like the usual print(), the header lines are printed to the specified
FILEHANDLE, by default the selected filehandle.  In this case, however,
C<Bcc> and C<Resent-Bcc> lines are included.

=item B<resentGroups> 

Returns a list of Mail::Message::Head::ResentGroup objects which
each represent one intermediate point in the message's transmission in
the order as they appear in the header: the most recent one first.

A resent group contains a set of header fields whose names start
with C<Resent->.  Before the first C<Resent> line is I<trace> information,
which is composed of an optional C<Return-Path> field and an required
C<Received> field.

=item B<size> 

Return the number of bytes needed to display this header (including
the trailing newline).  On systems which use CRLF as line separator,
the number of lines in the header (see nlLines()) must be added to
find the actual size in the file.

=item B<string> 

Returns the whole header as one scalar (in scalar context) or list
of lines (list context).  Triggers completion.

=item B<timestamp> 

Will return a good indication of about when the message was send, with as
little guessing as possible.  The timestamp is encoded as C<time> is
on your system (see perldoc -f time), and as such usable for the C<gmtime>
and C<localtime> methods.

=back

=head2 Reading and Writing [internals]

=over 4

=item B<addNoRealize> FIELD

See Mail::Message::Head::addNoRealize()

=item B<addOrderedFields> FIELDS

See Mail::Message::Head::addOrderedFields()

=item B<createFromLine> 

For some mail-folder types separate messages by a line starting with
'C<From >'.  If a message is moved to such folder from a folder-type
which does not support these separators, this method is called to produce
one.

=item B<createMessageId> 

Creates a message-id for this message.  This method will be run when
a new message is created, or a message is discovered without the
message-id header field.  Message-ids are required for detection of
message-threads.

=item B<fileLocation> 

See Mail::Message::Head::fileLocation()

=item B<load> 

See Mail::Message::Head::load()

=item B<messagIdPrefix> [STRING]

Sets/returns the message-id start.  The rest of the message-id is an
integer which is derived from the current time and the local host.
See createMessageId().

=item B<moveLocation> DISTANCE

See Mail::Message::Head::moveLocation()

=item B<orderedFields> 

See Mail::Message::Head::orderedFields()

=item B<read> PARSER

See Mail::Message::Head::read()

=item B<setNoRealize> FIELD

See Mail::Message::Head::setNoRealize()

=back

=head2 Logging and Tracing

=over 4

=item B<defaultTrace> [LEVEL, [LEVEL]

See Mail::Reporter::defaultTrace()

=item B<errors> 

See Mail::Reporter::errors()

=item B<log> [LEVEL [,STRINGS]]

See Mail::Reporter::log()

=item B<report> [LEVEL]

See Mail::Reporter::report()

=item B<reportAll> [LEVEL]

See Mail::Reporter::reportAll()

=item B<trace> [LEVEL]

See Mail::Reporter::trace()

=item B<warnings> 

See Mail::Reporter::warnings()

=back

=head2 Other Methods

=over 4

=item B<AUTOLOAD> 

See Mail::Reporter::AUTOLOAD()

=item B<DESTROY> 

See Mail::Reporter::DESTROY()

=item B<inGlobalDestruction> 

See Mail::Reporter::inGlobalDestruction()

=item B<logPriority> LEVEL

See Mail::Reporter::logPriority()

=item B<logSettings> 

See Mail::Reporter::logSettings()

=item B<notImplemented> 

See Mail::Reporter::notImplemented()

=back

=head1 SEE ALSO

A good start to read is Mail::Box-Overview.
More documentation and a mailinglist are available from the project's
website at L<http://perl.overmeer.net/mailbox/>.

=head1 AUTHOR

Written by Mark Overmeer (L<mark@overmeer.net|mailto:mark@overmeer.net>)
with the help of many.  See the ChangeLog for details.

=head1 VERSION

This code is beta, version 2.037.

Copyright (c) 2001-2003 by the authors. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
