Kategorien
Server Administration

E-Mails an Google Mail landen im Spam

Beim Versenden von Mails an Google Mail/Gmail kam es bei mir immer zu einer Bounce E-Mail von Google mit der folgenden Nachricht:

gmail-smtp-in.l.google.com[2a00:1450:4013:c01::1a] said: 550-5.7.1
    [2a01:4f8:160:61b3::2      12] Our system has detected that this 550-5.7.1
    message is likely unsolicited mail. To reduce the amount of spam sent
    550-5.7.1 to Gmail, this message has been blocked. Please visit 550-5.7.1
    http://support.google.com/mail/bin/answer.py?hl=en&answer=188131 for 550
    5.7.1 more information. u49si23102713eef.172 - gsmtp (in reply to end of
    DATA command)

Die Nachricht ist sehr allgemein und unter dem Link findet man keine direkte Lösung. Bei mir hat folgendes geholfen:

Die Nachricht deutete daraufhin das der Absender-Mail von einer IPV6 Adresse gesendet worden ist: 2a01:4f8:160:61b3::2 und deshalb habe ich Postfix umgestellt auf IPV4 und voila, es hat geklappt:

vi /etc/postfix/main.cf

Zeile ändern:  inet_protocols = ipv4 und Postfix neustarten und fetig – keine Boune Mail von Gmail!

Kategorien
Phonegap/Cordova

Phonegap bessere native Performance mit Steroids

Phonegap hat die große Schwachstelle, dass die Peerformance der UIs sehr langsam ist, dagegen gibt es ein Projekt namens Steroids welches es ermöglicht z.B. native Listviews zu benutzen und so die Performance merklich zu steigern, absolut empfehlenswert.

Meiner Meinung nach sollte Phonegap nicht ohne Steorids verwendet werden!

Kategorien
JavaScript PHP

PHP-Funktionen in JS benutzen mit php.js

Wer vermisst es nicht: High Level Funktionen, die einem die einfachsten arbeiten abnehmen in Javscript. Von PHP ist man immer gewöhnt schlanken, gut lesbaren Code zu schreiben, auch dank der vielen eingebauten Hilfsfunktionen, wie z.B. für die String Verarbeitung:

  • strncmp
  • strpbrk
  • strpos
  • strrchr
  • strrev
  • strripos
  • strrpos
  • strspn
  • strstr
  • strtok
  • strtolower
  • strtoupper
  • strtr

Dies ist zeit langem schon möglich durch eine Javascript Library namens php.js, die fast alle PHP Funktionen nach Javascript portiert hat und für PHP Programmierer sicher eine gute Hilfe ist.

Kategorien
Diverses

Maxdome oder Watchever?

Ich habe mir einen Zugang für Maxdome sowie Watchever besorgt und ein paar Wochen ausprobiert, welche die beste ist. Dabei gab es ein unerwartet klares Ergebnis: Watchever hat mehr zu bieten, ist einfacher zu bedienen und man wird nicht abgezockt. Was mich bei Maxdome extrem gestört hat, ist die Masche Serien als kostenlos zu kennzeichnen und dann nur die alten Folgen damit zu meinen, die neueren sind alle kostenpflichtig, das betrifft alle neuen Serien: Big Bang Theory, Two And A Half Man etc.

Bei Maxdome wird man immer dazu verleitet doch für eine Serie 1,99€ zu bezahlen (pro Folge!) oder 8,99€ für einen neuen ehemaligen Kinofilm. Bei Watchever ist einfach alles umsonst und es brauch nicht extra gefiltert werden. Die Bedinung ist bei Watchever besser gelöst und macht auch auf dem SmartTV Spass.

Auf meinem Samsung SmartTv musste ich ein paar Tricks anwenden, weil scheinbar Maxdome exklusiv den Platz gebucht hat und Watchever  ausgeschlossen werden sollte.

Mein Fazit: Bei selbem Preis von 8,99€ im Monat ist immer Watchever zu bevorzugen. Wer wenigen Werbung schaltet, der kann seinen Kunden mehr bieten!

Kategorien
Yii Framework

Yii Griedview ID nicht definiert

