Rubrika „Tipy pro vývojáře“

Postfix and setting Return-path in PHP

Sobota, 28 duben 2012

I noticed recently that some mails from our server have been marked as spam. I’m using Zend_Mail whenever I can for sending mail in PHP. For example this little email.

$mail = new Zend_Mail();
$mail->setSubject('Hello World')
->setBodyText('This mail is going to change your life.')
->addTo('vaclav.krajnak [at] clipsan [dot] com', 'Vaclav Krajnak')
->setFrom('info [at] clipsan [dot] com', 'Clipsan')
->setReturnPath('bounce [at] clipsan [dot] com')
->setReplyTo('info [at] clipsan [dot] com', 'Clipsan')
->send();

Mails from one server were ok, from other not. I found out that the ones that have been send via Postfix causing trouble. I found out that the Return path is ignored by Postfix and replaced with www-data [at] clipsan [dot] com where clipsan.com is in /etc/mailname. Markus has written a post PHP und Postfix: Return-path setzen how you can fix this using common mail() function of PHP.

mail("vaclav.krajnak [at] clipsan [dot] com", "Hello World", "This mail is going to change your life.", "From: info [at] clipsan [dot] com", "-fbounce [at] clipsan [dot] com");

Yeah but I hate to work with the mail() function directly:) So I went deep into Zend Framework and searched the class Zend_Mail_Transport_Sendmail. It passes the parameters given in constructor as the fifth parameter to the mail() function it calls. That’s what we need. I have to create the Transport object by myself and not leave it to Zend Framework to handle it.

$transport = new Zend_Mail_Transport_Sendmail("-fbounce [at] clipsan [dot] com");

Of course we don’t want to prevent any other Transport that is used when sending, so I set the Default Transport instead of passing $tranport directly to send() method. The final example is this:

$mail = new Zend_Mail();
$mail->setDefaultTransport(new Zend_Mail_Transport_Sendmail("-fbounce [at] clipsan [dot] com"));
$mail->setSubject('Hello World')
->setBodyText('This mail is going to change your life.')
->addTo('vaclav.krajnak [at] clipsan [dot] com', 'Vaclav Krajnak')
->setFrom('info [at] clipsan [dot] com', 'Clipsan')
->setReturnPath('bounce [at] clipsan [dot] com')
->setReplyTo('info [at] clipsan [dot] com', 'Clipsan')
->send();

Please notice that the setDefaultTransport method does not support method chaining.

Hope this helps, happy mailing…

Vždy nejnovější jQuery přes Google CDN

Pátek, 24 únor 2012

jQuery je knihovna, která velmi zjednodušuje běžné operace v javascriptu.

Na stránky ji můžete dát tak, že ji stáhnete ze stránek jquery.com a v HTML na ni normálně odkážete v hlavičce.

<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>

Problém je, že jQuery i v minimalistické má přes 90 Kb a tak její načtení nějakou chvíli zabere. Pokud máte zákazníky v US a stránky na serveru v Čechách, je těch 90 Kb docela dost. Pro zrychlení je možné použít sdílení přes CDN – Content Delivery Network. To znamená, že soubor je uložen na více místech po světě se stejnou adresou a k uživateli se dostane z toho nejbližšího serveru. Další výhoda je, že se soubor cachuje u uživatele a je pravděpodobné, že jej má uložen už z nějaké úplně jiné stránky, kterou navštívil.

Zde je příklad s jQuery CDN a Google CDN :

<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

Google CDN umí ještě jedno vylepšení, které není dokumentováno. Alespoň já jsem jej nikde nenašel. Pokud máte několik desítek webů jako my, aktualizace  jQuery a sledování verzí je docela náročné. Na a to vylepšení spočívá v tom, že zaměníte verzi jQuery za číslo 1. Máte tak zaručeno, že používáte vždy nejnovější verzi jQuery bez nutnosti aktualizace.

Výsledek je tedy:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

To samé platí i pro jQuery UI, která má necelých 200 Kb:

<script type="text/javascript" src="http://ajax.googleapis.com//ajax/libs/jqueryui/1/jquery-ui.min.js"></script>

Další info o Google CDN je zde http://code.google.com/intl/cs-CZ/apis/libraries/devguide.html#jquery.