Benutzerlogin via SMTP überprüfen…

Ich habe zur Zeit den Fall, dass ich überprüfen muss, ob jemand Zugriff auf bestimmte Daten haben darf. Der entsprechende Personenkreis bekommt von mir allerdings einfach nur einen E-Mail-Account auf einem meiner Server zugewiesen - und ehrlich gesagt habe ich keine Lust, zwei Benutzerverwaltungen mit entsprechendem Passwortabgleich oder ähnliches zu betreiben.

Deshalb habe ich mir gedacht "Warum teste ich nicht einfach, ob die Person einen gültigen E-Mail-Account bei mir hat?" Leider bietet PHP keine einfache Möglichkeit, einen SMTP-Login durchzuführen... es gibt zwar etwas in der PEAR-Bibliothek, das wäre aber wie mit Kanonen auf Spatzen zu schießen.

Ich habe mir deshalb einfach mal angeguckt, wie so eine SMTP-Authenfizierung funktioniert. Der Quelltext in meinem Fall ist dabei speziell auf meinen SMTP-Server zugeschnitten, der ausschließlich AUTH LOGIN unterstützt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  function smtpLogin($server, $port, $timeout, $username, $password) {
    $result = false;

    $authOK   = "235 ";
    $ehloEnd  = "250 ";
    $password = base64_encode($password);
    $username = base64_encode($username);

    $socket = fsockopen($server, $port, $errorNo, $errorStr, $timeout);
    if ($socket) {
      $input = fgets($socket);             // read welcome message
      fwrite($socket, "EHLO irgendwas\n"); // send EHLO

      do {
        $input = fgets($socket);
        $done  = (stripos($input, $ehloEnd) !== false);
      } while (!$done);

      fwrite($socket, "AUTH LOGIN\n");   // send AUTH LOGIN
      $input = fgets($socket);           // read "username" message
      fwrite($socket, $username . "\n"); // send username
      $input = fgets($socket);           // read "password" message
      fwrite($socket, $password . "\n"); // send password
      $input = fgets($socket);           // read login result;

      $result = (stripos($input, $authOK) !== false);

      fwrite($socket, "QUIT\n"); // send QUIT
      fclose($socket);
    } else {
      // do not return any valuable info
    }

    return $result;
  }

Die Verwendung von fsockopen() zum Herstellen der Verbindung hat übrigens einen super Nebeneffekt: Durch Voranstellen der Strings "ssl://" vor den Hostnamen (und natürlich dem Auswählen der richtigen Portnummer) kann man den gleichen Quelltext auch für einen SMTPS-Server verwenden! 😀

Wer Lust hat, kann aus dem ganzen ja einen ordentlichen Login mit Berücksichtigung der Capabilities, etc. machen. Demjenigen wünsche ich an dieser Stelle schon einmal viel Spaß. 🙂

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Eingeloggte Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.