Kategorien
PHP

PHP verhindern eines Email Loops bei Mail Auto Respondern (Endlosschleife)

Ein typisches Problem bei automatischen E-Mail Antworten (Auto Respondern) ist, dass es zu einer Endlosschleife kommen kann, wenn automatisch auf E-Mails geantwortet wird und der Empfänger auch eine automatische E-Mail z.B. eine Abwesenheits-Urlaubs E-Mail verschickt. Das Phänomen nennt man Email Loop.

Der Email Loop kann nur verhindert werden durch ein festgelegtes Limit an Nachrichten an denselben Adressaten. Man sollte z.B: festlegen, dass pro Tag nur eine E-Mail an einen Adressaten geschickt wird per Auto-Responder und dies mittels einer Datenbank checken.

Die Datenbank Abfrage für alle E-Mails, die nicht älter als einen Tag sind und schon beantwortet worden sind,  könnte so aussehen:

 $sql = "SELECT COUNT(response_sent)
         FROM autoresponder
         WHERE email='{$email}' AND date_received > TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 day)) AND response_sent=1";

Ein Auto-Responder in PHP besteht aus 3 Teilen:

  1. dem Abrufen der Emails aus dem Postfach
  2. dem Speichern in der Datenbank der Mail-Daten
  3. dem Antworten auf E-Mails

Wenn man einen Auto-Responder nicht gleich als solchen enttarnen will, weil sofort eine Antwort geschickt, wollte man einen Cronjob einrichten, der zufällig bestimmt mit einer bestimmten Wahrscheinlichkeit, ob eine E-Mail beantwortet wird oder nicht.

z.B. mit einer Wahrscheinlichkeit von 10%:

if(rand(0, 1) <= 0.1)
{
answerMail();
}
Kategorien
PHP Webdeveloper Tools Zend Framework

PHP Datenbank Backend generieren Scaffolding

Um schnell eine einfache Möglichkeit für Kunden zu haben, um auf die Datenbank zuzugreifen, kann man das praktische online Tool phpScaffold nutzen.

Damit lassen sich schnell Oberflächen generieren und customizen zum Ändern, Einfügen und Entfernen von Datensätzen einer Tabelle.

Für größere Projekte sollte man allerdings ein passendes Framework nutzen, welches Scaffolding unterstützt:

Bsp Ergebnis:

Kategorien
PHP Webdeveloper Tools

Online Tool: Regex Generator RegExr – reguläre Ausdrücke finden

Mit dem wirklich gutem online Tool RegExr lassen sich kinderleicht passende Reguläre Ausdrücke finden, die von anderen Usern erstellt worden sind sowie eigene reguläre Ausdrücke entwickeln.

Mit dem PHP Regular Expression Tester lassen sich die Ergebnisse sehr gut online testen:

Bsp: regulären Ausdruck testen auf 3-stellige Zahlen (nicht perfekt, führende Nullen werden nicht ignoriert).

Kategorien
Android C C++ CodeIgniter Framework iPhone/iOS Java JavaScript Mobil MySQL PHP Webdeveloper Tools Zend Framework

Teil 1: Clean Code – Regeln für guten, sauberen Code

Sauberen und leicht verständlichen Code zu schreiben ist das höchste Ziel in einem guten IT-Projet. Vieles hängt davon ab:

  • Wartbarkeit
  • Einarbeitungszeit für andere Programmierer, versteht man schnell, was einzelne Funktionen erledigen
  • Robustheit bei Änderungen
  • Testbarkeit, fällt alles zusammen, bei kleinen Änderungen, können schnell stabile Updates bereitgestellt werden
  • Popularität bei anderen Programmierern z.B: bei Open Source Projekten, als negative Beispiel sei XT-Commerce genannt

Das sehr zu empfehlende Standardwerk zu dem Thema ist „Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code“ von Robert C. Martin. In diesem Artikel werden Kapitel 1 bis 3 behandelt.

Aussagekräftige Namen

Der Namen einer Variable, Funktion oder Klasse sollte sofort erklären, warum Sie existiert, was sie tut und wie sie benutzt wird. Wenn eine Variable einen Kommentar benötigt, drückt Sie ihren Zweck nicht aus.

Bsp:

int d //Anzahl vergangener Tage
besser ist:
int daysSinceCreation;

Aussprechbare Namen verwenden

Keine Konstrukte mit unklaren Abkürzungen wie: int daSiCre anstatt von daysSinceCreation.

Suchbare Namen verwenden

Moderne IDEs machen das Suchen einfach, aber es nützt nichts, wenn man nach dem Buchstaben e einer Laufvariable suchen muss und von Ergebnissen überschwemmt wird.

Variablen Namen mit einem Buchstaben sind nur als lokale Variablen in kurzen Methoden zu verwenden.

Kategorien
PHP XT-Commerce

XT-Commerce addiert keine Mehrwertsteuer Schweiz

Bei Bestellungen aus dem EU-Ausland berechnet XT-Commerce korrekter Weise keine Mehrwersteuer von 19% auf die Preise im Shop. Die Einstufung, ob ein Kunde aus dem Ausland kommt richtet sich nach der Rechnungsadresse, nicht der Lieferadresse. Man könnte also auf de Idee kommen, als Deutscher Kunde einfach eine Schweizer Rechnungsadresse anzugeben und sich das Produkt nach Deutschland liefern zu lassen.

Wer will ,dass Nicht-EU Kunden auch die Mehrwertsteuer zahlen sollen, der muss in der Datenbank folgenden Zellen ändern:

Tabelle: tax_rates

Die passenden Einträge der Spalte tax_rate auf 19 setzen, damit gilt für alle Artikel, die mehrwertsteuerpflichtig sind, dieser Steuersatz und nicht teilweise 0%.

Kategorien
MySQL PHP Webdeveloper Tools

Installation Eclipse PHP PDT Plugin unter Windows7 Tutorial

Zur professionellen Entwicklung gehört auch eine gute IDE. Ich verwende dafür PHP Storm und davor Netbeans, aber viele Entwickler empfehlen das kostenpflichtige Zend Studio bzw. das ähnliche aber kostenlose Plugin für Eclipse von Zend: das PDT-Plugin.

Die Installation von Eclipse incl. Plugin kann sehr einfach im „All-in-one-Package“ durchgeführt werden.

Kategorien
PHP

PHP POP3 Mails aus Postfach auslesen

Um mit PHP an die E-Mails eines Postfaches zu gelangen über POP3, habe ich diese nützliche Testscript geschrieben. Damit lassen sich alle ungelesen E-Mails anzeigen mit Absender, Betreff, Datum und E-Mail-Body.

$mailserver="pop.foo.de";
$port="110/pop3";
$user="name@foode";
$pass="foo";
getEmailsImap($mailserver, $port, $user, $pass);

//open connection to mailbox, read all unread mails
function getEmailsImap($mailserver, $port, $user, $pass)
{
    $imap = imap_open( "{" . $mailserver . ":" . $port . "}INBOX", $user, $pass );
    if ($imap)
     {
        echo "Connected\n";
        $check = imap_mailboxmsginfo($imap);
        echo "Date: "     . $check->Date    . "<br />\n" ;
        echo "Driver: "   . $check->Driver  . "<br />\n" ;
        echo "Unread: "   . $check->Unread  . "<br />\n" ;
        echo "Size: "     . $check->Size    . "<br />\n" ;

        $totalrows = imap_num_msg($imap);
        //iterate through all unread mails
        for ($index = 0; $index < $totalrows; $index++)
        {
            $header = imap_header($imap, $index + 1);
             //get mail subject
            dump("<h1>".$header->subject."</h1>");
             //get mail sent date
            $prettydate = date(DateTime::ISO8601 , $header->udate);
            dump( $prettydate );
            //get email author
            $email = "{$header->from[0]->mailbox}@{$header->from[0]->host}";
            dump( $email );
            //get mail body
            dump( imap_body($imap, $index + 1));
        }
        //close connection to mailbox
        imap_close($imap);
        return true;
     }
     else
     {
         dump("Can't connect: " . imap_last_error());
         return false;
     }
}
function dump($var)
{
    echo "<pre><div align='left'>";
    print_r($var);
    echo "</div></pre>";
}
Kategorien
Amazon MWS PHP

