]>
git.p6c8.net - selfforum.git/blob - selfforum-cgi/shared/Mail.pm
73166c9a00dc0c5173d92a776c57c223476292bf
3 ##############################################
5 # Autor: n.d.p. nd@o3media.de #
7 # Letze Aenderung: n.d.p. / 2001-01-03 #
9 # ========================================== #
12 # ganz simples Formatieren und Senden #
13 # einer Mail im text/plain, qp-Format #
15 ##############################################
21 use vars
qw($mailbox $mailprog @ISA @EXPORT);
29 @EXPORT = qw(is_mail_address send_mail);
31 ########################################
36 # Ueberpruefen der Syntax einer
41 ########################################
43 sub is_mail_address
($) {
44 return ($_[0] =~ /$mailbox/);
47 ########################################
52 # Senden der Nachricht
53 # ueber open-print-close
54 # $Mail::mailprog enthaelt
55 # den vollstaendigen string fuer
56 # open, dass heisst, es kann
57 # auch ein Dateiname sein.
61 ########################################
67 open MAIL
,$mailprog or return 0;
68 print MAIL
&as_string
($param);
69 close MAIL
and return 1;
71 # Hier muss irgendwas schiefgelaufen sein
75 ##########################################
80 # Bereitstellung der gesamten Mail
85 ##########################################
90 my $header=&header_as_string
($param);
91 my $body=&body_as_string
($param);
97 ##########################################
102 # Bereitstellung des Bodys
103 # als (qp-codierten) String.
107 ##########################################
112 &encode_qp
($param->{body
});
115 ##########################################
117 # sub header_as_string
120 # Bereitstellung des Headers
125 ##########################################
127 sub header_as_string
{
130 my $string="Content-Disposition: inline\n";
131 $string.="MIME-Version: 1.0\n";
132 $string.="Content-Transfer-Encoding: quoted-printable\n";
133 $string.="Content-Type: text/plain\n";
134 $string.="Date: ".&rfc822_date
(time)."\n";
135 $string.="From: ".$param->{'from'}."\n";
136 $string.=&get_list
('To',$param->{'to'});
137 $string.=&get_list
('Cc',$param->{'cc'});
138 $string.=&get_list
('Bcc',$param->{'bcc'});
139 $string.="Subject: ".encode_qp
($param->{'subject'})."\n";
145 #######################################
149 # C&P aus dem Modul MIME::QuotedPrint
151 #######################################
156 $res =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg; # rule #2,#3
158 join('', map { sprintf("=%02X", ord($_)) }
160 )/egm
; # rule #3 (encode whitespace at eol)
162 # rule #5 (lines must be shorter than 76 chars, but we are not allowed
163 # to break =XX escapes. This makes things complicated :-( )
164 my $brokenlines = "";
165 $brokenlines .= "$1=\n"
166 while $res =~ s
/(.*?
^[^\n]{73} (?
:
167 [^=\n]{2} (?
! [^=\n]{0,1} $) # 75 not followed by .?\n
168 |[^=\n] (?
! [^=\n]{0,2} $) # 74 not followed by .?.?\n
169 | (?
! [^=\n]{0,3} $) # 73 not followed by .?.?.?\n
175 ##############################################
180 # Aufbereitung einer Liste oder eines
181 # Strings fuer den Header (To, Cc, Bcc)
184 # Ergebnis oder nichts
185 ##############################################
188 my ($start,$list)=splice @_;
190 return $start . ': ' . $list . "\n" if (defined $list and not ref $list and length $list);
192 return $start . ': ' . join (', ',@
$list) . "\n" if (ref $list);
197 ##############################################
202 # Bereitstellung eines RFC-konformen
207 ##############################################
209 sub rfc822_date
($) {
210 my ($sek, $min, $std, $mtag, $mon, $jahr, $wtag) = gmtime (+shift);
212 sprintf ('%s, %02d %s %04d %02d:%02d:%02d GMT',
213 (qw(Sun Mon Tue Wed Thu Fri Sat))[$wtag],
215 (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec))[$mon],
216 $jahr+1900, $std, $min, $sek);
219 ##############################################
220 # Modulinitialisierung
224 # Bereitstellung des Regexps und des
226 ##############################################
229 # Standard-Mailprogramm
231 # Dieser String wird so, wie er ist, an die open-Anweisung geschickt,
232 # -t = tainted(?),der Header (=alles bis zur ersten Leerzeile)
233 # wird nach To:, Cc: und evtl. Bcc: abgesucht.
234 # -oi = damit wird verhindert, dass sendmail, ein Zeile, wo nur ein
235 # Punkt drinsteht, als Mailende erkennt( waere Standard ).
236 # ===================================================================
238 $mailprog = '|/usr/lib/sendmail -t -oi';
240 # Thanx to J. Friedl for this regex:
242 my ($address,$route_addr,$phrase,$addr_spec,$X,$phrase_char,$quoted_str,$comment,$word,$phrase_ctrl,$NonASCII,
243 $CloseBR,$OpenBR,$esc,$route,$domain,$local_part,$Period,$sub_domain,$domain_lit,$domain_ref,$quoted_pair,
244 $dtext,$atom,$qtext,$atom_char,$ctrl,$space,$tab,$CloseParen,$ctext,$Cnested,$OpenParen,$CRlist);
254 $NonASCII = '\x80-\xff';
257 $qtext = qq/[^$esc$NonASCII$CRlist\"]/;
258 $dtext = qq/[^$esc$NonASCII$CRlist$OpenBR$CloseBR]/;
259 $quoted_pair = qq< $esc [^$NonASCII] >;
260 $ctext = qq< [^$esc$NonASCII$CRlist()] >;
261 $Cnested = qq< $OpenParen $ctext* (?
: $quoted_pair $ctext* )* $CloseParen >;
262 $comment = qq< $OpenParen $ctext* (?
: (?
: $quoted_pair | $Cnested ) $ctext* )* $CloseParen >;
263 $X = qq< [$space$tab]* (?
: $comment [$space$tab]* )* >;
264 $atom_char = qq/[^($space)<>\@,;:\".$esc$OpenBR$CloseBR$ctrl$NonASCII]/;
265 $atom = qq< $atom_char+ (?
!$atom_char) >;
266 $quoted_str = qq< \" $qtext * (?
: $quoted_pair $qtext * )* \" >;
267 $word = qq< (?
: $atom | $quoted_str ) >;
269 $domain_lit = qq< $OpenBR (?
: $dtext | $quoted_pair )* $CloseBR >;
270 $sub_domain = qq< (?
: $domain_ref | $domain_lit ) $X >;
271 $domain = qq< $sub_domain (?
: $Period $X $sub_domain )* >;
272 $route = qq< \@
$X $domain (?
: , $X \@
$X $domain )* : $X >;
273 $local_part = qq< $word $X (?
: $Period $X $word $X )* >;
274 $addr_spec = qq< $local_part \@
$X $domain >;
275 $route_addr = qq[ < $X (?
: $route )?
$addr_spec > ];
276 $phrase_ctrl = '\000-\010\012-\037';
277 $phrase_char = qq/[^()<>\@,;:\".$esc$OpenBR$CloseBR$NonASCII$phrase_ctrl]/;
278 $phrase = qq< $word $phrase_char * (?
: (?
: $comment | $quoted_str ) $phrase_char * )* >;
279 $mailbox = qq< $X (?
: $addr_spec | $phrase $route_addr ) >;
280 $mailbox = qr
~^$mailbox$~x
;
283 # making 'require' happy
286 #####################
288 #####################
patrick-canterino.de