Mail aus einer Software heraus versenden

Manchmal möchte aus einer Desktopanwendung heraus eine Mail verschicken. Das ist insofern problematisch, da man die Zugangsdaten für einen Mailaccount nicht in einer Anwendung hinterlegen sollte. Aus Webanwendungen heraus ist das Senden von Mails dagegen eine einfache Sache. Also was liegt näher als diesen Vorteil für das Senden von Mails aus Desktopanwendungen heraus zu nutzen.

<?php
    $reciever=$_POST["reciever"];
    $allowedRecieverDomain="example.org";
    $subject=$_POST["subject"];
    $text=$_POST["message"];

    //Sender
    $senderName="Mailer";
    $sender="";

    //Additional challenge
    $challenge="abc123";
    if($challenge!=$_POST["challenge"]) return;

    //Check reciever
    $atCount=substr_count($reciever, "@");
    if($atCount>1) return;

    if(!(strpos($reciever, "@" . $allowedRecieverDomain)===FALSE))
    {
        mail($reciever, $subject . " - (" . date("d.m.y - H:m:s") . ")", $text, "From: $senderName <$sender>");
    }
?>

Ein kleines PHP Skript mit dem Namen „mailer.php“ sorgt dafür das die Mail bzw. der Text der Mail in Empfang genommen wird. Anschließend wird nachgeschaut ob die Mail an einen validen Sender adressiert ist. In diesem Beispiel werden nur Mails an @example.org weitergeleitet. Schließlich möchte man keine Spamschleuder betreiben. Nun müssen die Parameter in der Anwendung noch per POST-Request übergeben werden. Unter C# könnte das ganze so aussehen:

System.Net.ServicePointManager.Expect100Continue=false;

string url="http://example.org/mailer.php";

using(var wb=new WebClient())
{
    var data=new NameValueCollection();
    data["sendername"]="Mailer";
    data["sender"]="";
    data["reciever"]="";
    data["subject"]="Mail from Application";
    data["message"]="Message";

    var response=wb.UploadValues(url, "POST", data);
}

Der Quellcode ist dabei auf GitHub zu finden und steht unter der AGPL.

Mails per SMTP unter WordPress versenden

Unter Umständen kann es vorkommen, das man sein WordPress auf einem Server betreibt, welcher keine PHP „mail()“ Funktion unterstützt. In diesem Fall sollten die Mails per SMTP versendet werden. Möglich wird dies mit dem Plugin „Easy WP SMTP„. Damit werden die Mails nicht mehr über die PHP-Funktion, sondern über einen SMTP Account versendet.

Die Einstellungen des Plugins Easy WP SMTP

Die Einstellungen des Plugins Easy WP SMTP

Bei der Konfiguration des Plugins werden SSL und TLS unterstützt, so das hier die Zugangsdaten nicht im Klartext durch das Netz gesendet werden.

Upload Limit für PHP-FPM in Verbindung mit Nginx erhöhen

Standardmäßig liegt das Uploadlimit für Dateien einer Nginx Installation mit der entsprechenden PHP-Installation bei 2 MiB. Damit stößt man natürlich bei vielen Anwendungen sehr schnell an die Grenze, so z.B. beim Upload von größeren Bildern. Möchte man dies ändern, müssen sowohl die Nginx-Konfiguration als auch die PHP-Konfiguration angepasst werden. Im ersten Schritt wird die Nginx-Konfuration bearbeitet:

nano /etc/nginx/nginx.conf

Dort wird im „http“-Block die Zeile:

client_max_body_size 1024m;

hinzugefügt. Unter Umständen muss hier auch die „client_body_timeout“-Option mit einem höheren Timeout versehen werden. Dies sollte man allerdings durch eigene Tests herausfinden. Nachdem Nginx konfiguriert ist, geht es an die „php.ini“-Datei:

nano /etc/php5/fpm/php.ini

Dort müssen folgende Parameter gesetzt werden:

post_max_size = 1024M
upload_max_filesize = 1024M

Nachdem das erledigt ist, können Nginx und der PHP Service neugestartet werden:

service nginx restart
service php5-fpm restart

Anschließend verfügt man in diesem Fall über ein neues Upload Limit von 1024 MiB.

Firefox Sync App in ownCloud rückstandslos entfernen

In einem meiner letzten Artikel gibt es darum, wie man Firefox Sync in Verbindung mit ownCloud nutzt. Augenscheinlich gibt es im Zusammenhang damit ein Problem, das dass ganze nach dem Neustart von Firefox nicht mehr richtig funktioniert. Natürlich kann man die entsprechende App in ownCloud deaktivieren, allerdings bleiben dabei noch einige Einträge in der Datenbank erhalten. Mit diesem Skript können diese Einträge entfernt werden:

<?php
//Configuration
$dbServer = "localhost";
$dbDatabase = "owncloud";
$dbUsername = "user";
$dbPassword = "secret";

