www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

smtp.pl
#!/usr/local/bin/perl -w
# smtp.pl -- Sendet Mails mit Net::SMTP. Ein kleiner Wrapper.

use Net::SMTP;        # CPAN-Modul aus der libnet.

# >>>>>> Die folgenden Konstanten muessen Sie anpassen!  <<<<<<
use constant XMAILER    => 'Net::SMTP / PerlOS';       # UA-String.
use constant TIMEOUT    => 30;                         # Timeout.
use constant MAILHOST   => 'mail.somewhere.org:smtp';  # SMTP-Server.
use constant MAILDOMAIN => 'somewhere.org';            # Domain.
use constant MAILFROM   => 'someone@somewhere.org';    # From:
use constant MAILBACK   => 'myaccount@hidden.com';     # ReplyTo:
# >>>>>> Die obigen Konstanten muessen angepasst werden! <<<<<<

# Eine typische Mailstruktur mit der zu verwendenden Mail.
$mailp = {
    Mailhost   => MAILHOST,         # Ueber welchen Mailserver?
    Maildomain => MAILDOMAIN,       # HELO/EHLO Maildomain
    Timeout    => TIMEOUT,          # Wartezeit, bis Server da ist.
    Mailer     => XMAILER,          # Name des UAs
    From       => MAILFROM,         # Wer sendet die Mail?
    ReplyTo    => MAILBACK,         # Wohin soll die Antwort?
    To         => [ shift(@ARGV) ], # Liste der Empfaenger: Hier nur 1.
    Subject    => join(' ', @ARGV), # Subject auf der Kdo-Zeile.
    Sigfile    => $ENV{'HOME'} . "/.signature",  # Anschrift, Telnr, ...
    Data       => [ contents() ],   # Einzelne Zeilen ohne \n.
};

send_mail($mailp);                 # Ab geht's!

sub send_mail {
    my $mailp = shift;

    # Sanity-Checks: Sind alle Werte plausibel?
    return unless $mailp->{'From'};        # Keine anonymen Sender!
    return unless $mailp->{'To'}->[0];     # Mindestens ein Empfaenger!
    $mailp->{'Maildomain'} ||= MAILDOMAIN; # Auch die brauchen wir.
    $mailp->{'Timeout'}    ||= TIMEOUT;    # Und das noch.
    $mailp->{'Subject'} = "(no subject)" unless $mailp->{'Subject'};

    # Bereiten wir schon einmal einiges vor.
    my $rcpt      = join(',', @{ $mailp->{'To'} });
    my $replyto   = $mailp->{'ReplyTo'} || $mailp->{'From'};
    my $xmailer   = $mailp->{'Mailer'}  || XMAILER;
    my $signature = get_signature_from_file($mailp->{'Sigfile'});
    
    # Nun koennen wir Mail senden.
    my $smtp = Net::SMTP->new($mailp->{'Mailhost'},
                  Hello   => $mailp->{'Maildomain'},
                  Timeout => $mailp->{'Timeout'})
    or return;

    # SMTP-Envelope (Das ist NICHT der Header!)
    $smtp->mail($mailp->{'From'}) or return;
    $smtp->to(@{ $mailp->{'To'} }) or return;

    $smtp->data() or return;                   # Anfang der E-Mail.
    $smtp->datasend(<<"EOHEADER") or return;   # E-Mail-Header.
From: $mailp->{'From'}
To: $rcpt
Reply-to: $replyto
X-Mailer: $xmailer
Subject: $mailp->{'Subject'}
EOHEADER
    $smtp->datasend("\n") or return; # Ende des E-Mail-Headers,
                                     # Anfang des E-Mail-Body.
    $smtp->datasend(join("\n", @{ $mailp->{'Data'} })) or return;
    $smtp->datasend("\n\n" . "-- \n") or return;
    $smtp->datasend($signature) or return;
    $smtp->dataend() or return;
    $smtp->quit() or return;

    print "mail sent.\n";
}

sub contents {
    my @body;
    print "Please enter mail body:\n";
    while (<STDIN>) {
    chomp;
    return @body if /^\.$/;
    push(@body, $_);
    }
    return @body;
}

sub get_signature_from_file {
    my $fname = shift;     # Dateiname der Signatur.
    local $/ = '';         # Schluerfmodus
    open (SIGFILE, $fname) or die "can't open sigfile $fname: $!\n";
    my $sig = <SIGFILE>;   # Alles auf einmal laden.
    close (SIGFILE);
    return $sig;
}
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:56:05 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo