POP3-Server abfragen - vorhandene Nachrichten zählen

Hier ein kleines (aber feines) Script für euch, um die Anzahl vorliegender Nachrichten auf einem POP3-Server zu prüfen.

Nach dem Ausführen steht in der IPS-Statusvariablen (bitte im Script nach Euren Wünschen anpassen und bei IPS anlegen) die Anzahl der neuen Nachrichten auf dem Server.
Weiterhin müssen der POP3-Server, der Username und das Passwort eingetragen werden. Ist im Script mit //HIER markiert.

Das Script kann natürlich auch noch erweitert werden - Nachrichten herunterladen und anzeigen und Nachrichten löschen. Wer die weiteren Funktionen haben will kann sich ja nochmal melden.
Ich nutze das Script um zu sehen ob neue Nachrichten in meinem Postfach vorhanden sind. Viel Spaß mit meinem kleinen Weihnachtsgeschenk.


//Connect POP3-Server
function pop3_open($server, $port)
{
   global $POP3_GLOBAL_STATUS;
   $pop3 = fsockopen($server, $port);
   if ($pop3 <= 0) return 0;
   $line = fgets($pop3, 1024);
   $ergebnis=substr($line,1,2);
   if($ergebnis<>"OK")
      return 0;

   return $pop3;
}

