• In diesem Bereich findet ihr Tutorials und Reviews. Die Forenrechte zur Erstellung neuer Themen sind hier eingeschränkt, da Problemdiskussionen bitte in den übrigen Forenbereichen auf Apfeltalk zu führen sind. Wer ein Tutorial oder Review einstellen möchte, kann im Unterforum "Einreichung neuer Tutorials" ein neues Thema erstellen. Die Moderatoren verschieben den Beitrag dann in den passenden Bereich.
  • Es gibt nach dem Softwareupdate eine Reihe von Änderungen und Neuerungen in unserem Forum. Genaueres dazu findet Ihr in dieser Ankündigung. Hinweise, Kritik, Anregungen, Lob und Tadel bitte hier diskutieren.

PHP-Scripts: Mail2APNS via BeejiveIM und Jabber oder "Push-Mail für Schotten"

Bananenbieger

Golden Noble
Mitglied seit
14.08.05
Beiträge
25.235
Kinder, gebt fei Acht, Bananenbieger hat Euch etwas mitgebracht!

Heute: Wie basteln wir uns ein Mail2APNS-Gateway.

Benötigt werden: BeeJiveIM, 2 Jabber-Accounts (einen sendenden, und einen empfangenden für das iPhone) , XMPPHP, PEAR Mail_Mime und natürlich ein Server, welcher a) PHP-CLI hat und b) Mails an ein Script weitergeben kann (ergo auch einen Mailserver).


Einfach folgende beiden Scripts auf den Server in ein leeres Verzeichnis packen (z.B. /srv/mail2apns) und XMPPHP und Mail_Mime in die Unterverzeichnisse XMPPHP und Mail kopieren (z.B. /srv/mail2apns/XMPPHP und /srv/mail2apns/Mail).
Das sollte dann so aussehen:


Danach die Konfigurationsvariablen in mail2apns.php setzen. Beispielhaft habe ich mal ein paar Daten eingetragen.

mail2apns.php (an dieses Script die Mails pipen):
Code:
#!/usr/bin/php  
<?php
// Mail2APNS Gateway - Version 0.8
//   Copyright (C) 2009 Bananenbieger. No Rights Reserved.
// 
// MAIL2APNS.PHP - Process incoming mail
//
//
// Configuration
//
// Jabber-Server to use for sending
//$jabber_srv="talk.google.com";
$jabber_srv="jabber.org";
// Port to use for Jabber Server
$jabber_srv_port=5222;
// Login data for sending user
$jabber_from_id="testi.testmann"; // It's "someone@gmail.com" for Google.
$jabber_id_domain="jabber.org"; // It's "gmail.com" for Google.
$jabber_from_passwd="topsecret";
// Where to send message to? (Must be different from sending user)
$jabber_to_id="myiphoneaccount@jabber.org";
//
// Do not change anything below this.




include("Mail/mimeDecode.php");

// read eMail from stdin
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
    $email .= fread($fd, 1024);
}
fclose($fd);

$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$params['input'] = $email;


$structure = Mail_mimeDecode::decode($params);
/*echo "\nTo: ";
echo $structure->headers['to'];
echo "\nSubject: ";
echo $structure->headers['subject'];
*/

$from_raw=$structure->headers['from'];
$from=trim(substr($from_raw,0,strpos($from_raw,"<")-1));
$message='Neue eMail von '.$from.' eingetroffen!   Betreff: '.$structure->headers['subject'].'';
$to=$structure->headers['to'];

//echo "\nMessage check:".$message."\n";

include("sendmessage_apns.php");

?>
sendmessage_apns:
Code:
<?php

// activate full error reporting
//error_reporting(E_ALL & E_STRICT);

include 'XMPPHP/XMPP.php';

#Use XMPPHP_Log::LEVEL_VERBOSE to get more logging for error reports
#If this doesn't work, are you running 64-bit PHP with < 5.2.6?
$conn = new XMPPHP_XMPP($jabber_srv, $jabber_srv_port, $jabber_from_id, $jabber_from_passwd, 'xmpphp', $jabber_id_domain, $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
	
try {
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message($jabber_to_id, $message);
    $conn->disconnect();
} catch(XMPPHP_Exception $e) {
    die($e->getMessage());
}
?>
Wenn alles richtig gemacht wurde, bekommt Ihr nun über eintreffende Mails eine APN.

Mit einer leichten Änderung kann dieses Script auch für andere Dinge verwendet werden ;)

Und so sieht es aus, wenn es fertig ist:
 
Zuletzt bearbeitet:
  • Like
Wertungen: ace777

Nathea

Admin
AT Administration
Mitglied seit
29.08.04
Beiträge
14.250
Danke für dies tolle Tutorial, das auch gleich seinen verdienten Platz im Tutorial-Bereich und der iPhone-FAQ gefunden hat.
 

AndyH

Carola
Mitglied seit
23.01.09
Beiträge
115
Tipp: Natürlich kann man an die Empfänger-JID auch die entsprechende Ressource dranhängen, damit die PN unabhängig von der Priorität z. B. nur am iPhone landen und nicht am Desktop-Client
 

Bananenbieger

Golden Noble
Mitglied seit
14.08.05
Beiträge
25.235
Nachtrag:

