Mails verschicken ohne SMTP-Service

Die folgende Funktion bildet das SMTP (Simple Mail Transfer Protokoll) ab, so dass man auch ohne eigenen Mailservice eine Mail über einen fremden Service absenden kann, bei dem man sich PLAIN authentifizieren muss.

Argument Bedeutung
to Empfänger der Mail
subject Betreff der Mail
content Inhalt der Mail
from Absender der Mail
extra Weitere Header, in der Regel leer („“)
myName Der Name meines Servers
mail_server Der Name des SMTP-Servers
auth_user Der Benutzername, der dem SMTP-Server bekannt ist
auth_pass Das Passwort des Benutzers, der dem SMTP-Server bekannt ist

Mit diesen Angaben verhält sich die Funktion wie ein E-Mailprogramm, das über den jeweiligen Server eine Mail abschicken möchte.

<?
function smtpmail( $to, $subject, $content, $from, $extra, 
                   $myName, $mail_server, $auth_user, $auth_pass)
{
  $hdr = "FROM: "    . $from    . "\x0D\x0A"
       . "TO: "      . $to      . "\x0D\x0A"
       . "Subject: " . $subject . "\x0D\x0A"
       . $extra                 . "\x0D\x0A"
       .                          "\x0D\x0A"
       . $content               . "\x0D\x0A";
 
  $fp = fsockopen( $mail_server, 25 );
 
  if( !$fp ) DIE("SMTP Server nicht erreichbar: ".$mail_server );
 
  $banner = fgets( $fp, 1024 );
 
  # HELO

  fputs( $fp, "HELO $myName\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result+0 != 220 && $result+0 != 250 )
    die( "HELO Statuscode falsch" );
 
  # AUTH

  fputs( $fp, "AUTH PLAIN ".base64_encode( "\0".$auth_user."\0".$auth_pass )."\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result + 0 != 235 )
    die( "AUTH LOGIN Authorisierung fehlgeschlagen." );
 
  # MAIL FROM

  fputs( $fp, "MAIL FROM: ".$from."\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result + 0 != 250 )
    die( "MAIL FROM Statuscode falsch" );
 
  # RCPT TO

  fputs( $fp, "RCPT TO: ".$to."\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result + 0 != 250 )
    die( "RCPT TO: Statuscode falsch".$result );
 
  # DATA

  fputs( $fp, "DATA\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result + 0 != 354 )
    die( "DATA Statuscode falsch:".$result );
 
  fputs( $fp, $hdr );
 
  # .
  fputs( $fp, ".\x0D\x0A" );
  $result = fgets( $fp, 1024 );
  if( $result + 0 != 250 )
    die( "DATA(End) Statuscode falsch:".$result );
 
  # QUIT

  fputs( $fp, "QUIT\x0D\x0A" );
  $result = fgets( $fp, 1024 );
 
  return true;
}
?>