Amazon MWS Products API Request Limit

Amazon hat ein nicht ganz einfaches Request Limit eingebaut für die ganze MWS API. Allgemein gilt, dass nicht mehr als 10000 Requests pro Stunde getätigt werden können.

Amazon hat den so genannten Leaky Bucket-Algorithmus gewählt, um den Webservice zu entlasten.

Für die MWS Products API, mit der Artikel Informationen von Amazon bezogen werden können gelten die folgenden Limits aus der MWS Products API Referenz (Stand 6.9.2012).

Operation / Maximum Request Quota / Restore Rate
ListMatchingProducts / 20 / 1 per 5 seconds

GetMatchingProduct  / 20 / 2 Items per second

GetMatchingProductForId/ 20 / 1 Item per second (neu)

GetCompetitivePricingForSKU and  GetCompetitivePricingForASIN / 20  / 10 Items per second

GetLowestOfferListingsForSKU and GetLowestOfferListingsForASIN / 20 / 10 Items per second

GetMyPriceForSKU and GetMyPriceForASIN / 20 / 10 Items per second (neu)

GetProductCategoriesForSKU and GetProductCategoriesForASIN / 20 / 1  per 5 seconds

 maximale Requests für ListMatchingProducts proStunde

Es können 20 Requests am Anfang der Stunde gemacht werden, danach müssen die Punkte wieder aufgefüllt werden. Danach muss über die Restore Rate wieder Punkte aufgefüllt werden. Wenn sich jede Sekunde ein Request wieder auffüllt, ergibt das 3600 pro Stunde, im besten Fall, wenn sich die Requests nicht am Anfang der Stunde anfallen, sondern gleichmäßig verteilt über die ganze Stunde.

Insgesamt ergeben sich für  den ListMatchingProducts Request bei einer Restore Rate von 5 Sekunden maximal 6 * 60 = 360 Requests pro Stunde damit. Pro Request können 20 Items mitgeschickt werden, was bedeutet, dass 7200 Artikel abgefragt werden können im Optimalfall.

Kategorien
PHP WordPress

WordPress eigene Farben und CSS Klassen in den Editor einbauen

Wenn man das Backend customizen und dem TinyMCE Editor eigene Farben und Klassen hinzufügen will, sollte man auf das WordPress Plugin Custom Class Selector zurückgreifen.

Das Plugin ist vom Ansatz her gleich mit der Lösung von WDMAC, welche aber nicht als Plugin verfügbar ist, aber genauso funktioniert und genauso aufwendig zu implementieren ist. Der Vorteil des Plugins ist, dass man auf Updates und Anpassungen  hoffen kann und es deswegen bevorzugen sollte.

Kategorien
PHP

PHP nicht schreibbare Dateien finden und beheben

Ich habe folgende Funktion gebaut, um bei kritischen Operationen mit Dateischreiboperationen auf dem Laufenden zu sein, wenn sich Schreibrechte geändert haben und ein Schreiben in die Datei nicht möglich ist. Leider können der Fileowner in den meisten Fällen nur vom Superuser gesetzt werden, deswegen verschickt das Script eine Mail im Fehlerfall.

Dieses Problem trifft dann bei mir auf, wenn meine IDE Netbeans automatisch Dateien hochlädt, die ich garnicht bearbeitet hatte (Remote Synchronisation), dann wird die Datei überschrieben und der Fileowner neu gesetzt.

function checkFileWritable($file)
{
    if(!file_exists($file))
    {
        file_put_contents($file, "");
    }
    if(!chmod($file, 0644))
    {
        $fileowner = fileowner($file);
        echo "counld not change File Permissions: $file, File Owner is: $fileowner";
        if(!chown($file, ftpUserID))
        {
            echo "counld not change File owner: $file ";            
            mail(mailadresse, "Schreibeprobleme","File: $file, File Owner is: $fileowner");
        }
    }
}