die mail2apns.php muss natürlich vom Mailserver ausführbar sein. Folglich bitte die Rechte +x für den User oder die Gruppe, unter der der Mailserver läuft, setzen.
 

gonzolo2k

Erdapfel
Mitglied seit
23.07.07
Beiträge
3
Hallo,
das klingt ja sehr interessant und ich würde es gerne mal ausprobieren. Verstehe nur einen Punkt nicht genau:

mail2apns.php (an dieses Script die Mails pipen):
wie meinst du das mit dem pipen. Beispiel: ich habe eine E-Mail xyz@abc.de was nuormalerweise durch den Mailserver in ein IMAP Postfach landet. Heißt das nun, dass das die mail zusätzlich noch an das skript geleitet werden soll, damit die PNS funktioniert? Dazu benötigt man doch noch was extra à la procmail/maildrop oder?

Oder denke ich mal wieder zu kompliziert??

Gruß,
gonzolo2k
 

Bananenbieger

Golden Noble
Mitglied seit
14.08.05
Beiträge
25.235
Heißt das nun, dass das die mail zusätzlich noch an das skript geleitet werden soll, damit die PNS funktioniert? Dazu benötigt man doch noch was extra à la procmail/maildrop oder?
Exakt so ist es. Du musst die Mail zusätzlich an das Skript leiten. Exim kann das z.B. direkt, bei anderen Mailservern muss man eventuell ein Hilfsprogramm bemühen.
 

gonzolo2k

Erdapfel
Mitglied seit
23.07.07
Beiträge
3
ah kapiert, fein. Ich benutze postfix mit cyrus IMAP. Habs jetzt probiert mit nem sieve skript -> geht wunderbar. Wenn das jetzt noch multiuser-fähig wäre (mehrere email-adressen, selbe domain) dann wärs PERFEKT. Mal sehen, vielleicht kriege ich das auch selber hin.

bye,
gonzolo2k
 

luke-r2d2

Antonowka
Mitglied seit
26.12.08
Beiträge
357
Wie ist das eigentlich genau bei IMAP-Diensten via Standard Mail-App... Werden die in dem einstellbaren Rhythmus geprüft?

Wenn ja wäre ja eventuell auch ein Skript interessant, das einfach z.B. jede Minute ein IMAP-Postfach prüft und entsprechend eine "APN" schickt. Dann kämen auch Leute, die nicht Mobile Me nutzen in den Genuss von Push-Diensten...

Edit: Klar, man braucht einen eigenen Server. Ich hab z.B. einen, benutze aber auf Grund der Oberläche trotzdem GMail.
 

Bananenbieger

Golden Noble
Mitglied seit
14.08.05
Beiträge
25.235
Wenn das jetzt noch multiuser-fähig wäre (mehrere email-adressen, selbe domain) dann wärs PERFEKT. Mal sehen, vielleicht kriege ich das auch selber hin.
Eigentlich gar nicht so schwer. Brauchst nur $structure->headers['to'] abfragen und $jabber_to_id entsprechend setzen lassen.


Wie ist das eigentlich genau bei IMAP-Diensten via Standard Mail-App... Werden die in dem einstellbaren Rhythmus geprüft?

Wenn ja wäre ja eventuell auch ein Skript interessant, das einfach z.B. jede Minute ein IMAP-Postfach prüft und entsprechend eine "APN" schickt. Dann kämen auch Leute, die nicht Mobile Me nutzen in den Genuss von Push-Diensten...
Das wäre aber eine recht ineffiziente Lösung, oder?

Edit: Klar, man braucht einen eigenen Server. Ich hab z.B. einen, benutze aber auf Grund der Oberläche trotzdem GMail.
Ich nutze auch nicht wirklich den Mailserver auf meinem Server. Meine Mail lasse ich ganz stressfrei von HostEurope managen. Von da lasse ich per Filterregel eine Kopie jeder eingehenden Mail an meinen Mailserver schicken, der dann die APNS auslöst.
Sollte mit Google ähnlich gehen.
 

luke-r2d2

Antonowka
Mitglied seit
26.12.08
Beiträge
357
Das wäre aber eine recht ineffiziente Lösung, oder?
Wahrscheinlich ;)


Ich nutze auch nicht wirklich den Mailserver auf meinem Server. Meine Mail lasse ich ganz stressfrei von HostEurope managen. Von da lasse ich per Filterregel eine Kopie jeder eingehenden Mail an meinen Mailserver schicken, der dann die APNS auslöst.
Sollte mit Google ähnlich gehen.
Hmm... Ich probiers mal aus, coole Idee...
 

Bananenbieger

Golden Noble
Mitglied seit
14.08.05
Beiträge
25.235
Vorankündigung: Es gibt jetzt auch Prowl im AppStore.
Sobald ich Zeit habe, werde ich das Script anpassen, so dass man statt BeejiveIM/Jabber auch einfach Prowl nutzen kann.
 

luke-r2d2

Antonowka
Mitglied seit
26.12.08
Beiträge
357
Vorankündigung: Es gibt jetzt auch Prowl im AppStore.
Sobald ich Zeit habe, werde ich das Script anpassen, so dass man statt BeejiveIM/Jabber auch einfach Prowl nutzen kann.
interessant wäre dann auch eine erkennung, ob der mac läuft -> umleitung auf mac, oder nicht -> umleitung aufs iphone ;)