//User-Authentifizierung: USERNAME
function pop3_user($pop3, $user)
{
   global $POP3_GLOBAL_STATUS;
   fputs($pop3, "USER $user
");
   $line = fgets($pop3, 1024);
   $ergebnis=substr($line,1,2);
   if($ergebnis<>"OK")
      return 0;

   return 1;
}

//User-Authentifizierung: PASSWORT
function pop3_pass($pop3, $pass)
{
   global $POP3_GLOBAL_STATUS;
   fputs($pop3, "PASS $pass
");
   $line = fgets($pop3, 1024);
   $ergebnis=substr($line,1,2);
   if($ergebnis<>"OK")
      return 0;

   return 1;
}


//POP3-Mailliste laden
function pop3_list($pop3)
{
   global $POP3_GLOBAL_STATUS;
   fputs($pop3, "LIST
");
   $line = fgets($pop3, 1024);
   $ergebnis=substr($line,1,2);
   if($ergebnis<>"OK")
      return 0;

   $i = 0;
   while(substr($line=fgets($pop3, 1024),0,1)<>".")
   {
      $articles[$i] = $line;
      $i++;
   }
   $articles["count"] = $i;
   return $articles;
}


//POP3-Verbindung schließen
function pop3_quit($pop3)
{
   global $POP3_GLOBAL_STATUS;
   fputs($pop3, "QUIT
");
   $line = fgets($pop3, 1024);
   $ergebnis=substr($line,1,2);
   if($ergebnis<>"OK")
      return 0;

   return 1;
}

//Hauptscript
$pop3 = pop3_open("hier den pop3-server.de eintragen","110"); //HIER
if (!$pop3)
   echo "[ERROR] Failed to connect
";	

if (!pop3_user($pop3, "hier den username eintragen"))    //HIER
   echo "[ERROR] Username failed!
";

if (!pop3_pass($pop3, "hier das password eintragen"))   //HIER
   echo "[ERROR] PASS failed!
";

$articles = pop3_list($pop3);
if (!$articles)
   echo "[ERROR] LIST failed!
";

if (!pop3_quit($pop3))
   echo "[ERROR] Close POP3 failed!
";
 
//hier die Anzahl der "gezählten" Nachrichten in die IPS-Variable ablegen
SetValueInteger("Anzahl_Neue_Mails",(integer)$articles["count"]);
echo "es sind ".$articles["count"]." Nachrichten auf dem Server";

Viel Erfolg und viel Spaß
René

sehr schönes Beispiel für die Arbeit mit Sockets!

Für das beschriebene Problem kann man sich die Arbeit allerdings wesentlich einfacher machen, wenn man die imap Bibliothek benutzt, die kann entgegen dem Namen auch POP3. Die entsprechenden Funktionen sind imap_open, imap_status und imap_close. Insgesamt wird das dann ein 4-Zeiler.

Tommi

Hi Tommi…

das hatte ich auch so versucht. Leider ohne Erfolg.
Ich habe von PHP 5.0.5 nur die imap.dll mittels extensions-anweisung in der PHP.ini eingebunden.
beim imap_open-Befehl gab es dann aber probleme. erst blieb das scipt hängen (Timeout) und dann ist IPS abgestürzt.
Vielleicht habe ich da aber auch was falsch gemacht. Ich weiß nicht ob man einfach einzelne DLL’s bei IPS nachträglich einbinden darf. Muss man die _ts.dll auch austauschen?

Moin,

hatte vor einiger Zeit ein Skript in den Anleitungen veröffentlicht, was die imap benutzt (IPS per Mail und SMS2Mail steuern)
Link: http://www.ipsymcon.de/forum/showthread.php?t=689&highlight=mail
Vielleicht kannst du ja etwas daraus gebrauchen ?
Gruß

cAtMaX

Php in IPS ist meiner Meinung nach „nur“ Version 5.0.4 (einfach mal phpinfo() ausgeben. Dazu muss auch die dll passen. Deine Fehlermeldung deutet geau darauf hin.
Wie schon erwähnt wurde, gab es dazu schon mehrere funktionierende Lösungen im Forum, einfach mal nach imap suchen.

Tommi

so…nun hier noch die Antwort, damit der Beitrag rund wird.
Ich habe dann mal die richtige DLL eigebunden (gleiche Version wie bei IPS) und dann geht alles ohne Probleme.
Der Connect und die Abfrage wird dann wie schon tommi geschreiben wesentlich einfacher.

Soll heißen - mit dem zusätzlichen Einbinden der imap.dll spart man eine Menge Code. Muss aber mittels der php.ini die dll einbinden.

Ich finde dieses Skript sehr interessant, doch wie kann ich emails in meinem GMAIL Account abfragen? Es ist auch POP3, hat nur als „Incoming Server“ 995, doch das kann man ja im Skript einstellen, doch nur ist auch hier die Funktion „This server requires a secure connection SSL“ noch zusätzlich ?
Mit dem Outlook Express kann man das einstellen, und via Skript? Kann man das auch hier realisieren?

mfG Franz

Das geht schon, theoretisch.

<?php 
$mbox = imap_open ("{server:995/pop3/ssl/novalidate-cert}", "user_id", "password"); 
?>

leider gibt es einen bekannten Bug in dieser Funktion unter Windows, weil die ssl und imap-Bibliotheken nicht so gut zusammen arbeiten.
http://bugs.php.net/bug.php?id=36496

Tommi

Danke,

ich werde das mal probieren !

In der Tat, es funktionniert nicht. :frowning:

Danke aber für den Hinweis

mfg Franz

Folgender Hinweis:

Alle Versuche POP3/IMAP Email abzufragen von GMAIL was SSL verlangt, sind fehlgeschlagen.
Mein Vorschlag: Alle ankommenden Emails im GMAIL account einfach weiterleiten auf ein normales POP3 Account ohne SSL. Dann klappt alles wunderbar per imap_open

mfG Franz

Auch nicht mit der brand-neuen PHP-Version?

Tommi

ja ! und habe mich auch durch zig Foren durchgewühlt. Es will einfach nicht klappen.
Manche haben gesagt, man müsste auch php_sslopen.dll und zwei weitere DLL im /system32 Ordner ablegen.
Habe ich auch getan, geht dennoch nicht.
Weiterhin habe ich gelesen, dass im php_imap.dll der SSL nicht aktiviert sein sollte. Man müsste das umändern und neu kompilieren.
Na da hören meine Kentnisse auf. Deshalb habe ich mich für die Forwarding-Geschichte entschieden. Das klappt wunderbar.

mfG Franz

Hallo!
Verstehe ich das richtig? Einen POP3 Server, der SSL verlangt, kann man nicht so einfach abfragen?

LG; Marcus

[Ironie] Wenn du auch der Meinung bist, dass ein Verschlüsselungsprotokollirgendeinen Einfluss auf eine Datenübertragung hat… Ja :wink: [/Ironie]

Für alle, die es dennoch gern versuchen möchten sollte „CURL“ und „OpenSSL“ die Antwort sein.

Toni

Hmmm… Also der Grund meiner Frage: Unser POP3 Server auf der Arbeit verlangt SSL, wie ich seit heute Mittag weiß. Dennoch würde ich gern wissen, wenn ich nach Hause komme, ob und wieviele Mails im Postfach liegen. Mir war nun aus der Diskussion nicht ganz klar, ob das nun geht oder nicht :frowning:

Nur wenn du dein mail-holen-script um einen SSL Clienten erweiterst.

nix für Beginner fürchte ich…

Nur so eine Idee:
Kannst du das nicht, quasi als Workaround, vielleicht ein Mailprogramm machen lassen, dass es dir gestattet auf die lokal gespeicherten Mails zuzugreifen?

Aha. Gibts da einen Link, auf den Du mich verwei(ai)sen kannst? Ich würde mich wenigstens mal daran versuchen…

Sorry… Ich hab selbst nur ne grobe Vorstellung davon wie soetwas geht… Nie selbst gemacht und schon garnicht mit PHP… :frowning:

Meinen Nachtrag aus dem letzten Beitrag gelesen?

Ja, hab ich eben gelesen.
Situation ist bei mir folgende: Die Firmenmails werden in der Firma über einen POP3 mit SSL empfangen. Dann haben wir einen Exchange Server, der die Mails dann ins Postfach holt. Ich kann über den Browser z.B. aus dem Internet auf den Exchange Server über die Webschnittstelle zugreifen.
Was meinst du mit „lokal gespeicherten Mails“?