Browse Source

first commit

Peter Siegrist 5 years ago
commit
6b19807ac3
2 changed files with 384 additions and 0 deletions
  1. 0 0
      README.md
  2. 384 0
      mailit

+ 0 - 0
README.md


+ 384 - 0
mailit

@@ -0,0 +1,384 @@
+#!/usr/bin/perl
+#
+# mailit
+#
+# Copyright (c) 1998, 2016 by Peter_Siegrist(SystemLoesungen)  (PSS@ZweierNet.ch)
+# 
+# All Rights reserved.
+# This program is free software; you can redistribute it and/or 
+# modify it under the terms of the GNU General Public License as 
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+# GNU General Public License for more details.    
+#
+ 
+#----------------------------------------------
+#-- INITIAL SETTINGS TO BE MODIFIED BY USERS
+#----------------------------------------------
+ 
+BEGIN { 
+#-- Set Path to MIME::Lite Module if not in @INC
+#-- i.e. $MIME_LITE_PATH = "/home/myhome/lib/";
+#-- uncomment both of the next two lines therefor 
+ 
+#    $MIME_LITE_PATH = "$ENV{HOME}/lib/";    # <=== here we are
+#    unshift( @INC, "$MIME_LITE_PATH" ) 
+}
+ 
+#-- Set Host / Domain Part of email Address: name@$DOMAIN_NAME
+#-- i.e. $DOMAIN_NAME   = "myhost.ch";
+$DOMAIN_NAME   = "yourdomail.tld";                  # <=== here we are
+ 
+#-- END INITIAL SETTINGS
+ 
+ 
+#----------------------------------------------
+#-- Modules
+#----------------------------------------------
+ 
+use MIME::Lite;
+use Getopt::Std;
+ 
+ 
+#----------------------------------------------
+#-- VAR's
+#----------------------------------------------
+ 
+ 
+$body   = "";
+ 
+my %mimes = (	'.doc'  => 'application/msword',
+				'.rtf'  => 'application/rtf',
+    			'.xls'  => 'application/excel',
+    			'.xlt'  => 'application/excel',
+    			'.pps'  => 'application/pps',
+    			'.ppt'  => 'application/ppt',
+    			'.pot'  => 'application/pot',
+    			'.fmx'  => 'application/x-framemaker',
+    			'.ai '  => 'application/postscript',
+    			'.eps'  => 'application/postscript',
+    			'.ps '  => 'application/postscript',
+    			'.sxw'  => 'application/msword',
+    			'.odt'	=> 'application/vnd.oasis.opendocument.text',
+    			'.ods'	=> 'application/vnd.oasis.opendocument.spreadsheet',
+    			'.odp'	=> 'application/vnd.oasis.opendocument.presentation',
+    			'.odg'	=> 'application/vnd.oasis.opendocument.graphics',
+    			'.odc'	=> 'application/vnd.oasis.opendocument.chart',
+    			'.odb'	=> 'application/vnd.oasis.opendocument.database',
+    			'.odm'	=> 'application/vnd.oasis.opendocument.text-master',
+    			'.odf'	=> 'application/vnd.oasis.opendocument.formula',
+    			'.html' => 'text/html',
+    			'.htm'  => 'text/html',
+				'.xml'  => 'text/xml',
+				'.xsl'  => 'text/xml',
+    			'.jpg'  => 'image/jpeg',
+    			'.jpeg' => 'image/jpeg',
+    			'.jpe'  => 'image/jpeg',
+    			'.png'  => 'image/png',
+    			'.gif'  => 'image/gif',
+    			'.bmp'  => 'image/bmp',
+    			'.tiff' => 'image/tif',
+    			'.tif'  => 'image/tif',
+    			'.xbm'  => 'image/x-xbitmap',
+    			'.zip'  => 'application/zip',
+    			'.Z'  => 'application/x-tar',
+    			'.gz'  => 'application/x-tar',
+    			'.tar'  => 'application/x-tar',
+			    '.pcap'  => 'application/pcap',
+    			'.hqx'  => 'application/mac-binhex40',
+    			'.pdf'  => 'application/pdf'
+);
+ 
+ 
+ 
+#----------------------------------------------
+#-- SUB's
+#----------------------------------------------
+ 
+sub usage {
+    print "usage: $0 \n\t-f [<from>] \n\t-t <to>\t\t\tList possible\n\t-c [<cc>]\t\tList possible\n\t-s [<subject>] \n\t-m [<mime-type:filename>] \teg. application/pdf:doc.pdf\n\t-a [<attachment>]\tComma separated list of files to attach (no spaces)\n\t-p\t\t\tread body data from STDIN if set\n\t-h help\n\t-H Manual Page\n";
+}
+ 
+ 
+#----------------------------------------------
+#-- MAIN
+#----------------------------------------------
+ 
+#----------------------------------------------
+#-- get options:
+#----------------------------------------------
+ 
+#       -f      <from>
+#       -t      <to>
+#       -c      [<cc>]          comma separated
+#       -s      <subject>
+#       -a      <attachment(s)> comma separated
+#       -m      <mime-type:filename>     eg. application/pdf:attachmentpdf
+#       -b      <body text if -m is used>
+#       -p      read from pipe if set
+#       -h      help
+#       -H      manpage
+ 
+getopt('tscafmb');
+ 
+my $p      		= 0;
+my $from 		= "$ENV{USER}@$DOMAIN_NAME";
+my $subject		= "No Subject";
+my $to			= undef;
+my $cc			= "";
+my $ifile       = "";
+my $imime       = "";
+my @attachment	= ();
+ 
+$opt_h	&& do 	{	&usage;
+				  	exit;
+				};
+$opt_H	&& do	{	while ( <DATA> ) { print; }
+					exit; 
+				};
+$opt_f	&& do	{	$from = $opt_f;
+				};
+$opt_s	&& do	{	$subject = $opt_s;
+				};
+$opt_c	&& do	{	$cc = $opt_c;
+				};
+$opt_m  && do   {   ($imime, $ifile) = split ':', $opt_m;
+                };
+$opt_b  && do   {   $itext = $opt_b;
+                };
+$opt_a	&& do	{	@attachment = split ',', $opt_a;
+				};
+$opt_p	&& do	{	$p = 1;
+				};
+if ( $opt_t	)	{   $to = $opt_t;
+	} else {
+		print "missing mandatory argument: -t\n";
+    	&usage;
+    	exit;
+}
+ 
+ 
+ 
+#----------------------------------------------
+#-- read body from stdin  ( if option p is set )
+#----------------------------------------------
+ 
+if ( $p == 1 ) {
+    while ( <STDIN> ) {
+        last if /^\.$/;     # Finish input with single dot line
+        $body .= $_;
+    }
+}
+ 
+ 
+#----------------------------------------------
+#-- create mime object
+#----------------------------------------------
+ 
+chomp($to);
+chomp($from);
+ 
+$m      = MIME::Lite->new(
+                From    => $from,
+                To      => $to,
+                Subject => $subject,
+                Type    => 'multipart/mixed');
+ 
+if ( $opt_m ) {
+    attach $m   Type        => 'TEXT',
+                Encoding    => 'quoted-printable',
+                Data        => "$itext";
+    attach $m
+            	Type        => $imime,
+            	Encoding    => 'quoted-printable',
+            	Disposition => 'attachment',
+            	Data        => $body,
+            	Filename    => "$ifile";
+} else {
+	attach $m   Type 		=> 'TEXT',
+				Encoding    => 'quoted-printable',
+	            Data 		=> $body;
+}
+ 
+if ( $cc ) {
+    $m->add( Cc => $cc );
+}
+ 
+ 
+ 
+#----------------------------------------------
+#-- parse filetyp / attach files
+#----------------------------------------------
+ 
+while ( defined( $att = shift @attachment ) ) {
+	my ($ftyp) = ($att =~ /.+(\.\w{1,4})$/i);
+	$ftyp = lc $ftyp;
+	if ( exists $mimes{$ftyp} ) {
+		if ( $mimes{$ftyp} =~ /text\// ) {
+			attach $m
+        		Type        => $mimes{$ftyp},
+        		Encoding    => 'quoted-printable',
+        		Disposition => 'attachment',
+        		Path        => "$att";
+    		next;
+    	} else {
+    		attach $m
+        		Type        => $mimes{$ftyp},
+        		Disposition => 'attachment',
+        		Path        => "$att";
+    		next;
+		}
+	} else {
+		attach $m
+        	Type        => 'text/plain',
+        	Encoding    => 'base64',
+        	Disposition => 'attachment',
+        	Path        => "$att";
+        next;
+    }	
+}
+ 
+ 
+ 
+ 
+#----------------------------------------------
+#-- send message
+#----------------------------------------------
+ 
+$m->send;
+ 
+ 
+ 
+ 
+__END__
+ 
+NAME
+    mailit - send mail to users, including attachments
+ 
+SYNOPSIS
+    mailit  [ -hH ]  
+            -t recipient,...  [ -f sender ]  [ -c recipient,... ] 
+            [ -a attachment,... ] [ -m mime-type:filename ] [ -b body text if -m ] [ -s subject ] [ -p ]
+ 
+DESCRIPTION
+    mailit is a front end to send mails including attachments from 
+    the command line. It uses sendmail to deliver the message to the
+    corret place. mailit is based on MIME::Lite from ZeeGee Software
+    Inc.
+ 
+    With -p flag set it reads from standard input up to an EOF or a
+    single dot line. That means it can read some data through a Unix
+    Pipe till EOF or, if you prefere read in interactively, terminate
+    input with a single dot in the line. In interactive mode mailit
+    will prompt you for the body.
+    The data you entered this way will be sent as the body of the mail
+    setting text/plain as Content-Type.
+ 
+    mailit determines the 'sender address' from both the environment 
+    variable HOME for the 'user' part as well as the source setting
+    $DOMAIN_NAME as 'domain'.
+ 
+ 
+OPTIONS
+    -t recipient,...
+        email address(es) of the recipient(s). If more than one separate
+        by commas. (the To: Field)
+ 
+    -f sender
+        sender of the email if you not want to determine it by mailit.
+        (The From: Field)
+ 
+    -c recipient
+        one or more CC: addresses. (The CC: Field)
+ 
+    -a attachment
+        one or more comma separated file names to be attached to the
+        mail. see below for further discussion.
+ 
+    -m mime-type:filename
+        the mime-type and the filename of the document. This is mainly used for
+        situations where you pipe (-p) a document into mailit without any
+        information about the mime-type. 
+        Mail recipients get the piped data as attachment of type 'mime-type'
+        with name 'filename'. Use the -b parameter to give the body a text.
+ 
+    -b body text for -m
+        the body text if piping some data with -m and -p to the program .
+ 
+    -s subject
+        the subject of the mail. Quote it if you use Special Characters.
+        (The Subject: Field)
+ 
+    -p  mailit reads the body from standard input up to an EOF or, in
+        interactive mode up to a single dot line. Without the -p flag
+        mailit does not read nor send any body.
+ 
+    -h  help.
+ 
+    -H  man page like help.
+ 
+ 
+ATTACHMENTS
+    mailit knows some type of files so it can set the correct
+    Content-Type as well as the correct Encoding of the attachment.
+ 
+    Text Media Types are encoded as 'quoted-printable'  whereas other
+    known Media Types are encoded 'base64'.
+    You can expand the list of known Media Types by adding a 
+    'type => encoding' entry in the %mimes hash.
+ 
+    All unknown Media Types will be sent as 'text/plain' with 'binary'-Encoding.
+ 
+ 
+INSTALLATION
+    mailit uses the MIME::Lite Modul for creating Mail Headers. 
+    MIME::Lite for his part uses 'sendmail' to send the message.
+    Therefore you have to install 'sendmail' as well as the
+    MIME::Lite Modul from ZeeGee Software Inc. (www.zeegee.com).
+    If this modul can not be found in the @INC Array, that means you
+    do not have a standard installation of this module therefore you have to set
+    the path of the module in the INITIAL USER SETTINGS Part of the 
+    source script ($MIME_LITE_PATH). (see there).
+ 
+    In some cases mailit can not determine the correct Senders domain
+    name. If so, set the Senders domain name in the INITIAL USER 
+    SETTINGS Part of the source script ($DOMAIN_NAME). (see there).
+ 
+ 
+ENVIRONMENT VARIABLES
+    mailit takes the senders name (that is, the user part of the email
+    address (user@...) ) from the Environment Variable USER. Make sure
+    this variable is set correctly.
+ 
+ 
+EXAMPLES
+    To send just two Attachments. According to standard the Subject
+    in this case is set to 'No Subject'.
+ 
+        mailit -t shorty@host.ch -a /doc/file1.html,/doc/file2.tar.Z
+ 
+ 
+    Full use:
+ 
+        cat body.txt | mailit -t shorty@host.ch,secnd@addr.ch 
+            -f froma@host2.ch -a /doc/file1.html,/doc/file2.tar.Z 
+            -c cc1@addr.ch,cc2@addr.ch -p -s "This my Files"
+ 
+    -m and -b use:
+        somefile2pdf somefile.xxx | mailit -t shorty@host.ch -m "application/pdf:somefile.pdf" -b "Attached file for you" -p
+ 
+ 
+NOTES
+    mailit is a Perl Program. You will probably need Perl 5.005 or 
+    better as well as Mime-Lite 2.117 or better to run.
+ 
+    Suggestions are welcome.
+ 
+ 
+AUTHOR
+    Peter Siegrist http://PSS.ZweierNet.ch (pss@ZweierNet.ch)
+
+