# direktes Verschicken einer E-Mail ueber die
# Socket-Schnittstelle - Implementierung von SMTP

use strict;
use warnings;
use IO::Socket;

# Konstante Angaben des Programms
my $LOCALHOST = 'localhost';
my $Mailserver = 'mail.hm.edu';

my $From = 'webmaster@netzmafia.de';
my $To = 'plate@hm.edu';
my $Subject = 'Test';
my $Text = qq~
Hallo Juergen,

wie geht es denn  so?
Dies ist ein SMTP-Test von Windows aus.
~;

my $result = sendmail($From, $To, $Mailserver, $Subject, $Text);
print $result, "\n";

sub sendmail
  {
  # Versenden von Text-E-Mail:
  # sendmail($from, $to, $smtp-server, $subject, $message );

  my ($fromaddr, $to, $smtp, $subject, $message) = @_;
  my $sock = '';

  $fromaddr =~ s/.*<([^\s]*?)>/$1/; # Absenderadresse bearbeiten,
                                    # falls sie die redundantere Form
                                    # "Name <E-Mail-Adresse>" besitzt
  $message =~ s/^\./\.\./gm;        # Punkt in Spalte 1 unschaedlich machen
  $smtp =~ s/^\s+//g;               # Leerzeichen weg
  $smtp =~ s/\s+$//g;

  return('Kein Empfänger!') unless ($to);

  $sock = new IO::Socket::INET(PeerAddr => $smtp,
                               PeerPort => 25,
                               Proto    => 'tcp',
                               Timeout  => 20)
          or return('Fehler beim Socket-Oeffnen: '.$!);
  # Meldung des Servers
  $_ = <$sock>;
  if (/^[45]/) { close($sock); return($_); }

  # helo
  print $sock "HELO $LOCALHOST\n";
  $_ = <$sock>;
  if (/^[45]/) { close($sock); return($_); }

  # MAIL From:
  print $sock "MAIL from: <$fromaddr>\n";
  $_ = <$sock>;
  if (/^[45]/) { close($sock); return($_); }

  # Mehrere Empfänger zerlegen, RCPT To:
  foreach (split(/, /, $to))
    {
	  print $sock "RCPT to: <$_>\n";
	  $_ = <$sock>;
    if (/^[45]/) { close($sock); return($_); }
    }

  # DATA
  print $sock "DATA\n";
  $_ = <$sock>;
  if (/^[45]/) { close $sock; return($_); }

  # Mail-Header, Leerzeile, Mail-Body
  print $sock "To: $to\n";
  print $sock "From: $fromaddr\n";
  print $sock "X-Mailer: Tralala 1.0\n";
  print $sock "Content-Type: text/plain; charset=\"iso-8859-1\"\n;
  print $sock "Content-Transfer-Encoding: 8Bit\n";
  print $sock "Subject: $subject\n\n";
  print $sock "$message";
  print $sock "\n.\n";

  $_ = <$sock>;
  if (/^[45]/) { close($sock); return($_); }

  # und Ende ...
  print $sock "QUIT\n";
  $_ = <$sock>;
  close($sock);
  return('success');
  }

