r1724 - in packages/libmime-lite-perl/tags: .
debian_version_3_01-6/debian debian_version_3_01-6/lib/MIME
Gunnar Wolf
gwolf at costa.debian.org
Wed Dec 21 04:01:54 UTC 2005
Author: gwolf
Date: 2005-12-21 04:01:24 +0000 (Wed, 21 Dec 2005)
New Revision: 1724
Added:
packages/libmime-lite-perl/tags/debian_version_3_01-6/
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/changelog
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/control
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/rules
packages/libmime-lite-perl/tags/debian_version_3_01-6/lib/MIME/Lite.pm
Removed:
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/changelog
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/control
packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/rules
packages/libmime-lite-perl/tags/debian_version_3_01-6/lib/MIME/Lite.pm
Log:
Uploaded version 3.01-6
Copied: packages/libmime-lite-perl/tags/debian_version_3_01-6 (from rev 1721, packages/libmime-lite-perl/trunk)
Deleted: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/changelog
===================================================================
--- packages/libmime-lite-perl/trunk/debian/changelog 2005-12-20 21:06:39 UTC (rev 1721)
+++ packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/changelog 2005-12-21 04:01:24 UTC (rev 1724)
@@ -1,106 +0,0 @@
-libmime-lite-perl (3.01-5) unstable; urgency=low
-
- * Added debian/watch
-
- -- Gunnar Wolf <gwolf at debian.org> Wed, 25 May 2005 11:03:09 -0500
-
-libmime-lite-perl (3.01-4) unstable; urgency=low
-
- * Changes in %ENV are now kept local to the module (Closes: #289983)
-
- -- Gunnar Wolf <gwolf at debian.org> Fri, 4 Mar 2005 17:25:35 -0600
-
-libmime-lite-perl (3.01-3) unstable; urgency=low
-
- * Set the path to a sane default (/bin:/usr/bin) so that MIME::Lite
- will agree to send messages while running in Tainted mode (Closes:
- #268458)
-
- -- Gunnar Wolf <gwolf at debian.org> Thu, 2 Dec 2004 13:42:08 -0600
-
-libmime-lite-perl (3.01-2) unstable; urgency=low
-
- * changes.pod had the whole information in the =NAME section - Even if
- we do not treat it as a POD file anymore, I fixed it in the source.
- Notifying upstream as well.
- * changes.pod should not be a manual page, as it is a changelog -
- Moved it. (Closes: #283656)
-
- -- Gunnar Wolf <gwolf at debian.org> Thu, 2 Dec 2004 12:57:36 -0600
-
-libmime-lite-perl (3.01-1) unstable; urgency=low
-
- * New upstream release
- * Changed source package name from mime-lite to libmime-lite-perl in
- order to be more consistent with other Perl packages
- * New maintainer - Debian Perl Group <pkg-perl-
- maintainers at lists.alioth.debian.org> via Gunnar
- Wolf<gwolf at debian.org> (Closes: #279809)
-
- -- Gunnar Wolf <gwolf at debian.org> Wed, 10 Nov 2004 10:40:11 -0600
-
-mime-lite (2.117-5) unstable; urgency=low
-
- * Patch Lite.pm so that it returns usable addresses if Mail::Address is
- installed,
- Closes: #173627
-
- -- Stephen Zander <gibreel at debian.org> Tue, 3 Feb 2004 01:07:08 -0800
-
-mime-lite (2.117-4) unstable; urgency=low
-
- * Fix missing ')' in Build-Depends:,
- Closes: #173115
-
- -- Stephen Zander <gibreel at debian.org> Mon, 24 Feb 2003 23:47:00 -0800
-
-mime-lite (2.117-3) unstable; urgency=low
-
- * New maintainer.
-
- -- Stephen Zander <gibreel at debian.org> Mon, 30 Sep 2002 10:52:12 -0700
-
-mime-lite (2.117-2) unstable; urgency=low
-
- * debian/control: Changed Build-Depends to Build-Depends-Indep (lintian)
- * debian/rules: Build from binary-indep (Closes: #157511)
-
- -- Dirk Eddelbuettel <edd at debian.org> Tue, 20 Aug 2002 20:20:25 -0500
-
-mime-lite (2.117-1) unstable; urgency=low
-
- * Upgraded to upstream release 2.117
-
- -- Dirk Eddelbuettel <edd at debian.org> Wed, 22 Aug 2001 20:28:14 -0500
-
-mime-lite (2.116-2) unstable; urgency=low
-
- * debian/rules: Change $(PERL) to perl (Closes: #109311)
-
- -- Dirk Eddelbuettel <edd at debian.org> Mon, 20 Aug 2001 07:43:49 -0500
-
-mime-lite (2.116-1) unstable; urgency=low
-
- * Upgraded to upstream release 2.116
-
- -- Dirk Eddelbuettel <edd at debian.org> Sat, 18 Aug 2001 08:40:39 -0500
-
-mime-lite (2.115-1) unstable; urgency=low
-
- * Upgraded to upstream release 2.115
-
- -- Dirk Eddelbuettel <edd at debian.org> Fri, 17 Aug 2001 18:24:30 -0500
-
-mime-lite (2.111-1) unstable; urgency=low
-
- * Upgraded to upstream release 2.111
-
- -- Dirk Eddelbuettel <edd at debian.org> Tue, 7 Aug 2001 19:41:17 -0500
-
-mime-lite (2.106-1) unstable; urgency=low
-
- * Initial Release
-
- -- Dirk Eddelbuettel <edd at debian.org> Sun, 11 Mar 2001 09:17:30 -0600
-
-
Copied: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/changelog (from rev 1723, packages/libmime-lite-perl/trunk/debian/changelog)
Deleted: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/control
===================================================================
--- packages/libmime-lite-perl/trunk/debian/control 2005-12-20 21:06:39 UTC (rev 1721)
+++ packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/control 2005-12-21 04:01:24 UTC (rev 1724)
@@ -1,17 +0,0 @@
-Source: libmime-lite-perl
-Section: perl
-Priority: optional
-Maintainer: Debian Perl Group <pkg-perl-maintainers at lists.alioth.debian.org>
-Uploaders: Gunnar Wolf <gwolf at debian.org>
-Standards-Version: 3.6.1
-Build-Depends-Indep: debhelper (>> 4.1), perl (>> 5.8.1)
-
-Package: libmime-lite-perl
-Architecture: all
-Depends: ${perl:Depends}
-Description: Perl5 module for convenient generation of MIME messages
- MIME::Lite is intended as a simple, standalone module for generating
- (not parsing!) MIME messages... specifically, it allows you to
- output a simple, decent single- or multi-part message with text or binary
- attachments. It does not require that you have the Mail:: or MIME::
- modules installed.
Copied: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/control (from rev 1723, packages/libmime-lite-perl/trunk/debian/control)
Deleted: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/rules
===================================================================
--- packages/libmime-lite-perl/trunk/debian/rules 2005-12-20 21:06:39 UTC (rev 1721)
+++ packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/rules 2005-12-21 04:01:24 UTC (rev 1724)
@@ -1,58 +0,0 @@
-#! /usr/bin/make -f
-# -*-makefile-*-
-# debian/rules file for libmime-lite-perl
-
-PERL ?= /usr/bin/perl
-
-package := $(firstword $(shell dh_listpackages))
-prefix := $(PWD)/debian/$(package)/usr
-
-version := $(shell dpkg-parsechangelog | \
- sed -ne 's/^Version: *\([0-9]\+:\)*//p')
-
-build: build-stamp
-build-stamp:
- dh_testdir
- $(PERL) Makefile.PL INSTALLDIRS=vendor PERL=$(PERL)
- $(MAKE)
- $(MAKE) test
- touch $@
-
-clean: checkroot
- rm -f build-stamp
- dh_clean debian/changes
- -$(MAKE) distclean
-
-binary-indep: checkroot build
- dh_clean
- dh_installdirs
-
- $(MAKE) install PREFIX=$(prefix)
-
- # changes.pod is a changelog, not a man page - Run it through pod2text
- # to install it as a changelog and remove it from where it got
- # installed.
- rm -f $(prefix)/share/perl5/MIME/changes.pod $(prefix)/share/man/man3/MIME::changes.3pm
- pod2text changes.pod > debian/changes
-
- dh_installdocs README
- dh_installexamples examples/* contrib
- dh_installchangelogs debian/changes
-
- dh_compress
- dh_fixperms
- dh_perl
- dh_installdeb
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-
-binary-arch: checkroot build
-
-binary: binary-indep binary-arch
-
-checkroot:
- dh_testdir
- dh_testroot
-
-.PHONY: binary binary-arch binary-indep clean checkroot build
Copied: packages/libmime-lite-perl/tags/debian_version_3_01-6/debian/rules (from rev 1722, packages/libmime-lite-perl/trunk/debian/rules)
Deleted: packages/libmime-lite-perl/tags/debian_version_3_01-6/lib/MIME/Lite.pm
===================================================================
--- packages/libmime-lite-perl/trunk/lib/MIME/Lite.pm 2005-12-20 21:06:39 UTC (rev 1721)
+++ packages/libmime-lite-perl/tags/debian_version_3_01-6/lib/MIME/Lite.pm 2005-12-21 04:01:24 UTC (rev 1724)
@@ -1,3278 +0,0 @@
-package MIME::Lite;
-
-
-=head1 NAME
-
-MIME::Lite - low-calorie MIME generator
-
-
-=head1 SYNOPSIS
-
- use MIME::Lite;
-
-Create a single-part message:
-
- ### Create a new single-part message, to send a GIF file:
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'Helloooooo, nurse!',
- Type =>'image/gif',
- Encoding =>'base64',
- Path =>'hellonurse.gif'
- );
-
-Create a multipart message (i.e., one with attachments):
-
- ### Create a new multipart message:
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'A message with 2 parts...',
- Type =>'multipart/mixed'
- );
-
- ### Add parts (each "attach" has same arguments as "new"):
- $msg->attach(Type =>'TEXT',
- Data =>"Here's the GIF file you wanted"
- );
- $msg->attach(Type =>'image/gif',
- Path =>'aaa000123.gif',
- Filename =>'logo.gif',
- Disposition => 'attachment'
- );
-
-Output a message:
-
- ### Format as a string:
- $str = $msg->as_string;
-
- ### Print to a filehandle (say, a "sendmail" stream):
- $msg->print(\*SENDMAIL);
-
-
-Send a message:
-
- ### Send in the "best" way (the default is to use "sendmail"):
- $msg->send;
-
-
-
-=head1 DESCRIPTION
-
-In the never-ending quest for great taste with fewer calories,
-we proudly present: I<MIME::Lite>.
-
-MIME::Lite is intended as a simple, standalone module for generating
-(not parsing!) MIME messages... specifically, it allows you to
-output a simple, decent single- or multi-part message with text or binary
-attachments. It does not require that you have the Mail:: or MIME::
-modules installed.
-
-You can specify each message part as either the literal data itself (in
-a scalar or array), or as a string which can be given to open() to get
-a readable filehandle (e.g., "<filename" or "somecommand|").
-
-You don't need to worry about encoding your message data:
-this module will do that for you. It handles the 5 standard MIME encodings.
-
-If you need more sophisticated behavior, please get the MIME-tools
-package instead. I will be more likely to add stuff to that toolkit
-over this one.
-
-
-=head1 EXAMPLES
-
-=head2 Create a simple message containing just text
-
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'Helloooooo, nurse!',
- Data =>"How's it goin', eh?"
- );
-
-=head2 Create a simple message containing just an image
-
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'Helloooooo, nurse!',
- Type =>'image/gif',
- Encoding =>'base64',
- Path =>'hellonurse.gif'
- );
-
-
-=head2 Create a multipart message
-
- ### Create the multipart "container":
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'A message with 2 parts...',
- Type =>'multipart/mixed'
- );
-
- ### Add the text message part:
- ### (Note that "attach" has same arguments as "new"):
- $msg->attach(Type =>'TEXT',
- Data =>"Here's the GIF file you wanted"
- );
-
- ### Add the image part:
- $msg->attach(Type =>'image/gif',
- Path =>'aaa000123.gif',
- Filename =>'logo.gif',
- Disposition => 'attachment'
- );
-
-
-=head2 Attach a GIF to a text message
-
-This will create a multipart message exactly as above, but using the
-"attach to singlepart" hack:
-
- ### Start with a simple text message:
- $msg = MIME::Lite->new(
- From =>'me at myhost.com',
- To =>'you at yourhost.com',
- Cc =>'some at other.com, some at more.com',
- Subject =>'A message with 2 parts...',
- Type =>'TEXT',
- Data =>"Here's the GIF file you wanted"
- );
-
- ### Attach a part... the make the message a multipart automatically:
- $msg->attach(Type =>'image/gif',
- Path =>'aaa000123.gif',
- Filename =>'logo.gif'
- );
-
-
-=head2 Attach a pre-prepared part to a message
-
- ### Create a standalone part:
- $part = MIME::Lite->new(
- Type =>'text/html',
- Data =>'<H1>Hello</H1>',
- );
- $part->attr('content-type.charset' => 'UTF8');
- $part->add('X-Comment' => 'A message for you');
-
- ### Attach it to any message:
- $msg->attach($part);
-
-
-=head2 Print a message to a filehandle
-
- ### Write it to a filehandle:
- $msg->print(\*STDOUT);
-
- ### Write just the header:
- $msg->print_header(\*STDOUT);
-
- ### Write just the encoded body:
- $msg->print_body(\*STDOUT);
-
-
-=head2 Print a message into a string
-
- ### Get entire message as a string:
- $str = $msg->as_string;
-
- ### Get just the header:
- $str = $msg->header_as_string;
-
- ### Get just the encoded body:
- $str = $msg->body_as_string;
-
-
-=head2 Send a message
-
- ### Send in the "best" way (the default is to use "sendmail"):
- $msg->send;
-
-
-=head2 Send an HTML document... with images included!
-
- $msg = MIME::Lite->new(
- To =>'you at yourhost.com',
- Subject =>'HTML with in-line images!',
- Type =>'multipart/related'
- );
- $msg->attach(Type => 'text/html',
- Data => qq{ <body>
- Here's <i>my</i> image:
- <img src="cid:myimage.gif">
- </body> }
- );
- $msg->attach(Type => 'image/gif',
- Id => 'myimage.gif',
- Path => '/path/to/somefile.gif',
- );
- $msg->send();
-
-
-=head2 Change how messages are sent
-
- ### Do something like this in your 'main':
- if ($I_DONT_HAVE_SENDMAIL) {
- MIME::Lite->send('smtp', "smtp.myisp.net", Timeout=>60);
- }
-
- ### Now this will do the right thing:
- $msg->send; ### will now use Net::SMTP as shown above
-
-
-
-
-
-
-=head1 PUBLIC INTERFACE
-
-=head2 Global configuration
-
-To alter the way the entire module behaves, you have the following
-methods/options:
-
-=over 4
-
-
-=item MIME::Lite->field_order()
-
-When used as a L<classmethod|/field_order>, this changes the default
-order in which headers are output for I<all> messages.
-However, please consider using the instance method variant instead,
-so you won't stomp on other message senders in the same application.
-
-
-=item MIME::Lite->quiet()
-
-This L<classmethod|/quiet> can be used to suppress/unsuppress
-all warnings coming from this module.
-
-
-=item MIME::Lite->send()
-
-When used as a L<classmethod|/send>, this can be used to specify
-a different default mechanism for sending message.
-The initial default is:
-
- MIME::Lite->send("sendmail", "/usr/lib/sendmail -t -oi -oem");
-
-However, you should consider the similar but smarter and taint-safe variant:
-
- MIME::Lite->send("sendmail");
-
-Or, for non-Unix users:
-
- MIME::Lite->send("smtp");
-
-
-=item $MIME::Lite::AUTO_CC
-
-If true, automatically send to the Cc/Bcc addresses for send_by_smtp().
-Default is B<true>.
-
-
-=item $MIME::Lite::AUTO_CONTENT_TYPE
-
-If true, try to automatically choose the content type from the file name
-in C<new()>/C<build()>. In other words, setting this true changes the
-default C<Type> from C<"TEXT"> to C<"AUTO">.
-
-Default is B<false>, since we must maintain backwards-compatibility
-with prior behavior. B<Please> consider keeping it false,
-and just using Type 'AUTO' when you build() or attach().
-
-
-=item $MIME::Lite::AUTO_ENCODE
-
-If true, automatically choose the encoding from the content type.
-Default is B<true>.
-
-
-=item $MIME::Lite::AUTO_VERIFY
-
-If true, check paths to attachments right before printing, raising an exception
-if any path is unreadable.
-Default is B<true>.
-
-
-=item $MIME::Lite::PARANOID
-
-If true, we won't attempt to use MIME::Base64, MIME::QuotedPrint,
-or MIME::Types, even if they're available.
-Default is B<false>. Please consider keeping it false,
-and trusting these other packages to do the right thing.
-
-
-=back
-
-=cut
-
-require 5.004; ### for /c modifier in m/\G.../gc modifier
-
-use Carp ();
-use FileHandle;
-
-use strict;
-use vars qw(
- $AUTO_CC
- $AUTO_CONTENT_TYPE
- $AUTO_ENCODE
- $AUTO_VERIFY
- $PARANOID
- $QUIET
- $VANILLA
- $VERSION
- );
-
-# Don't affect the environment for any invoking script
-local %ENV = %ENV;
-
-$ENV{PATH} = '/bin:/usr/bin';
-
-#==============================
-#==============================
-#
-# GLOBALS, EXTERNAL/CONFIGURATION...
-$VERSION = "3.01";
-
-### Automatically interpret CC/BCC for SMTP:
-$AUTO_CC = 1;
-
-### Automatically choose content type from file name:
-$AUTO_CONTENT_TYPE = 0;
-
-### Automatically choose encoding from content type:
-$AUTO_ENCODE = 1;
-
-### Check paths right before printing:
-$AUTO_VERIFY = 1;
-
-### Set this true if you don't want to use MIME::Base64/QuotedPrint/Types:
-$PARANOID = 0;
-
-### Don't warn me about dangerous activities:
-$QUIET = undef;
-
-### Unsupported (for tester use): don't qualify boundary with time/pid:
-$VANILLA = 0;
-
-
-#==============================
-#==============================
-#
-# GLOBALS, INTERNAL...
-
-### Find sendmail:
-my $SENDMAIL = "/usr/lib/sendmail";
-(-x $SENDMAIL) or ($SENDMAIL = "/usr/sbin/sendmail");
-(-x $SENDMAIL) or ($SENDMAIL = "sendmail");
-
-### Our sending facilities:
-my $Sender = "sendmail";
-my %SenderArgs = (
- "sendmail" => ["$SENDMAIL -t -oi -oem"],
- "smtp" => [],
- "sub" => [],
-);
-
-### Boundary counter:
-my $BCount = 0;
-
-### Known Mail/MIME fields... these, plus some general forms like
-### "x-*", are recognized by build():
-my %KnownField = map {$_=>1}
-qw(
- bcc cc comments date encrypted
- from keywords message-id mime-version organization
- received references reply-to return-path sender
- subject to
-
- approved
- );
-
-### What external packages do we use for encoding?
-my @Uses;
-
-### Header order:
-my @FieldOrder;
-
-### See if we have File::Basename
-my $HaveFileBasename = 0;
-if (eval "require File::Basename") { # not affected by $PARANOID, core Perl
- $HaveFileBasename = 1;
- push @Uses, "F$File::Basename::VERSION";
-}
-
-### See if we have/want MIME::Types
-my $HaveMimeTypes=0;
-if (!$PARANOID and eval "require MIME::Types; MIME::Types->VERSION(1.004);") {
- $HaveMimeTypes = 1;
- push @Uses, "T$MIME::Types::VERSION";
-}
-#==============================
-#==============================
-#
-# PRIVATE UTILITY FUNCTIONS...
-
-#------------------------------
-#
-# fold STRING
-#
-# Make STRING safe as a field value. Remove leading/trailing whitespace,
-# and make sure newlines are represented as newline+space
-
-sub fold {
- my $str = shift;
- $str =~ s/^\s*|\s*$//g; ### trim
- $str =~ s/\n/\n /g;
- $str;
-}
-
-#------------------------------
-#
-# gen_boundary
-#
-# Generate a new boundary to use.
-# The unsupported $VANILLA is for test purposes only.
-
-sub gen_boundary {
- return ("_----------=_".($VANILLA ? '' : int(time).$$).$BCount++);
-}
-
-#------------------------------
-#
-# known_field FIELDNAME
-#
-# Is this a recognized Mail/MIME field?
-
-sub known_field {
- my $field = lc(shift);
- $KnownField{$field} or ($field =~ m{^(content|resent|x)-.});
-}
-
-#------------------------------
-#
-# is_mime_field FIELDNAME
-#
-# Is this a field I manage?
-
-sub is_mime_field {
- $_[0] =~ /^(mime\-|content\-)/i;
-}
-
-#------------------------------
-#
-# extract_addrs STRING
-#
-# Split STRING into an array of email addresses: somewhat of a KLUDGE.
-#
-# Unless paranoid, we try to load the real code before supplying our own.
-
-my $ATOM = '[^ \000-\037()<>@,;:\134"\056\133\135]+';
-my $QSTR = '".*?"';
-my $WORD = '(?:' . $QSTR . '|' . $ATOM . ')';
-my $DOMAIN = '(?:' . $ATOM . '(?:' . '\\.' . $ATOM . ')*' . ')';
-my $LOCALPART = '(?:' . $WORD . '(?:' . '\\.' . $WORD . ')*' . ')';
-my $ADDR = '(?:' . $LOCALPART . '@' . $DOMAIN . ')';
-my $PHRASE = '(?:' . $WORD . ')+';
-my $SEP = "(?:^\\s*|\\s*,\\s*)"; ### before elems in a list
-
-sub my_extract_addrs {
- my $str = shift;
- my @addrs;
- $str =~ s/\s/ /g; ### collapse whitespace
-
- pos($str) = 0;
- while ($str !~ m{\G\s*\Z}gco) {
- ### print STDERR "TACKLING: ".substr($str, pos($str))."\n";
- if ($str =~ m{\G$SEP$PHRASE\s*<\s*($ADDR)\s*>}gco) {push @addrs,$1}
- elsif ($str =~ m{\G$SEP($ADDR)}gco) {push @addrs,$1}
- elsif ($str =~ m{\G$SEP($ATOM)}gco) {push @addrs,$1}
- else {
- my $problem = substr($str, pos($str));
- die "can't extract address at <$problem> in <$str>\n";
- }
- }
- return @addrs;
-}
-
-if (eval "require Mail::Address") {
- push @Uses, "A$Mail::Address::VERSION";
- eval q{
- sub extract_addrs {
- return map { $_->address } Mail::Address->parse($_[0]);
- }
- }; ### q
-}
-else {
- eval q{
- sub extract_addrs {
- return my_extract_addrs(@_);
- }
- }; ### q
-} ### if
-
-
-
-#==============================
-#==============================
-#
-# PRIVATE ENCODING FUNCTIONS...
-
-#------------------------------
-#
-# encode_base64 STRING
-#
-# Encode the given string using BASE64.
-# Unless paranoid, we try to load the real code before supplying our own.
-
-if (!$PARANOID and eval "require MIME::Base64") {
- import MIME::Base64 qw(encode_base64);
- push @Uses, "B$MIME::Base64::VERSION";
-}
-else {
- eval q{
-sub encode_base64 {
- my $res = "";
- my $eol = "\n";
-
- pos($_[0]) = 0; ### thanks, Andreas!
- while ($_[0] =~ /(.{1,45})/gs) {
- $res .= substr(pack('u', $1), 1);
- chop($res);
- }
- $res =~ tr|` -_|AA-Za-z0-9+/|;
-
- ### Fix padding at the end:
- my $padding = (3 - length($_[0]) % 3) % 3;
- $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
-
- ### Break encoded string into lines of no more than 76 characters each:
- $res =~ s/(.{1,76})/$1$eol/g if (length $eol);
- return $res;
-} ### sub
- } ### q
-} ### if
-
-#------------------------------
-#
-# encode_qp STRING
-#
-# Encode the given string, LINE BY LINE, using QUOTED-PRINTABLE.
-# Stolen from MIME::QuotedPrint by Gisle Aas, with a slight bug fix: we
-# break lines earlier. Notice that this seems not to work unless
-# encoding line by line.
-#
-# Unless paranoid, we try to load the real code before supplying our own.
-
-if (!$PARANOID and eval "require MIME::QuotedPrint") {
- import MIME::QuotedPrint qw(encode_qp);
- push @Uses, "Q$MIME::QuotedPrint::VERSION";
-}
-else {
- eval q{
-sub encode_qp {
- my $res = shift;
- local($_);
- $res =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg; ### rule #2,#3
- $res =~ s/([ \t]+)$/
- join('', map { sprintf("=%02X", ord($_)) }
- split('', $1)
- )/egm; ### rule #3 (encode whitespace at eol)
-
- ### rule #5 (lines shorter than 76 chars, but can't break =XX escapes:
- my $brokenlines = "";
- $brokenlines .= "$1=\n" while $res =~ s/^(.{70}([^=]{2})?)//; ### 70 was 74
- $brokenlines =~ s/=\n$// unless length $res;
- "$brokenlines$res";
-} ### sub
- } ### q
-} ### if
-
-
-#------------------------------
-#
-# encode_8bit STRING
-#
-# Encode the given string using 8BIT.
-# This breaks long lines into shorter ones.
-
-sub encode_8bit {
- my $str = shift;
- $str =~ s/^(.{990})/$1\n/mg;
- $str;
-}
-
-#------------------------------
-#
-# encode_7bit STRING
-#
-# Encode the given string using 7BIT.
-# This NO LONGER protects people through encoding.
-
-sub encode_7bit {
- my $str = shift;
- $str =~ s/[\x80-\xFF]//g;
- $str =~ s/^(.{990})/$1\n/mg;
- $str;
-}
-
-#==============================
-#==============================
-
-=head2 Construction
-
-=over 4
-
-=cut
-
-
-#------------------------------
-
-=item new [PARAMHASH]
-
-I<Class method, constructor.>
-Create a new message object.
-
-If any arguments are given, they are passed into C<build()>; otherwise,
-just the empty object is created.
-
-=cut
-
-sub new {
- my $class = shift;
-
- ### Create basic object:
- my $self = {
- Attrs => {}, ### MIME attributes
- Header => [], ### explicit message headers
- Parts => [], ### array of parts
- };
- bless $self, $class;
-
- ### Build, if needed:
- return (@_ ? $self->build(@_) : $self);
-}
-
-
-#------------------------------
-
-=item attach PART
-
-=item attach PARAMHASH...
-
-I<Instance method.>
-Add a new part to this message, and return the new part.
-
-If you supply a single PART argument, it will be regarded
-as a MIME::Lite object to be attached. Otherwise, this
-method assumes that you are giving in the pairs of a PARAMHASH
-which will be sent into C<new()> to create the new part.
-
-One of the possibly-quite-useful hacks thrown into this is the
-"attach-to-singlepart" hack: if you attempt to attach a part (let's
-call it "part 1") to a message that doesn't have a content-type
-of "multipart" or "message", the following happens:
-
-=over 4
-
-=item *
-
-A new part (call it "part 0") is made.
-
-=item *
-
-The MIME attributes and data (but I<not> the other headers)
-are cut from the "self" message, and pasted into "part 0".
-
-=item *
-
-The "self" is turned into a "multipart/mixed" message.
-
-=item *
-
-The new "part 0" is added to the "self", and I<then> "part 1" is added.
-
-=back
-
-One of the nice side-effects is that you can create a text message
-and then add zero or more attachments to it, much in the same way
-that a user agent like Netscape allows you to do.
-
-=cut
-
-sub attach {
- my $self = shift;
-
- ### Create new part, if necessary:
- my $part1 = ((@_ == 1) ? shift : ref($self)->new(Top=>0, @_));
-
- ### Do the "attach-to-singlepart" hack:
- if ($self->attr('content-type') !~ m{^(multipart|message)/}i) {
-
- ### Create part zero:
- my $part0 = ref($self)->new;
-
- ### Cut MIME stuff from self, and paste into part zero:
- foreach (qw(Attrs Data Path FH)) {
- $part0->{$_} = $self->{$_}; delete($self->{$_});
- }
- $part0->top_level(0); ### clear top-level attributes
-
- ### Make self a top-level multipart:
- $self->{Attrs} ||= {}; ### reset
- $self->attr('content-type' => 'multipart/mixed');
- $self->attr('content-type.boundary' => gen_boundary());
- $self->attr('content-transfer-encoding' => '7bit');
- $self->top_level(1); ### activate top-level attributes
-
- ### Add part 0:
- push @{$self->{Parts}}, $part0;
- }
-
- ### Add the new part:
- push @{$self->{Parts}}, $part1;
- $part1;
-}
-
-#------------------------------
-
-=item build [PARAMHASH]
-
-I<Class/instance method, initializer.>
-Create (or initialize) a MIME message object.
-Normally, you'll use the following keys in PARAMHASH:
-
- * Data, FH, or Path (either one of these, or none if multipart)
- * Type (e.g., "image/jpeg")
- * From, To, and Subject (if this is the "top level" of a message)
-
-The PARAMHASH can contain the following keys:
-
-=over 4
-
-=item (fieldname)
-
-Any field you want placed in the message header, taken from the
-standard list of header fields (you don't need to worry about case):
-
- Approved Encrypted Received Sender
- Bcc From References Subject
- Cc Keywords Reply-To To
- Comments Message-ID Resent-* X-*
- Content-* MIME-Version Return-Path
- Date Organization
-
-To give experienced users some veto power, these fields will be set
-I<after> the ones I set... so be careful: I<don't set any MIME fields>
-(like C<Content-type>) unless you know what you're doing!
-
-To specify a fieldname that's I<not> in the above list, even one that's
-identical to an option below, just give it with a trailing C<":">,
-like C<"My-field:">. When in doubt, that I<always> signals a mail
-field (and it sort of looks like one too).
-
-=item Data
-
-I<Alternative to "Path" or "FH".>
-The actual message data. This may be a scalar or a ref to an array of
-strings; if the latter, the message consists of a simple concatenation
-of all the strings in the array.
-
-=item Datestamp
-
-I<Optional.>
-If given true (or omitted), we force the creation of a C<Date:> field
-stamped with the current date/time if this is a top-level message.
-You may want this if using L<send_by_smtp()|/send_by_smtp>.
-If you don't want this to be done, either provide your own Date
-or explicitly set this to false.
-
-=item Disposition
-
-I<Optional.>
-The content disposition, C<"inline"> or C<"attachment">.
-The default is C<"inline">.
-
-=item Encoding
-
-I<Optional.>
-The content transfer encoding that should be used to encode your data:
-
- Use encoding: | If your message contains:
- ------------------------------------------------------------
- 7bit | Only 7-bit text, all lines <1000 characters
- 8bit | 8-bit text, all lines <1000 characters
- quoted-printable | 8-bit text or long lines (more reliable than "8bit")
- base64 | Largely non-textual data: a GIF, a tar file, etc.
-
-The default is taken from the Type; generally it is "binary" (no
-encoding) for text/*, message/*, and multipart/*, and "base64" for
-everything else. A value of C<"binary"> is generally I<not> suitable
-for sending anything but ASCII text files with lines under 1000
-characters, so consider using one of the other values instead.
-
-In the case of "7bit"/"8bit", long lines are automatically chopped to
-legal length; in the case of "7bit", all 8-bit characters are
-automatically I<removed>. This may not be what you want, so pick your
-encoding well! For more info, see L<"A MIME PRIMER">.
-
-=item FH
-
-I<Alternative to "Data" or "Path".>
-Filehandle containing the data, opened for reading.
-See "ReadNow" also.
-
-=item Filename
-
-I<Optional.>
-The name of the attachment. You can use this to supply a
-recommended filename for the end-user who is saving the attachment
-to disk. You only need this if the filename at the end of the
-"Path" is inadequate, or if you're using "Data" instead of "Path".
-You should I<not> put path information in here (e.g., no "/"
-or "\" or ":" characters should be used).
-
-=item Id
-
-I<Optional.>
-Same as setting "content-id".
-
-=item Length
-
-I<Optional.>
-Set the content length explicitly. Normally, this header is automatically
-computed, but only under certain circumstances (see L<"Limitations">).
-
-=item Path
-
-I<Alternative to "Data" or "FH".>
-Path to a file containing the data... actually, it can be any open()able
-expression. If it looks like a path, the last element will automatically
-be treated as the filename.
-See "ReadNow" also.
-
-=item ReadNow
-
-I<Optional, for use with "Path".>
-If true, will open the path and slurp the contents into core now.
-This is useful if the Path points to a command and you don't want
-to run the command over and over if outputting the message several
-times. B<Fatal exception> raised if the open fails.
-
-=item Top
-
-I<Optional.>
-If defined, indicates whether or not this is a "top-level" MIME message.
-The parts of a multipart message are I<not> top-level.
-Default is true.
-
-=item Type
-
-I<Optional.>
-The MIME content type, or one of these special values (case-sensitive):
-
- "TEXT" means "text/plain"
- "BINARY" means "application/octet-stream"
- "AUTO" means attempt to guess from the filename, falling back
- to 'application/octet-stream'. This is good if you have
- MIME::Types on your system and you have no idea what
- file might be used for the attachment.
-
-The default is C<"TEXT">, but it will be C<"AUTO"> if you set
-$AUTO_CONTENT_TYPE to true (sorry, but you have to enable
-it explicitly, since we don't want to break code which depends
-on the old behavior).
-
-=back
-
-A picture being worth 1000 words (which
-is of course 2000 bytes, so it's probably more of an "icon" than a "picture",
-but I digress...), here are some examples:
-
- $msg = MIME::Lite->build(
- From => 'yelling at inter.com',
- To => 'stocking at fish.net',
- Subject => "Hi there!",
- Type => 'TEXT',
- Encoding => '7bit',
- Data => "Just a quick note to say hi!");
-
- $msg = MIME::Lite->build(
- From => 'dorothy at emerald-city.oz',
- To => 'gesundheit at edu.edu.edu',
- Subject => "A gif for U"
- Type => 'image/gif',
- Path => "/home/httpd/logo.gif");
-
- $msg = MIME::Lite->build(
- From => 'laughing at all.of.us',
- To => 'scarlett at fiddle.dee.de',
- Subject => "A gzipp'ed tar file",
- Type => 'x-gzip',
- Path => "gzip < /usr/inc/somefile.tar |",
- ReadNow => 1,
- Filename => "somefile.tgz");
-
-To show you what's really going on, that last example could also
-have been written:
-
- $msg = new MIME::Lite;
- $msg->build(Type => 'x-gzip',
- Path => "gzip < /usr/inc/somefile.tar |",
- ReadNow => 1,
- Filename => "somefile.tgz");
- $msg->add(From => "laughing at all.of.us");
- $msg->add(To => "scarlett at fiddle.dee.de");
- $msg->add(Subject => "A gzipp'ed tar file");
-
-=cut
-
-sub build {
- my $self = shift;
- my %params = @_;
- my @params = @_;
- my $key;
-
- ### Miko's note: reorganized to check for exactly one of Data, Path, or FH
- (defined($params{Data})+defined($params{Path})+defined($params{FH}) <= 1)
- or Carp::croak "supply exactly zero or one of (Data|Path|FH).\n";
-
- ### Create new instance, if necessary:
- ref($self) or $self = $self->new;
-
-
- ### CONTENT-TYPE....
- ###
-
- ### Get content-type or content-type-macro:
- my $type = ($params{Type} || ($AUTO_CONTENT_TYPE ? 'AUTO' : 'TEXT'));
-
- ### Interpret content-type-macros:
- if ($type eq 'TEXT') { $type = 'text/plain'; }
- elsif ($type eq 'BINARY') { $type = 'application/octet-stream' }
- elsif ($type eq 'AUTO') { $type = $self->suggest_type($params{Path}); }
-
- ### We now have a content-type; set it:
- $type = lc($type);
- $self->attr('content-type' => $type);
-
- ### Get some basic attributes from the content type:
- my $is_multipart = ($type =~ m{^(multipart)/}i);
-
- ### Add in the multipart boundary:
- if ($is_multipart) {
- my $boundary = gen_boundary();
- $self->attr('content-type.boundary' => $boundary);
- }
-
-
- ### CONTENT-ID...
- ###
- $self->attr('content-id' => $params{Id}) if defined($params{Id});
-
-
- ### DATA OR PATH...
- ### Note that we must do this *after* we get the content type,
- ### in case read_now() is invoked, since it needs the binmode().
-
- ### Get data, as...
- ### ...either literal data:
- if (defined($params{Data})) {
- $self->data($params{Data});
- }
- ### ...or a path to data:
- elsif (defined($params{Path})) {
- $self->path($params{Path}); ### also sets filename
- $self->read_now if $params{ReadNow};
- }
- ### ...or a filehandle to data:
- ### Miko's note: this part works much like the path routine just above,
- elsif (defined($params{FH})) {
- $self->fh($params{FH});
- $self->read_now if $params{ReadNow}; ### implement later
- }
-
-
- ### FILENAME... (added by Ian Smith <ian at safeway.dircon.co.uk> on 8/4/97)
- ### Need this to make sure the filename is added. The Filename
- ### attribute is ignored, otherwise.
- if (defined($params{Filename})) {
- $self->filename($params{Filename});
- }
-
-
- ### CONTENT-TRANSFER-ENCODING...
- ###
-
- ### Get it:
- my $enc = ($params{Encoding} ||
- ($AUTO_ENCODE and $self->suggest_encoding($type)) ||
- 'binary');
- $self->attr('content-transfer-encoding' => lc($enc));
-
- ### Sanity check:
- if ($type =~ m{^(multipart|message)/}) {
- ($enc =~ m{^(7bit|8bit|binary)\Z}) or
- Carp::croak("illegal MIME: ".
- "can't have encoding $enc with type $type\n");
- }
-
- ### CONTENT-DISPOSITION...
- ### Default is inline for single, none for multis:
- ###
- my $disp = ($params{Disposition} or ($is_multipart ? undef : 'inline'));
- $self->attr('content-disposition' => $disp);
-
- ### CONTENT-LENGTH...
- ###
- my $length;
- if (exists($params{Length})) { ### given by caller:
- $self->attr('content-length' => $params{Length});
- }
- else { ### compute it ourselves
- $self->get_length;
- }
-
- ### Init the top-level fields:
- my $is_top = defined($params{Top}) ? $params{Top} : 1;
- $self->top_level($is_top);
-
- ### Datestamp if desired:
- my $ds_wanted = $params{Datestamp};
- my $ds_defaulted = ($is_top and !exists($params{Datestamp}));
- if (($ds_wanted or $ds_defaulted) and !exists($params{Date})) {
- my ($u_wdy, $u_mon, $u_mdy, $u_time, $u_y4) =
- split /\s+/, gmtime().""; ### should be non-locale-dependent
- my $date = "$u_wdy, $u_mdy $u_mon $u_y4 $u_time UT";
- $self->add("date", $date);
- }
-
- ### Set message headers:
- my @paramz = @params;
- my $field;
- while (@paramz) {
- my ($tag, $value) = (shift(@paramz), shift(@paramz));
-
- ### Get tag, if a tag:
- if ($tag =~ /^-(.*)/) { ### old style, backwards-compatibility
- $field = lc($1);
- }
- elsif ($tag =~ /^(.*):$/) { ### new style
- $field = lc($1);
- }
- elsif (known_field($field = lc($tag))) { ### known field
- ### no-op
- }
- else { ### not a field:
- next;
- }
-
- ### Add it:
- $self->add($field, $value);
- }
-
- ### Done!
- $self;
-}
-
-=back
-
-=cut
-
-
-#==============================
-#==============================
-
-=head2 Setting/getting headers and attributes
-
-=over 4
-
-=cut
-
-#------------------------------
-#
-# top_level ONOFF
-#
-# Set/unset the top-level attributes and headers.
-# This affects "MIME-Version" and "X-Mailer".
-
-sub top_level {
- my ($self, $onoff) = @_;
- if ($onoff) {
- $self->attr('MIME-Version' => '1.0');
- my $uses = (@Uses ? ("(" . join("; ", @Uses) . ")") : '');
- $self->replace('X-Mailer' => "MIME::Lite $VERSION $uses")
- unless $VANILLA;
- }
- else {
- $self->attr('MIME-Version' => undef);
- $self->delete('X-Mailer');
- }
-}
-
-#------------------------------
-
-=item add TAG,VALUE
-
-I<Instance method.>
-Add field TAG with the given VALUE to the end of the header.
-The TAG will be converted to all-lowercase, and the VALUE
-will be made "safe" (returns will be given a trailing space).
-
-B<Beware:> any MIME fields you "add" will override any MIME
-attributes I have when it comes time to output those fields.
-Normally, you will use this method to add I<non-MIME> fields:
-
- $msg->add("Subject" => "Hi there!");
-
-Giving VALUE as an arrayref will cause all those values to be added.
-This is only useful for special multiple-valued fields like "Received":
-
- $msg->add("Received" => ["here", "there", "everywhere"]
-
-Giving VALUE as the empty string adds an invisible placeholder
-to the header, which can be used to suppress the output of
-the "Content-*" fields or the special "MIME-Version" field.
-When suppressing fields, you should use replace() instead of add():
-
- $msg->replace("Content-disposition" => "");
-
-I<Note:> add() is probably going to be more efficient than C<replace()>,
-so you're better off using it for most applications if you are
-certain that you don't need to delete() the field first.
-
-I<Note:> the name comes from Mail::Header.
-
-=cut
-
-sub add {
- my $self = shift;
- my $tag = lc(shift);
- my $value = shift;
-
- ### If a dangerous option, warn them:
- Carp::carp "Explicitly setting a MIME header field ($tag) is dangerous:\n".
- "use the attr() method instead.\n"
- if (is_mime_field($tag) && !$QUIET);
-
- ### Get array of clean values:
- my @vals = ((ref($value) and (ref($value) eq 'ARRAY'))
- ? @{$value}
- : ($value.''));
- map { s/\n/\n /g } @vals;
-
- ### Add them:
- foreach (@vals) {
- push @{$self->{Header}}, [$tag, $_];
- }
-}
-
-#------------------------------
-
-=item attr ATTR,[VALUE]
-
-I<Instance method.>
-Set MIME attribute ATTR to the string VALUE.
-ATTR is converted to all-lowercase.
-This method is normally used to set/get MIME attributes:
-
- $msg->attr("content-type" => "text/html");
- $msg->attr("content-type.charset" => "US-ASCII");
- $msg->attr("content-type.name" => "homepage.html");
-
-This would cause the final output to look something like this:
-
- Content-type: text/html; charset=US-ASCII; name="homepage.html"
-
-Note that the special empty sub-field tag indicates the anonymous
-first sub-field.
-
-Giving VALUE as undefined will cause the contents of the named
-subfield to be deleted.
-
-Supplying no VALUE argument just returns the attribute's value:
-
- $type = $msg->attr("content-type"); ### returns "text/html"
- $name = $msg->attr("content-type.name"); ### returns "homepage.html"
-
-=cut
-
-sub attr {
- my ($self, $attr, $value) = @_;
- $attr = lc($attr);
-
- ### Break attribute name up:
- my ($tag, $subtag) = split /\./, $attr;
- defined($subtag) or $subtag = '';
-
- ### Set or get?
- if (@_ > 2) { ### set:
- $self->{Attrs}{$tag} ||= {}; ### force hash
- delete $self->{Attrs}{$tag}{$subtag}; ### delete first
- if (defined($value)) { ### set...
- $value =~ s/[\r\n]//g; ### make clean
- $self->{Attrs}{$tag}{$subtag} = $value;
- }
- }
-
- ### Return current value:
- $self->{Attrs}{$tag}{$subtag};
-}
-
-sub _safe_attr {
- my ($self, $attr) = @_;
- my $v = $self->attr($attr);
- defined($v) ? $v : '';
-}
-
-#------------------------------
-
-=item delete TAG
-
-I<Instance method.>
-Delete field TAG with the given VALUE to the end of the header.
-The TAG will be converted to all-lowercase.
-
- $msg->delete("Subject");
-
-I<Note:> the name comes from Mail::Header.
-
-=cut
-
-sub delete {
- my $self = shift;
- my $tag = lc(shift);
-
- ### Delete from the header:
- my $hdr = [];
- my $field;
- foreach $field (@{$self->{Header}}) {
- push @$hdr, $field if ($field->[0] ne $tag);
- }
- $self->{Header} = $hdr;
- $self;
-}
-
-
-#------------------------------
-
-=item field_order FIELD,...FIELD
-
-I<Class/instance method.>
-Change the order in which header fields are output for this object:
-
- $msg->field_order('from', 'to', 'content-type', 'subject');
-
-When used as a class method, changes the default settings for
-all objects:
-
- MIME::Lite->field_order('from', 'to', 'content-type', 'subject');
-
-Case does not matter: all field names will be coerced to lowercase.
-In either case, supply the empty array to restore the default ordering.
-
-=cut
-
-sub field_order {
- my $self = shift;
- if (ref($self)) { $self->{FieldOrder} = [ map { lc($_) } @_ ] }
- else { @FieldOrder = map { lc($_) } @_ }
-}
-
-#------------------------------
-
-=item fields
-
-I<Instance method.>
-Return the full header for the object, as a ref to an array
-of C<[TAG, VALUE]> pairs, where each TAG is all-lowercase.
-Note that any fields the user has explicitly set will override the
-corresponding MIME fields that we would otherwise generate.
-So, don't say...
-
- $msg->set("Content-type" => "text/html; charset=US-ASCII");
-
-unless you want the above value to override the "Content-type"
-MIME field that we would normally generate.
-
-I<Note:> I called this "fields" because the header() method of
-Mail::Header returns something different, but similar enough to
-be confusing.
-
-You can change the order of the fields: see L</field_order>.
-You really shouldn't need to do this, but some people have to
-deal with broken mailers.
-
-=cut
-
-sub fields {
- my $self = shift;
- my @fields;
-
- ### Get a lookup-hash of all *explicitly-given* fields:
- my %explicit = map { $_->[0] => 1 } @{$self->{Header}};
-
- ### Start with any MIME attributes not given explicitly:
- my $tag;
- foreach $tag (sort keys %{$self->{Attrs}}) {
-
- ### Skip if explicit:
- next if ($explicit{$tag});
-
- ### Skip if no subtags:
- my @subtags = keys %{$self->{Attrs}{$tag}};
- @subtags or next;
-
- ### Create string:
- my $value;
- defined($value = $self->{Attrs}{$tag}{''}) or next; ### need default
- foreach (sort @subtags) {
- next if ($_ eq '');
- $value .= qq{; $_="$self->{Attrs}{$tag}{$_}"};
- }
-
- ### Add to running fields;
- push @fields, [$tag, $value];
- }
-
- ### Add remaining fields (note that we duplicate the array for safety):
- foreach (@{$self->{Header}}) {
- push @fields, [@{$_}];
- }
-
- ### Final step:
- ### If a suggested ordering was given, we "sort" by that ordering.
- ### The idea is that we give each field a numeric rank, which is
- ### (1000 * order(field)) + origposition.
- my @order = @{$self->{FieldOrder} || []}; ### object-specific
- @order or @order = @FieldOrder; ### no? maybe generic
- if (@order) { ### either?
-
- ### Create hash mapping field names to 1-based rank:
- my %rank = map {$order[$_] => (1+$_)} (0..$#order);
-
- ### Create parallel array to @fields, called @ranked.
- ### It contains fields tagged with numbers like 2003, where the
- ### 3 is the original 0-based position, and 2000 indicates that
- ### we wanted ths type of field to go second.
- my @ranked = map {
- [
- ($_ + 1000*($rank{lc($fields[$_][0])} || (2+$#order))),
- $fields[$_]
- ]
- } (0..$#fields);
- # foreach (@ranked) {
- # print STDERR "RANKED: $_->[0] $_->[1][0] $_->[1][1]\n";
- # }
-
- ### That was half the Schwartzian transform. Here's the rest:
- @fields = map { $_->[1] }
- sort { $a->[0] <=> $b->[0] }
- @ranked;
- }
-
- ### Done!
- return \@fields;
-}
-
-
-#------------------------------
-
-=item filename [FILENAME]
-
-I<Instance method.>
-Set the filename which this data will be reported as.
-This actually sets both "standard" attributes.
-
-With no argument, returns the filename as dictated by the
-content-disposition.
-
-=cut
-
-sub filename {
- my ($self, $filename) = @_;
- if (@_ > 1) {
- $self->attr('content-type.name' => $filename);
- $self->attr('content-disposition.filename' => $filename);
- }
- $self->attr('content-disposition.filename');
-}
-
-#------------------------------
-
-=item get TAG,[INDEX]
-
-I<Instance method.>
-Get the contents of field TAG, which might have been set
-with set() or replace(). Returns the text of the field.
-
- $ml->get('Subject', 0);
-
-If the optional 0-based INDEX is given, then we return the INDEX'th
-occurence of field TAG. Otherwise, we look at the context:
-In a scalar context, only the first (0th) occurence of the
-field is returned; in an array context, I<all> occurences are returned.
-
-I<Warning:> this should only be used with non-MIME fields.
-Behavior with MIME fields is TBD, and will raise an exception for now.
-
-=cut
-
-sub get {
- my ($self, $tag, $index) = @_;
- $tag = lc($tag);
- Carp::croak "get: can't be used with MIME fields\n" if is_mime_field($tag);
-
- my @all = map { ($_->[0] eq $tag) ? $_->[1] : ()} @{$self->{Header}};
- (defined($index) ? $all[$index] : (wantarray ? @all : $all[0]));
-}
-
-#------------------------------
-
-=item get_length
-
-I<Instance method.>
-Recompute the content length for the message I<if the process is trivial>,
-setting the "content-length" attribute as a side-effect:
-
- $msg->get_length;
-
-Returns the length, or undefined if not set.
-
-I<Note:> the content length can be difficult to compute, since it
-involves assembling the entire encoded body and taking the length
-of it (which, in the case of multipart messages, means freezing
-all the sub-parts, etc.).
-
-This method only sets the content length to a defined value if the
-message is a singlepart with C<"binary"> encoding, I<and> the body is
-available either in-core or as a simple file. Otherwise, the content
-length is set to the undefined value.
-
-Since content-length is not a standard MIME field anyway (that's right, kids:
-it's not in the MIME RFCs, it's an HTTP thing), this seems pretty fair.
-
-=cut
-
-#----
-# Miko's note: I wasn't quite sure how to handle this, so I waited to hear
-# what you think. Given that the content-length isn't always required,
-# and given the performance cost of calculating it from a file handle,
-# I thought it might make more sense to add some some sort of computelength
-# property. If computelength is false, then the length simply isn't
-# computed. What do you think?
-#
-# Eryq's reply: I agree; for now, we can silently leave out the content-type.
-
-sub get_length {
- my $self = shift;
-
- my $is_multipart = ($self->attr('content-type') =~ m{^multipart/}i);
- my $enc = lc($self->attr('content-transfer-encoding') || 'binary');
- my $length;
- if (!$is_multipart && ($enc eq "binary")){ ### might figure it out cheap:
- if (defined($self->{Data})) { ### it's in core
- $length = length($self->{Data});
- }
- elsif (defined($self->{FH})) { ### it's in a filehandle
- ### no-op: it's expensive, so don't bother
- }
- elsif (defined($self->{Path})) { ### it's a simple file!
- $length = (-s $self->{Path}) if (-e $self->{Path});
- }
- }
- $self->attr('content-length' => $length);
- return $length;
-}
-
-#------------------------------
-
-=item parts
-
-I<Instance method.>
-Return the parts of this entity, and this entity only.
-Returns empty array if this entity has no parts.
-
-This is B<not> recursive! Parts can have sub-parts; use
-parts_DFS() to get everything.
-
-=cut
-
-sub parts {
- my $self = shift;
- @{$self->{Parts} || []};
-}
-
-#------------------------------
-
-=item parts_DFS
-
-I<Instance method.>
-Return the list of all MIME::Lite objects included in the entity,
-starting with the entity itself, in depth-first-search order.
-If this object has no parts, it alone will be returned.
-
-=cut
-
-sub parts_DFS {
- my $self = shift;
- return ($self, map { $_->parts_DFS } $self->parts);
-}
-
-#------------------------------
-
-=item preamble [TEXT]
-
-I<Instance method.>
-Get/set the preamble string, assuming that this object has subparts.
-Set it to undef for the default string.
-
-=cut
-
-sub preamble {
- my $self = shift;
- $self->{Preamble} = shift if @_;
- $self->{Preamble};
-}
-
-#------------------------------
-
-=item replace TAG,VALUE
-
-I<Instance method.>
-Delete all occurences of fields named TAG, and add a new
-field with the given VALUE. TAG is converted to all-lowercase.
-
-B<Beware> the special MIME fields (MIME-version, Content-*):
-if you "replace" a MIME field, the replacement text will override
-the I<actual> MIME attributes when it comes time to output that field.
-So normally you use attr() to change MIME fields and add()/replace() to
-change I<non-MIME> fields:
-
- $msg->replace("Subject" => "Hi there!");
-
-Giving VALUE as the I<empty string> will effectively I<prevent> that
-field from being output. This is the correct way to suppress
-the special MIME fields:
-
- $msg->replace("Content-disposition" => "");
-
-Giving VALUE as I<undefined> will just cause all explicit values
-for TAG to be deleted, without having any new values added.
-
-I<Note:> the name of this method comes from Mail::Header.
-
-=cut
-
-sub replace {
- my ($self, $tag, $value) = @_;
- $self->delete($tag);
- $self->add($tag, $value) if defined($value);
-}
-
-
-#------------------------------
-
-=item scrub
-
-I<Instance method.>
-B<This is Alpha code. If you use it, please let me know how it goes.>
-Recursively goes through the "parts" tree of this message and tries
-to find MIME attributes that can be removed.
-With an array argument, removes exactly those attributes; e.g.:
-
- $msg->scrub(['content-disposition', 'content-length']);
-
-Is the same as recursively doing:
-
- $msg->replace('Content-disposition' => '');
- $msg->replace('Content-length' => '');
-
-=cut
-
-sub scrub {
- my ($self, @a) = @_;
- my ($expl) = @a;
- local $QUIET = 1;
-
- ### Scrub me:
- if (!@a) { ### guess
-
- ### Scrub length always:
- $self->replace('content-length', '');
-
- ### Scrub disposition if no filename, or if content-type has same info:
- if (!$self->_safe_attr('content-disposition.filename') ||
- $self->_safe_attr('content-type.name')) {
- $self->replace('content-disposition', '');
- }
-
- ### Scrub encoding if effectively unencoded:
- if ($self->_safe_attr('content-transfer-encoding') =~
- /^(7bit|8bit|binary)$/i) {
- $self->replace('content-transfer-encoding', '');
- }
-
- ### Scrub charset if US-ASCII:
- if ($self->_safe_attr('content-type.charset') =~ /^(us-ascii)/i) {
- $self->attr('content-type.charset' => undef);
- }
-
- ### TBD: this is not really right for message/digest:
- if ((keys %{$self->{Attrs}{'content-type'}} == 1) and
- ($self->_safe_attr('content-type') eq 'text/plain')) {
- $self->replace('content-type', '');
- }
- }
- elsif ($expl and (ref($expl) eq 'ARRAY')) {
- foreach (@{$expl}) { $self->replace($_, ''); }
- }
-
- ### Scrub my kids:
- foreach (@{$self->{Parts}}) { $_->scrub(@a); }
-}
-
-=back
-
-=cut
-
-
-#==============================
-#==============================
-
-=head2 Setting/getting message data
-
-=over 4
-
-=cut
-
-#------------------------------
-
-=item binmode [OVERRIDE]
-
-I<Instance method.>
-With no argument, returns whether or not it thinks that the data
-(as given by the "Path" argument of C<build()>) should be read using
-binmode() (for example, when C<read_now()> is invoked).
-
-The default behavior is that any content type other than
-C<text/*> or C<message/*> is binmode'd; this should in general work fine.
-
-With a defined argument, this method sets an explicit "override"
-value. An undefined argument unsets the override.
-The new current value is returned.
-
-=cut
-
-sub binmode {
- my $self = shift;
- $self->{Binmode} = shift if (@_); ### argument? set override
- return (defined($self->{Binmode})
- ? $self->{Binmode}
- : ($self->attr("content-type") !~ m{^(text|message)/}i));
-}
-
-#------------------------------
-
-=item data [DATA]
-
-I<Instance method.>
-Get/set the literal DATA of the message. The DATA may be
-either a scalar, or a reference to an array of scalars (which
-will simply be joined).
-
-I<Warning:> setting the data causes the "content-length" attribute
-to be recomputed (possibly to nothing).
-
-=cut
-
-sub data {
- my $self = shift;
- if (@_) {
- $self->{Data} = ((ref($_[0]) eq 'ARRAY') ? join('', @{$_[0]}) : $_[0]);
- $self->get_length;
- }
- $self->{Data};
-}
-
-#------------------------------
-
-=item fh [FILEHANDLE]
-
-I<Instance method.>
-Get/set the FILEHANDLE which contains the message data.
-
-Takes a filehandle as an input and stores it in the object.
-This routine is similar to path(); one important difference is that
-no attempt is made to set the content length.
-
-=cut
-
-sub fh {
- my $self = shift;
- $self->{FH} = shift if @_;
- $self->{FH};
-}
-
-#------------------------------
-
-=item path [PATH]
-
-I<Instance method.>
-Get/set the PATH to the message data.
-
-I<Warning:> setting the path recomputes any existing "content-length" field,
-and re-sets the "filename" (to the last element of the path if it
-looks like a simple path, and to nothing if not).
-
-=cut
-
-sub path {
- my $self = shift;
- if (@_) {
-
- ### Set the path, and invalidate the content length:
- $self->{Path} = shift;
-
- ### Re-set filename, extracting it from path if possible:
- my $filename;
- if ($self->{Path} and ($self->{Path} !~ /\|$/)) { ### non-shell path:
- ($filename = $self->{Path}) =~ s/^<//;
-
- ### Consult File::Basename, maybe:
- if ($HaveFileBasename) {
- $filename = File::Basename::basename($filename);
- }
- else {
- ($filename) = ($filename =~ m{([^\/]+)\Z});
- }
- }
- $self->filename($filename);
-
- ### Reset the length:
- $self->get_length;
- }
- $self->{Path};
-}
-
-#------------------------------
-
-=item resetfh [FILEHANDLE]
-
-I<Instance method.>
-Set the current position of the filehandle back to the beginning.
-Only applies if you used "FH" in build() or attach() for this message.
-
-Returns false if unable to reset the filehandle (since not all filehandles
-are seekable).
-
-=cut
-
-#----
-# Miko's note: With the Data and Path, the same data could theoretically
-# be reused. However, file handles need to be reset to be reused,
-# so I added this routine.
-#
-# Eryq reply: beware... not all filehandles are seekable (think about STDIN)!
-
-sub resetfh {
- my $self = shift;
- seek($self->{FH},0,0);
-}
-
-#------------------------------
-
-=item read_now
-
-I<Instance method.>
-Forces data from the path/filehandle (as specified by C<build()>)
-to be read into core immediately, just as though you had given it
-literally with the C<Data> keyword.
-
-Note that the in-core data will always be used if available.
-
-Be aware that everything is slurped into a giant scalar: you may not want
-to use this if sending tar files! The benefit of I<not> reading in the data
-is that very large files can be handled by this module if left on disk
-until the message is output via C<print()> or C<print_body()>.
-
-=cut
-
-sub read_now {
- my $self = shift;
- local $/ = undef;
-
- if ($self->{FH}) { ### data from a filehandle:
- my $chunk;
- my @chunks;
- CORE::binmode($self->{FH}) if $self->binmode;
- while (read($self->{FH}, $chunk, 1024)) {
- push @chunks, $chunk;
- }
- $self->{Data} = join '', @chunks;
- }
- elsif ($self->{Path}) { ### data from a path:
- open SLURP, $self->{Path} or Carp::croak "open $self->{Path}: $!\n";
- CORE::binmode(SLURP) if $self->binmode;
- $self->{Data} = <SLURP>; ### sssssssssssssslurp...
- close SLURP; ### ...aaaaaaaaahhh!
- }
-}
-
-#------------------------------
-
-=item sign PARAMHASH
-
-I<Instance method.>
-Sign the message. This forces the message to be read into core,
-after which the signature is appended to it.
-
-=over 4
-
-=item Data
-
-As in C<build()>: the literal signature data.
-Can be either a scalar or a ref to an array of scalars.
-
-=item Path
-
-As in C<build()>: the path to the file.
-
-=back
-
-If no arguments are given, the default is:
-
- Path => "$ENV{HOME}/.signature"
-
-The content-length is recomputed.
-
-=cut
-
-sub sign {
- my $self = shift;
- my %params = @_;
-
- ### Default:
- @_ or $params{Path} = "$ENV{HOME}/.signature";
-
- ### Force message in-core:
- defined($self->{Data}) or $self->read_now;
-
- ### Load signature:
- my $sig;
- if (!defined($sig = $params{Data})) { ### not given explicitly:
- local $/ = undef;
- open SIG, $params{Path} or Carp::croak "open sig $params{Path}: $!\n";
- $sig = <SIG>; ### sssssssssssssslurp...
- close SIG; ### ...aaaaaaaaahhh!
- }
- $sig = join('',@$sig) if (ref($sig) and (ref($sig) eq 'ARRAY'));
-
- ### Append, following Internet conventions:
- $self->{Data} .= "\n-- \n$sig";
-
- ### Re-compute length:
- $self->get_length;
- 1;
-}
-
-#------------------------------
-#
-# =item suggest_encoding CONTENTTYPE
-#
-# I<Class/instance method.>
-# Based on the CONTENTTYPE, return a good suggested encoding.
-# C<text> and C<message> types have their bodies scanned line-by-line
-# for 8-bit characters and long lines; lack of either means that the
-# message is 7bit-ok. Other types are chosen independent of their body:
-#
-# Major type: 7bit ok? Suggested encoding:
-# ------------------------------------------------------------
-# text yes 7bit
-# no quoted-printable
-# unknown binary
-#
-# message yes 7bit
-# no binary
-# unknown binary
-#
-# multipart n/a binary (in case some parts are not ok)
-#
-# (other) n/a base64
-#
-#=cut
-
-sub suggest_encoding {
- my ($self, $ctype) = @_;
- $ctype = lc($ctype);
-
- ### Consult MIME::Types, maybe:
- if ($HaveMimeTypes) {
-
- ### Mappings contain [suffix,mimetype,encoding]
- my @mappings = MIME::Types::by_mediatype($ctype);
- if (scalar(@mappings)) {
- ### Just pick the first one:
- my ($suffix, $mimetype, $encoding) = @{$mappings[0]};
- if ($encoding &&
- $encoding =~/^(base64|binary|[78]bit|quoted-printable)$/i) {
- return lc($encoding); ### sanity check
- }
- }
- }
-
- ### If we got here, then MIME::Types was no help.
- ### Extract major type:
- my ($type) = split '/', $ctype;
- if (($type eq 'text') || ($type eq 'message')) { ### scan message body?
- return 'binary';
- }
- else {
- return ($type eq 'multipart') ? 'binary' : 'base64';
- }
-}
-
-#------------------------------
-#
-# =item suggest_type PATH
-#
-# I<Class/instance method.>
-# Suggest the content-type for this attached path.
-# We always fall back to "application/octet-stream" if no good guess
-# can be made, so don't use this if you don't mean it!
-#
-sub suggest_type {
- my ($self, $path) = @_;
-
- ### If there's no path, bail:
- $path or return 'application/octet-stream';
-
- ### Consult MIME::Types, maybe:
- if ($HaveMimeTypes) {
- # Mappings contain [mimetype,encoding]:
- my ($mimetype, $encoding) = MIME::Types::by_suffix($path);
- return $mimetype if ($mimetype && $mimetype =~ /^\S+\/\S+$/); ### sanity check
- }
- ### If we got here, then MIME::Types was no help.
- ### The correct thing to fall back to is the most-generic content type:
- return 'application/octet-stream';
-}
-
-#------------------------------
-
-=item verify_data
-
-I<Instance method.>
-Verify that all "paths" to attached data exist, recursively.
-It might be a good idea for you to do this before a print(), to
-prevent accidental partial output if a file might be missing.
-Raises exception if any path is not readable.
-
-=cut
-
-sub verify_data {
- my $self = shift;
-
- ### Verify self:
- my $path = $self->{Path};
- if ($path and ($path !~ /\|$/)) { ### non-shell path:
- $path =~ s/^<//;
- (-r $path) or die "$path: not readable\n";
- }
-
- ### Verify parts:
- foreach my $part (@{$self->{Parts}}) { $part->verify_data }
- 1;
-}
-
-=back
-
-=cut
-
-
-#==============================
-#==============================
-
-=head2 Output
-
-=over 4
-
-=cut
-
-#------------------------------
-
-=item print [OUTHANDLE]
-
-I<Instance method.>
-Print the message to the given output handle, or to the currently-selected
-filehandle if none was given.
-
-All OUTHANDLE has to be is a filehandle (possibly a glob ref), or
-any object that responds to a print() message.
-
-=cut
-
-sub print {
- my ($self, $out) = @_;
-
- ### Coerce into a printable output handle:
- $out = wrap MIME::Lite::IO_Handle $out;
-
- ### Output head, separator, and body:
- $self->verify_data if $AUTO_VERIFY; ### prevents missing parts!
- $out->print($self->header_as_string, "\n");
- $self->print_body($out);
-}
-
-#------------------------------
-#
-# print_for_smtp
-#
-# Instance method, private.
-# Print, but filter out the topmost "Bcc" field.
-# This is because qmail apparently doesn't do this for us!
-#
-sub print_for_smtp {
- my ($self, $out) = @_;
-
- ### Coerce into a printable output handle:
- $out = wrap MIME::Lite::IO_Handle $out;
-
- ### Create a safe head:
- my @fields = grep { $_->[0] ne 'bcc' } @{$self->fields};
- my $header = $self->fields_as_string(\@fields);
-
- ### Output head, separator, and body:
- $out->print($header, "\n");
- $self->print_body($out);
-}
-
-#------------------------------
-
-=item print_body [OUTHANDLE]
-
-I<Instance method.>
-Print the body of a message to the given output handle, or to
-the currently-selected filehandle if none was given.
-
-All OUTHANDLE has to be is a filehandle (possibly a glob ref), or
-any object that responds to a print() message.
-
-B<Fatal exception> raised if unable to open any of the input files,
-or if a part contains no data, or if an unsupported encoding is
-encountered.
-
-=cut
-
-sub print_body {
- my ($self, $out) = @_;
-
- ### Coerce into a printable output handle:
- $out = wrap MIME::Lite::IO_Handle $out;
-
- ### Output either the body or the parts.
- ### Notice that we key off of the content-type! We expect fewer
- ### accidents that way, since the syntax will always match the MIME type.
- my $type = $self->attr('content-type');
- if ($type =~ m{^multipart/}i) {
- my $boundary = $self->attr('content-type.boundary');
-
- ### Preamble:
- $out->print(defined($self->{Preamble})
- ? $self->{Preamble}
- : "This is a multi-part message in MIME format.\n");
-
- ### Parts:
- my $part;
- foreach $part (@{$self->{Parts}}) {
- $out->print("\n--$boundary\n");
- $part->print($out);
- }
-
- ### Epilogue:
- $out->print("\n--$boundary--\n\n");
- }
- elsif ($type =~ m{^message/}) {
- my @parts = @{$self->{Parts}};
-
- ### It's a toss-up; try both data and parts:
- if (@parts == 0) { $self->print_simple_body($out) }
- elsif (@parts == 1) { $parts[0]->print($out) }
- else { Carp::croak "can't handle message with >1 part\n"; }
- }
- else {
- $self->print_simple_body($out);
- }
- 1;
-}
-
-#------------------------------
-#
-# print_simple_body [OUTHANDLE]
-#
-# I<Instance method, private.>
-# Print the body of a simple singlepart message to the given
-# output handle, or to the currently-selected filehandle if none
-# was given.
-#
-# Note that if you want to print "the portion after
-# the header", you don't want this method: you want
-# L<print_body()|/print_body>.
-#
-# All OUTHANDLE has to be is a filehandle (possibly a glob ref), or
-# any object that responds to a print() message.
-#
-# B<Fatal exception> raised if unable to open any of the input files,
-# or if a part contains no data, or if an unsupported encoding is
-# encountered.
-#
-sub print_simple_body {
- my ($self, $out) = @_;
-
- ### Coerce into a printable output handle:
- $out = wrap MIME::Lite::IO_Handle $out;
-
- ### Get content-transfer-encoding:
- my $encoding = uc($self->attr('content-transfer-encoding'));
-
- ### Notice that we don't just attempt to slurp the data in from a file:
- ### by processing files piecemeal, we still enable ourselves to prepare
- ### very large MIME messages...
-
- ### Is the data in-core? If so, blit it out...
- if (defined($self->{Data})) {
- DATA:
- { local $_ = $encoding;
-
- /^BINARY$/ and do {
- $out->print($self->{Data});
- last DATA;
- };
- /^8BIT$/ and do {
- $out->print(encode_8bit($self->{Data}));
- last DATA;
- };
- /^7BIT$/ and do {
- $out->print(encode_7bit($self->{Data}));
- last DATA;
- };
- /^QUOTED-PRINTABLE$/ and do {
- ### UNTAINT since m//mg on tainted data loops forever:
- my ($untainted) = ($self->{Data} =~ m/\A(.*)\Z/s);
-
- ### Encode it line by line:
- while ($untainted =~ m{^(.*[\r\n]*)}mg) {
- $out->print(encode_qp($1)); ### have to do it line by line...
- }
- last DATA;
- };
- /^BASE64/ and do {
- $out->print(encode_base64($self->{Data}));
- last DATA;
- };
- Carp::croak "unsupported encoding: `$_'\n";
- }
- }
-
- ### Else, is the data in a file? If so, output piecemeal...
- ### Miko's note: this routine pretty much works the same with a path
- ### or a filehandle. the only difference in behaviour is that it does
- ### not attempt to open anything if it already has a filehandle
- elsif (defined($self->{Path}) || defined($self->{FH})) {
- no strict 'refs'; ### in case FH is not an object
- my $DATA;
-
- ### Open file if necessary:
- if (defined($self->{Path})) {
- $DATA = new FileHandle || Carp::croak "can't get new filehandle\n";
- $DATA->open("$self->{Path}") or
- Carp::croak "open $self->{Path}: $!\n";
- }
- else {
- $DATA=$self->{FH};
- }
- CORE::binmode($DATA) if $self->binmode;
-
- ### Encode piece by piece:
- PATH:
- { local $_ = $encoding;
-
- /^BINARY$/ and do {
- $out->print($_) while read($DATA, $_, 2048);
- last PATH;
- };
- /^8BIT$/ and do {
- $out->print(encode_8bit($_)) while (<$DATA>);
- last PATH;
- };
- /^7BIT$/ and do {
- $out->print(encode_7bit($_)) while (<$DATA>);
- last PATH;
- };
- /^QUOTED-PRINTABLE$/ and do {
- $out->print(encode_qp($_)) while (<$DATA>);
- last PATH;
- };
- /^BASE64$/ and do {
- $out->print(encode_base64($_)) while (read($DATA, $_, 45));
- last PATH;
- };
- Carp::croak "unsupported encoding: `$_'\n";
- }
-
- ### Close file:
- close $DATA if defined($self->{Path});
- }
-
- else {
- Carp::croak "no data in this part\n";
- }
- 1;
-}
-
-#------------------------------
-
-=item print_header [OUTHANDLE]
-
-I<Instance method.>
-Print the header of the message to the given output handle,
-or to the currently-selected filehandle if none was given.
-
-All OUTHANDLE has to be is a filehandle (possibly a glob ref), or
-any object that responds to a print() message.
-
-=cut
-
-sub print_header {
- my ($self, $out) = @_;
-
- ### Coerce into a printable output handle:
- $out = wrap MIME::Lite::IO_Handle $out;
-
- ### Output the header:
- $out->print($self->header_as_string);
- 1;
-}
-
-#------------------------------
-
-=item as_string
-
-I<Instance method.>
-Return the entire message as a string, with a header and an encoded body.
-
-=cut
-
-sub as_string {
- my $self = shift;
- my $buf = [];
- my $io = (wrap MIME::Lite::IO_ScalarArray $buf);
- $self->print($io);
- join '', @$buf;
-}
-*stringify = \&as_string; ### backwards compatibility
-*stringify = \&as_string; ### ...twice to avoid warnings :)
-
-#------------------------------
-
-=item body_as_string
-
-I<Instance method.>
-Return the encoded body as a string.
-This is the portion after the header and the blank line.
-
-I<Note:> actually prepares the body by "printing" to a scalar.
-Proof that you can hand the C<print*()> methods any blessed object
-that responds to a C<print()> message.
-
-=cut
-
-sub body_as_string {
- my $self = shift;
- my $buf = [];
- my $io = (wrap MIME::Lite::IO_ScalarArray $buf);
- $self->print_body($io);
- join '', @$buf;
-}
-*stringify_body = \&body_as_string; ### backwards compatibility
-*stringify_body = \&body_as_string; ### ...twice to avoid warnings :)
-
-#------------------------------
-#
-# fields_as_string FIELDS
-#
-# PRIVATE! Return a stringified version of the given header
-# fields, where FIELDS is an arrayref like that returned by fields().
-#
-sub fields_as_string {
- my ($self, $fields) = @_;
- my @lines;
- foreach (@$fields) {
- my ($tag, $value) = @$_;
- next if ($value eq ''); ### skip empties
- $tag =~ s/\b([a-z])/uc($1)/ge; ### make pretty
- $tag =~ s/^mime-/MIME-/ig; ### even prettier
- push @lines, "$tag: $value\n";
- }
- join '', @lines;
-}
-
-#------------------------------
-
-=item header_as_string
-
-I<Instance method.>
-Return the header as a string.
-
-=cut
-
-sub header_as_string {
- my $self = shift;
- $self->fields_as_string($self->fields);
-}
-*stringify_header = \&header_as_string; ### backwards compatibility
-*stringify_header = \&header_as_string; ### ...twice to avoid warnings :)
-
-=back
-
-=cut
-
-
-
-#==============================
-#==============================
-
-=head2 Sending
-
-=over 4
-
-=cut
-
-#------------------------------
-
-=item send
-
-=item send HOW, HOWARGS...
-
-I<Class/instance method.>
-This is the principal method for sending mail, and for configuring
-how mail will be sent.
-
-I<As a class method> with a HOW argument and optional HOWARGS, it sets
-the default sending mechanism that the no-argument instance method
-will use. The HOW is a facility name (B<see below>),
-and the HOWARGS is interpreted by the facilty.
-The class method returns the previous HOW and HOWARGS as an array.
-
- MIME::Lite->send('sendmail', "d:\\programs\\sendmail.exe");
- ...
- $msg = MIME::Lite->new(...);
- $msg->send;
-
-I<As an instance method with arguments>
-(a HOW argument and optional HOWARGS), sends the message in the
-requested manner; e.g.:
-
- $msg->send('sendmail', "d:\\programs\\sendmail.exe");
-
-I<As an instance method with no arguments,> sends the message by
-the default mechanism set up by the class method.
-Returns whatever the mail-handling routine returns: this should be true
-on success, false/exception on error:
-
- $msg = MIME::Lite->new(From=>...);
- $msg->send || die "you DON'T have mail!";
-
-On Unix systems (at least), the default setting is equivalent to:
-
- MIME::Lite->send("sendmail", "/usr/lib/sendmail -t -oi -oem");
-
-There are three facilities:
-
-=over 4
-
-=item "sendmail", ARGS...
-
-Send a message by piping it into the "sendmail" command.
-Uses the L<send_by_sendmail()|/send_by_sendmail> method, giving it the ARGS.
-This usage implements (and deprecates) the C<sendmail()> method.
-
-=item "smtp", [HOSTNAME]
-
-Send a message by SMTP, using optional HOSTNAME as SMTP-sending host.
-Uses the L<send_by_smtp()|/send_by_smtp> method.
-
-=item "sub", \&SUBREF, ARGS...
-
-Sends a message MSG by invoking the subroutine SUBREF of your choosing,
-with MSG as the first argument, and ARGS following.
-
-=back
-
-I<For example:> let's say you're on an OS which lacks the usual Unix
-"sendmail" facility, but you've installed something a lot like it, and
-you need to configure your Perl script to use this "sendmail.exe" program.
-Do this following in your script's setup:
-
- MIME::Lite->send('sendmail', "d:\\programs\\sendmail.exe");
-
-Then, whenever you need to send a message $msg, just say:
-
- $msg->send;
-
-That's it. Now, if you ever move your script to a Unix box, all you
-need to do is change that line in the setup and you're done.
-All of your $msg-E<gt>send invocations will work as expected.
-
-=cut
-
-sub send {
- my $self = shift;
-
- if (ref($self)) { ### instance method:
- my ($method, @args);
- if (@_) { ### args; use them just this once
- $method = 'send_by_' . shift;
- @args = @_;
- }
- else { ### no args; use defaults
- $method = "send_by_$Sender";
- @args = @{$SenderArgs{$Sender} || []};
- }
- $self->verify_data if $AUTO_VERIFY; ### prevents missing parts!
- return $self->$method(@args);
- }
- else { ### class method:
- if (@_) {
- my @old = ($Sender, @{$SenderArgs{$Sender}});
- $Sender = shift;
- $SenderArgs{$Sender} = [@_]; ### remaining args
- return @old;
- }
- else {
- Carp::croak "class method send must have HOW... arguments\n";
- }
- }
-}
-
-#------------------------------
-
-=item send_by_sendmail SENDMAILCMD
-
-=item send_by_sendmail PARAM=>VALUE, ...
-
-I<Instance method.>
-Send message via an external "sendmail" program
-(this will probably only work out-of-the-box on Unix systems).
-
-Returns true on success, false or exception on error.
-
-You can specify the program and all its arguments by giving a single
-string, SENDMAILCMD. Nothing fancy is done; the message is simply
-piped in.
-
-However, if your needs are a little more advanced, you can specify
-zero or more of the following PARAM/VALUE pairs; a Unix-style,
-taint-safe "sendmail" command will be constructed for you:
-
-=over 4
-
-=item Sendmail
-
-Full path to the program to use.
-Default is "/usr/lib/sendmail".
-
-=item BaseArgs
-
-Ref to the basic array of arguments we start with.
-Default is C<["-t", "-oi", "-oem"]>.
-
-=item SetSender
-
-Unless this is I<explicitly> given as false, we attempt to automatically
-set the C<-f> argument to the first address that can be extracted from
-the "From:" field of the message (if there is one).
-
-I<What is the -f, and why do we use it?>
-Suppose we did I<not> use C<-f>, and you gave an explicit "From:"
-field in your message: in this case, the sendmail "envelope" would
-indicate the I<real> user your process was running under, as a way
-of preventing mail forgery. Using the C<-f> switch causes the sender
-to be set in the envelope as well.
-
-I<So when would I NOT want to use it?>
-If sendmail doesn't regard you as a "trusted" user, it will permit
-the C<-f> but also add an "X-Authentication-Warning" header to the message
-to indicate a forged envelope. To avoid this, you can either
-(1) have SetSender be false, or
-(2) make yourself a trusted user by adding a C<T> configuration
- command to your I<sendmail.cf> file
- (e.g.: C<Teryq> if the script is running as user "eryq").
-
-=item FromSender
-
-If defined, this is identical to setting SetSender to true,
-except that instead of looking at the "From:" field we use
-the address given by this option.
-Thus:
-
- FromSender => 'me at myhost.com'
-
-=back
-
-=cut
-
-sub send_by_sendmail {
- my $self = shift;
-
- if (@_ == 1) { ### Use the given command...
- my $sendmailcmd = shift @_;
-
- ### Do it:
- open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n";
- $self->print(\*SENDMAIL);
- close SENDMAIL;
- return (($? >> 8) ? undef : 1);
- }
- else { ### Build the command...
- my %p = @_;
- $p{Sendmail} ||= "/usr/lib/sendmail";
-
- ### Start with the command and basic args:
- my @cmd = ($p{Sendmail}, @{$p{BaseArgs} || ['-t', '-oi', '-oem']});
-
- ### See if we are forcibly setting the sender:
- $p{SetSender} = 1 if defined($p{FromSender});
-
- ### Add the -f argument, unless we're explicitly told NOT to:
- unless (exists($p{SetSender}) and !$p{SetSender}) {
- my $from = $p{FromSender} || ($self->get('From'))[0];
- if ($from) {
- my ($from_addr) = extract_addrs($from);
- push @cmd, "-f$from_addr" if $from_addr;
- }
- }
-
- ### Open the command in a taint-safe fashion:
- my $pid = open SENDMAIL, "|-";
- defined($pid) or die "open of pipe failed: $!\n";
- if (!$pid) { ### child
- exec(@cmd) or die "can't exec $p{Sendmail}: $!\n";
- ### NOTREACHED
- }
- else { ### parent
- $self->print(\*SENDMAIL);
- close SENDMAIL || die "error closing $p{Sendmail}: $! (exit $?)\n";
- return 1;
- }
- }
-}
-
-#------------------------------
-
-=item send_by_smtp ARGS...
-
-I<Instance method.>
-Send message via SMTP, using Net::SMTP.
-The optional ARGS are sent into Net::SMTP::new(): usually, these are
-
- MAILHOST, OPTION=>VALUE, ...
-
-Note that the list of recipients is taken from the
-"To", "Cc" and "Bcc" fields.
-
-Returns true on success, false or exception on error.
-
-=cut
-
-### Provided by Andrew McRae. Version 0.2 anm 09Sep97
-### Copyright 1997 Optimation New Zealand Ltd.
-### May be modified/redistributed under the same terms as Perl.
-#
-sub send_by_smtp {
- my ($self, @args) = @_;
-
- ### We need the "From:" and "To:" headers to pass to the SMTP mailer:
- my $hdr = $self->fields();
- my $from = $self->get('From');
- my $to = $self->get('To');
-
- ### Sanity check:
- defined($to) or Carp::croak "send_by_smtp: missing 'To:' address\n";
-
- ### Get the destinations as a simple array of addresses:
- my @to_all = extract_addrs($to);
- if ($AUTO_CC) {
- foreach my $field (qw(Cc Bcc)) {
- my $value = $self->get($field);
- push @to_all, extract_addrs($value) if defined($value);
- }
- }
-
- ### Create SMTP client:
- require Net::SMTP;
- my $smtp = MIME::Lite::SMTP->new(@args)
- or Carp::croak("Failed to connect to mail server: $!\n");
- $smtp->mail($from)
- or Carp::croak("SMTP MAIL command failed: $!\n".$smtp->message."\n");
- $smtp->to(@to_all)
- or Carp::croak("SMTP RCPT command failed: $!\n".$smtp->message."\n");
- $smtp->data()
- or Carp::croak("SMTP DATA command failed: $!\n".$smtp->message."\n");
-
- ### MIME::Lite can print() to anything with a print() method:
- $self->print_for_smtp($smtp);
- $smtp->dataend();
- $smtp->quit;
- 1;
-}
-
-#------------------------------
-#
-# send_by_sub [\&SUBREF, [ARGS...]]
-#
-# I<Instance method, private.>
-# Send the message via an anonymous subroutine.
-#
-sub send_by_sub {
- my ($self, $subref, @args) = @_;
- &$subref($self, @args);
-}
-
-#------------------------------
-
-=item sendmail COMMAND...
-
-I<Class method, DEPRECATED.>
-Declare the sender to be "sendmail", and set up the "sendmail" command.
-I<You should use send() instead.>
-
-=cut
-
-sub sendmail {
- my $self = shift;
- $self->send('sendmail', join(' ', @_));
-}
-
-=back
-
-=cut
-
-
-
-#==============================
-#==============================
-
-=head2 Miscellaneous
-
-=over 4
-
-=cut
-
-#------------------------------
-
-=item quiet ONOFF
-
-I<Class method.>
-Suppress/unsuppress all warnings coming from this module.
-
- MIME::Lite->quiet(1); ### I know what I'm doing
-
-I recommend that you include that comment as well. And while
-you type it, say it out loud: if it doesn't feel right, then maybe
-you should reconsider the whole line. C<;-)>
-
-=cut
-
-sub quiet {
- my $class = shift;
- $QUIET = shift if @_;
- $QUIET;
-}
-
-=back
-
-=cut
-
-
-
-#============================================================
-
-package MIME::Lite::SMTP;
-
-#============================================================
-# This class just adds a print() method to Net::SMTP.
-# Notice that we don't use/require it until it's needed!
-
-use strict;
-use vars qw( @ISA );
- at ISA = qw(Net::SMTP);
-
-sub print { shift->datasend(@_) }
-
-
-
-#============================================================
-
-package MIME::Lite::IO_Handle;
-
-#============================================================
-
-### Wrap a non-object filehandle inside a blessed, printable interface:
-### Does nothing if the given $fh is already a blessed object.
-sub wrap {
- my ($class, $fh) = @_;
- no strict 'refs';
-
- ### Get default, if necessary:
- $fh or $fh = select; ### no filehandle means selected one
- ref($fh) or $fh = \*$fh; ### scalar becomes a globref
-
- ### Stop right away if already a printable object:
- return $fh if (ref($fh) and (ref($fh) ne 'GLOB'));
-
- ### Get and return a printable interface:
- bless \$fh, $class; ### wrap it in a printable interface
-}
-
-### Print:
-sub print {
- my $self = shift;
- print {$$self} @_;
-}
-
-
-#============================================================
-
-package MIME::Lite::IO_Scalar;
-
-#============================================================
-
-### Wrap a scalar inside a blessed, printable interface:
-sub wrap {
- my ($class, $scalarref) = @_;
- defined($scalarref) or $scalarref = \"";
- bless $scalarref, $class;
-}
-
-### Print:
-sub print {
- my $self = shift;
- $$self .= join('', @_);
- 1;
-}
-
-
-#============================================================
-
-package MIME::Lite::IO_ScalarArray;
-
-#============================================================
-
-### Wrap an array inside a blessed, printable interface:
-sub wrap {
- my ($class, $arrayref) = @_;
- defined($arrayref) or $arrayref = [];
- bless $arrayref, $class;
-}
-
-### Print:
-sub print {
- my $self = shift;
- push @$self, @_;
- 1;
-}
-
-1;
-__END__
-
-
-#============================================================
-
-=head1 NOTES
-
-
-=head2 How do I prevent "Content" headers from showing up in my mail reader?
-
-Apparently, some people are using mail readers which display the MIME
-headers like "Content-disposition", and they want MIME::Lite not
-to generate them "because they look ugly".
-
-Sigh.
-
-Y'know, kids, those headers aren't just there for cosmetic purposes.
-They help ensure that the message is I<understood> correctly by mail
-readers. But okay, you asked for it, you got it...
-here's how you can suppress the standard MIME headers.
-Before you send the message, do this:
-
- $msg->scrub;
-
-You can scrub() any part of a multipart message independently;
-just be aware that it works recursively. Before you scrub,
-note the rules that I follow:
-
-=over 4
-
-=item Content-type
-
-You can safely scrub the "content-type" attribute if, and only if,
-the part is of type "text/plain" with charset "us-ascii".
-
-=item Content-transfer-encoding
-
-You can safely scrub the "content-transfer-encoding" attribute
-if, and only if, the part uses "7bit", "8bit", or "binary" encoding.
-You are far better off doing this if your lines are under 1000
-characters. Generally, that means you I<can> scrub it for plain
-text, and you can I<not> scrub this for images, etc.
-
-=item Content-disposition
-
-You can safely scrub the "content-disposition" attribute
-if you trust the mail reader to do the right thing when it decides
-whether to show an attachment inline or as a link. Be aware
-that scrubbing both the content-disposition and the content-type
-means that there is no way to "recommend" a filename for the attachment!
-
-B<Note:> there are reports of brain-dead MUAs out there that
-do the wrong thing if you I<provide> the content-disposition.
-If your attachments keep showing up inline or vice-versa,
-try scrubbing this attribute.
-
-=item Content-length
-
-You can always scrub "content-length" safely.
-
-=back
-
-=head2 How do I give my attachment a [different] recommended filename?
-
-By using the Filename option (which is different from Path!):
-
- $msg->attach(Type => "image/gif",
- Path => "/here/is/the/real/file.GIF",
- Filename => "logo.gif");
-
-You should I<not> put path information in the Filename.
-
-=head2 Benign limitations
-
-This is "lite", after all...
-
-=over 4
-
-=item *
-
-There's no parsing. Get MIME-tools if you need to parse MIME messages.
-
-=item *
-
-MIME::Lite messages are currently I<not> interchangeable with
-either Mail::Internet or MIME::Entity objects. This is a completely
-separate module.
-
-=item *
-
-A content-length field is only inserted if the encoding is binary,
-the message is a singlepart, and all the document data is available
-at C<build()> time by virtue of residing in a simple path, or in-core.
-Since content-length is not a standard MIME field anyway (that's right, kids:
-it's not in the MIME RFCs, it's an HTTP thing), this seems pretty fair.
-
-=item *
-
-MIME::Lite alone cannot help you lose weight. You must supplement
-your use of MIME::Lite with a healthy diet and exercise.
-
-=back
-
-
-=head2 Cheap and easy mailing
-
-I thought putting in a default "sendmail" invocation wasn't too bad an
-idea, since a lot of Perlers are on UNIX systems.
-The out-of-the-box configuration is:
-
- MIME::Lite->send('sendmail', "/usr/lib/sendmail -t -oi -oem");
-
-By the way, these arguments to sendmail are:
-
- -t Scan message for To:, Cc:, Bcc:, etc.
-
- -oi Do NOT treat a single "." on a line as a message terminator.
- As in, "-oi vey, it truncated my message... why?!"
-
- -oem On error, mail back the message (I assume to the
- appropriate address, given in the header).
- When mail returns, circle is complete. Jai Guru Deva -oem.
-
-Note that these are the same arguments you get if you configure to use
-the smarter, taint-safe mailing:
-
- MIME::Lite->send('sendmail');
-
-If you get "X-Authentication-Warning" headers from this, you can forgo
-diddling with the envelope by instead specifying:
-
- MIME::Lite->send('sendmail', SetSender=>0);
-
-And, if you're not on a Unix system, or if you'd just rather send mail
-some other way, there's always:
-
- MIME::Lite->send('smtp', "smtp.myisp.net");
-
-Or you can set up your own subroutine to call.
-In any case, check out the L<send()|/send> method.
-
-
-
-=head1 WARNINGS
-
-=head2 Good-vs-bad email addresses with send_by_smtp()
-
-If using L<send_by_smtp()|/send_by_smtp>, be aware that you are
-forcing MIME::Lite to extract email addresses out of a possible list
-provided in the C<To:>, C<Cc:>, and C<Bcc:> fields. This is tricky
-stuff, and as such only the following sorts of addresses will work
-reliably:
-
- username
- full.name at some.host.com
- "Name, Full" <full.name at some.host.com>
-
-This last form is discouraged because SMTP must be able to get
-at the I<name> or I<name at domain> portion.
-
-B<Disclaimer:>
-MIME::Lite was never intended to be a Mail User Agent, so please
-don't expect a full implementation of RFC-822. Restrict yourself to
-the common forms of Internet addresses described herein, and you should
-be fine. If this is not feasible, then consider using MIME::Lite
-to I<prepare> your message only, and using Net::SMTP explicitly to
-I<send> your message.
-
-
-=head2 Formatting of headers delayed until print()
-
-This class treats a MIME header in the most abstract sense,
-as being a collection of high-level attributes. The actual
-RFC-822-style header fields are not constructed until it's time
-to actually print the darn thing.
-
-
-=head2 Encoding of data delayed until print()
-
-When you specify message bodies
-(in L<build()|/build> or L<attach()|/attach>) --
-whether by B<FH>, B<Data>, or B<Path> -- be warned that we don't
-attempt to open files, read filehandles, or encode the data until
-L<print()|/print> is invoked.
-
-In the past, this created some confusion for users of sendmail
-who gave the wrong path to an attachment body, since enough of
-the print() would succeed to get the initial part of the message out.
-Nowadays, $AUTO_VERIFY is used to spot-check the Paths given before
-the mail facility is employed. A whisker slower, but tons safer.
-
-Note that if you give a message body via FH, and try to print()
-a message twice, the second print() will not do the right thing
-unless you explicitly rewind the filehandle.
-
-You can get past these difficulties by using the B<ReadNow> option,
-provided that you have enough memory to handle your messages.
-
-
-=head2 MIME attributes are separate from header fields!
-
-B<Important:> the MIME attributes are stored and manipulated separately
-from the message header fields; when it comes time to print the
-header out, I<any explicitly-given header fields override the ones that
-would be created from the MIME attributes.> That means that this:
-
- ### DANGER ### DANGER ### DANGER ### DANGER ### DANGER ###
- $msg->add("Content-type", "text/html; charset=US-ASCII");
-
-will set the exact C<"Content-type"> field in the header I write,
-I<regardless of what the actual MIME attributes are.>
-
-I<This feature is for experienced users only,> as an escape hatch in case
-the code that normally formats MIME header fields isn't doing what
-you need. And, like any escape hatch, it's got an alarm on it:
-MIME::Lite will warn you if you attempt to C<set()> or C<replace()>
-any MIME header field. Use C<attr()> instead.
-
-
-=head2 Beware of lines consisting of a single dot
-
-Julian Haight noted that MIME::Lite allows you to compose messages
-with lines in the body consisting of a single ".".
-This is true: it should be completely harmless so long as "sendmail"
-is used with the -oi option (see L<"Cheap and easy mailing">).
-
-However, I don't know if using Net::SMTP to transfer such a message
-is equally safe. Feedback is welcomed.
-
-My perspective: I don't want to magically diddle with a user's
-message unless absolutely positively necessary.
-Some users may want to send files with "." alone on a line;
-my well-meaning tinkering could seriously harm them.
-
-
-=head2 Infinite loops may mean tainted data!
-
-Stefan Sautter noticed a bug in 2.106 where a m//gc match was
-failing due to tainted data, leading to an infinite loop inside
-MIME::Lite.
-
-I am attempting to correct for this, but be advised that my fix will
-silently untaint the data (given the context in which the problem
-occurs, this should be benign: I've labelled the source code with
-UNTAINT comments for the curious).
-
-So: don't depend on taint-checking to save you from outputting
-tainted data in a message.
-
-
-=head2 Don't tweak the global configuration
-
-Global configuration variables are bad, and should go away.
-Until they do, please follow the hints with each setting
-on how I<not> to change it.
-
-=head1 A MIME PRIMER
-
-=head2 Content types
-
-The "Type" parameter of C<build()> is a I<content type>.
-This is the actual type of data you are sending.
-Generally this is a string of the form C<"majortype/minortype">.
-
-Here are the major MIME types.
-A more-comprehensive listing may be found in RFC-2046.
-
-=over 4
-
-=item application
-
-Data which does not fit in any of the other categories, particularly
-data to be processed by some type of application program.
-C<application/octet-stream>, C<application/gzip>, C<application/postscript>...
-
-=item audio
-
-Audio data.
-C<audio/basic>...
-
-=item image
-
-Graphics data.
-C<image/gif>, C<image/jpeg>...
-
-=item message
-
-A message, usually another mail or MIME message.
-C<message/rfc822>...
-
-=item multipart
-
-A message containing other messages.
-C<multipart/mixed>, C<multipart/alternative>...
-
-=item text
-
-Textual data, meant for humans to read.
-C<text/plain>, C<text/html>...
-
-=item video
-
-Video or video+audio data.
-C<video/mpeg>...
-
-=back
-
-
-=head2 Content transfer encodings
-
-The "Encoding" parameter of C<build()>.
-This is how the message body is packaged up for safe transit.
-
-Here are the 5 major MIME encodings.
-A more-comprehensive listing may be found in RFC-2045.
-
-=over 4
-
-=item 7bit
-
-Basically, no I<real> encoding is done. However, this label guarantees that no
-8-bit characters are present, and that lines do not exceed 1000 characters
-in length.
-
-=item 8bit
-
-Basically, no I<real> encoding is done. The message might contain 8-bit
-characters, but this encoding guarantees that lines do not exceed 1000
-characters in length.
-
-=item binary
-
-No encoding is done at all. Message might contain 8-bit characters,
-and lines might be longer than 1000 characters long.
-
-The most liberal, and the least likely to get through mail gateways.
-Use sparingly, or (better yet) not at all.
-
-=item base64
-
-Like "uuencode", but very well-defined. This is how you should send
-essentially binary information (tar files, GIFs, JPEGs, etc.).
-
-=item quoted-printable
-
-Useful for encoding messages which are textual in nature, yet which contain
-non-ASCII characters (e.g., Latin-1, Latin-2, or any other 8-bit alphabet).
-
-=back
-
-=cut
-
-=begin FOR_README_ONLY
-
-=head1 INSTALLATION
-
-Install using
-
- perl makefile.pl
- make test
- make install
-
-Adjust the make command as is appropriate for your OS.
-'nmake' is the usual name under Win32
-
-In order to read the docmentation please use
-
- perldoc MIME::Lite
-
-from the command line or visit
-
- http://search.cpan.org/search?query=MIME%3A%3ALite&mode=all
-
-for a list of all MIME::Lite related materials including the
-documentation in HTML of all of the released versions of
-MIME::Lite.
-
-=cut
-
-=end FOR_README_ONLY
-
-=cut
-
-=head1 HELPER MODULES
-
-MIME::Lite works nicely with other certain other modules if they are present.
-Good to have installed is the latest L<MIME::Types|MIME::Types>,
-L<Mail::Address|Mail::Address>, L<MIME::Base64|MIME::Base64>,
-L<MIME::QuotedPrint|MIME::QuotedPrint>.
-
-If they aren't present then some functionality won't work, and other features
-wont be as efficient or up to date as they could be. Nevertheless they are optional
-extras.
-
-=head1 BUNDLED GOODIES
-
-MIME::Lite comes with a number of extra files in the distribution bundle.
-This includes examples, and utility modules that you can use to get yourself
-started with the module.
-
-The ./examples directory contains a number of snippets in prepared
-form, generally they are documented, but they should be easy to understand.
-
-The ./contrib directory contains a companion/tool modules that come bundled
-with MIME::Lite, they dont get installed by default. Please review the POD they
-come with.
-
-=head1 BUGS
-
-The whole reason that version 3.0 was released was to ensure that MIME::Lite
-is up to date and patched. If you find an issue please report it.
-
-As far as I know MIME::Lite doesnt currently have any serious bugs, but my usage
-is hardly comprehensive.
-
-Having said that there are a number of open issues for me, mostly caused by the progress
-in the community as whole since Eryq last released. The tests are based around an
-interesting but non standard test framework. I'd like to change it over to using
-Test::More.
-
-Should tests fail please review the ./testout directory, and in any bug reports
-please include the output of the relevent file. This is the only redeeming feature
-of not using Test::More that I can see.
-
-Bug fixes / Patches / Contribution are welcome, however I probably won't apply them
-unless they also have an associated test. This means that if I dont have the time to
-write the test the patch wont get applied, so please, include tests for any patches
-you provide.
-
-=head1 VERSION
-
-Version: 3.01 (Maintenance release and a new caretaker!)
-
-=head1 CHANGE LOG
-
-Moved to ./changes.pod
-
-=head1 TERMS AND CONDITIONS
-
- Copyright (c) 1997 by Eryq.
- Copyright (c) 1998 by ZeeGee Software Inc.
- Copyright (c) 2003 Yves Orton. demerphq (at) hotmail.com.
-
-All rights reserved. This program is free software; you can
-redistribute it and/or modify it under the same terms as Perl
-itself.
-
-This software comes with B<NO WARRANTY> of any kind.
-See the COPYING file in the distribution for details.
-
-=head1 NUTRITIONAL INFORMATION
-
-For some reason, the US FDA says that this is now required by law
-on any products that bear the name "Lite"...
-
-Version 3.0 is now new and improved! The distribution is now 30% smaller!
-
- MIME::Lite |
- ------------------------------------------------------------
- Serving size: | 1 module
- Servings per container: | 1
- Calories: | 0
- Fat: | 0g
- Saturated Fat: | 0g
-
-Warning: for consumption by hardware only! May produce
-indigestion in humans if taken internally.
-
-=head1 AUTHOR
-
-Eryq (F<eryq at zeegee.com>).
-President, ZeeGee Software Inc. (F<http://www.zeegee.com>).
-
-Go to F<http://www.zeegee.com> for the latest downloads
-and on-line documentation for this module. Enjoy.
-
-Patches And Maintenance by Yves Orton demerphq at hotmail.com and many others. Consult
-./changes.pod
-
-=cut
-
Copied: packages/libmime-lite-perl/tags/debian_version_3_01-6/lib/MIME/Lite.pm (from rev 1722, packages/libmime-lite-perl/trunk/lib/MIME/Lite.pm)
More information about the Pkg-perl-cvs-commits
mailing list