//Set up connection
$mySQLConnection = mysql_connect($dbServer, $dbUsername, $dbPassword) or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch!");
mysql_select_db($dbDatabase) or die ("Die Datenbank existiert nicht.");

//Cleanup ownCloud Tables
mysql_query("DELETE FROM `$dbDatabase`.`oc_appconfig` WHERE `oc_appconfig`.`appid` = 'core' AND `oc_appconfig`.`configkey` = 'remote_mozilla_sync' AND `oc_appconfig`.`configvalue` = 'mozilla_sync/appinfo/remote.php'");

mysql_query("DELETE FROM `$dbDatabase`.`oc_appconfig` WHERE `oc_appconfig`.`appid` = 'mozilla_sync' AND `oc_appconfig`.`configkey` = 'enabled' AND `oc_appconfig`.`configvalue` = 'no'");
mysql_query("DELETE FROM `$dbDatabase`.`oc_appconfig` WHERE `oc_appconfig`.`appid` = 'mozilla_sync' AND `oc_appconfig`.`configkey` = 'installed_version' AND `oc_appconfig`.`configvalue` = '1.0'");
mysql_query("DELETE FROM `$dbDatabase`.`oc_appconfig` WHERE `oc_appconfig`.`appid` = 'mozilla_sync' AND `oc_appconfig`.`configkey` = 'types' AND `oc_appconfig`.`configvalue` = ''");

//Drop tables
mysql_query("DROP TABLE `oc_mozilla_sync_collections`, `oc_mozilla_sync_users`, `oc_mozilla_sync_wbo`;");

//Close connection
mysql_close($mySQLConnection);
?>

Zu finden ist das Skript auf GitHub. Es entfernt dabei die Tabellen „oc_mozilla_sync_collections“, „oc_mozilla_sync_users“ und „oc_mozilla_sync_wbo“. Daneben wird die Tabelle „oc_appconfig“ um die Einträge der App bereinigt.

Nginx Server mit PHP und MySQL unter Ubuntu aufsetzen

Mittels Nginx ist ein Webserver mit PHP und MySQL in ein paar Minuten eingerichtet. Dazu installiert man unter Ubuntu folgende Pakete:

sudo apt-get install mysql-server nginx php5-fpm php5-curl php5-gd php5-imap php5-mysql

Nach der Installation der nötigen Pakete geht es an die grundlegende Konfiguration des Webserver:

mkdir -p /var/www/example.org/root
mkdir -p /var/www/example.org/test
cd /var/www
chown -R www-data:www-data . 
usermod -a -G www-data nutzername

In diesem Beispiel soll die Domain „example.org“ sowie die Subdomain „test.example.org“ eingerichtet werden. Deshalb legen wir zwei Ordner an. Anschließend teilen wir Nginx mit, welche Domains und Subdomains der Webserver verwalten soll. Dazu legen wir die Datei „/etc/nginx/sites-available/example“ an und füllen diese mit folgendem Inhalt:

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/root;
        index index.php index.html index.htm;
 
        server_name .example.org;

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/test;
        index index.php index.html index.htm index.php; 

        server_name test.example.org;

        location / {
            auth_basic "Access denied";
            auth_basic_user_file /var/www/example.org/root/.htpasswd;

            autoindex on;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

Im ersten Block wird die Domain „example.org“ definiert und konfiguriert. Durch die Notation „.example.org“ wird Nginx angewiesen, jede Subdomain welche nicht definiert ist, auf die Hauptseite umzuleiten. Für die Domain „test.example.org“ wurde außerdem ein Passwortschutz angelegt und die Verzeichnisansicht aktiviert. Damit die Konfiguration auch aktiv werden kann, muss eine symbolische Verknüpfung in das Verzeichnis „/etc/nginx/sites-enabled“ angelegt werden:

ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

Die bestehende „default“-Datei im „sites-enabled“ Ordner enthält eine Beispielkonfiguration. Diese kann entwerder entfernt werden oder konfiguriert werden:

server {
        listen   80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/default/root;
        index index.php index.html index.htm;
 
        server_name _;
}

Mit dieser Konfiguration wird jede Seite auf Default umgeleitet, welche nicht in anderen Konfigurationen auftaucht. Nun muss nur noch der Webserver (und des PHPs Moduls) neugestartet werden:

service nginx restart
service php5-fpm restart

Ist der Server bereits online, reicht es auch die Konfiguration neuzuladen:

service nginx reload

Sollten während der Konfiguration Fehler auftreten, so hilft ein Blick in das entsprechende Log:

cat /var/log/nginx/error.log

Benötigt man eine Datenbank für die gewünschte Webanwendung, so muss diese in die SQL Datenbank eingespielt werden. Ist alles richtig konfiguriert worden, läuft der Webserver auf Port 80 und wartet auf erste Anfragen.