Wenn man die Yii Gridview benutzt, um bei Dataprovider Daten schnell in eine Tabelle zu verpacken, muss man aufpassen, dass man definiert, was die eindeutige ID jeder Zeile ist. Bei einem CArrayDataProvider muss man das Attribut „keyField“ setzen :

$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CArrayDataProvider($myData, array("keyField" => "myKeyFieldName")),
        )
    ));
    ?>

ansonsten gibt es eine Fehlermeldung:

xxx.id nicht definiert

Man muss aufpassen, welchen Dataprovider man benutzt, bei einem CActiveDataProvider heißt das Attribut dann wieder anders – Achtung!: „keyAttribute“

$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CActiveDataProvider($myActiveRecords, array("keyAttribute" => "myKeyFieldName")),
        )
    ));
    ?>
Kategorien
JavaScript jQuery PHP

Cross Domain Ajax Requests

Von Hause aus sind Cross Domain Ajax Requests aus Sicherheitsgründen nicht erlaubt, weil so fremder Schad-Code beim Client nachgeladen und ausgeführt werden kann.

Um trotzdem einen erfolgreichen Ajax Request auf eine andere Domain oder Subdomain oder auch nur von HTTP auf HTTPS zu senden, muss man die Access-Control-Allow-Origin beachten.

Man muss nicht jsonp benutzen, wie viele vorschlagen, sondern kann normales json benutzen (der Ajax Request von www.mydomain1.de gesendet):

<script>
    $.ajax({
        url: "http://www.mydomain2.de/ajax.php",
        type: 'GET',
        crossDomain: true,
        dataType: 'json',
        success: function(data) {
            console.log( data );
            $( ".result" ).html( data );
        },
        error: function( data) {
            console.log("error ajax");
            console.log( data );
        }
    });
</script>
<div class='result'></div>

Auf der eigene mydomain2.de/ajax.php Seite muss nur folgender Code eingebunden werden, um die Access-Control-Allow-Origin zu umgehen:

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://www.mydomain1.de');

echo json:encode("it works");
die();
Kategorien
Yii Framework

Yii PHP Objekte übergeben nach Javascript

Es gibt verschiedene Varianten die PHP Variablen und Objekte nach Javascript zu übergeben:

1. mit PHP json_encode()

var employmentTypesIds = <?php echo json_encode($employmentTypesIds)?>;

2. per Extension mit Active Record Relationen! – carjson

3. per Script Übergabe:

$cs->registerScript('php_vars',
            'messages1 = '.CJSON::encode(Yii::app()->createAbsoluteUrl("/messages/hello")).';'.
            'messages1 = '.CJSON::encode(Yii::app()->createAbsoluteUrl("/messages/goodbye")).';'
        );
Kategorien
Yii Framework

Yii Session Handling über die Datenbank aktivieren

Aus Sicherheitsgründen kann man die Session mit Yii nicht über das Dateisystem, sondern über die Datenbank verwalten lassen automatisch und die Sessionvariable verschlüsseln.

Folgende Konfiguration ist dafür notwendig:

'components' => array(      
     'session'=>array(
            'class' => 'system.web.CDbHttpSession',
            'connectionID' => 'db',
            'sessionTableName' => 'session',
            'autoStart'=>true,
            'cookieMode'=>'only',
            //'savePath'=>'/tmp',
            'sessionName'=>'connected_session',
            'timeout'=>60*60,// 1 hour
            'useTransparentSessionId'=>false,
        ),
Kategorien
IT-Recht SEO

Google Analytics Universal Search datenschutzkonform einsetzen

Es hat sich viel verändert! Sehr gut erklärt hier.

Kategorien
Yii Framework

Yii CGridView Custom Header für Pdf Generierung

Um ein PDF generieren zu können mit mpdf, muss man die thead-Tags entfernen, da diese nicht umgewandelt werden von mpdf. Dazu kann man die folgende Klasse verwenden:

Yii::import('zii.widgets.grid.CGridView');

class PDFGridView extends CGridView {

    public function renderTableHeader() {
        $options['class'] = 'pdf-grid-header';
        echo CHtml::openTag('tr', $options) . "\n";
        foreach ($this->columns as $header) {
            $header->renderHeaderCell();
        }
        echo CHtml::closeTag('tr') . "\n";
    }
}

View:

 $this->widget('PDFGridView', array(...)