PHP

PHPMailer e l’errore “The following From address failed:”

PHPMailer è una classe che utilizzo per l’invio delle newsletter e che preferisco al sistema di invio Email di CakePHP perchè la ritengo più affidabile (ormai sono anni che la impiego senza problema).
Ultimamente con un server di posta SMTP ho avuto qualche problema con l’invio dell’email all’interno di un ciclo.
Ovvero volendo inviare nuovamente la stessa email dopo aver ricevuto un errore per via di alcuni indirizzi di destinatari non esistenti (invio con BCC) ho ricevuto l’errore “The following From address failed: miaemail@luizz.it”.

Andando a spulciare nel codice e guardando bene il debug ho notato che il problema era legato all’errata sequenza di comandi SMTP che si veniva a creare, quindi è sufficiente eseguire il metodo “$mailer->SmtpClose();” dopo l’invio dell’email “$mailer->Send()” per forzare la chiusura della connessione.

La chiusura della connessione dovrebbe avvenire automaticamente impostando la proprietà “$mailer->SMTPKeepAlive” su false, ma ciò evidentemente, in presenza di un errore e dell’intercettazione della Exception che viene generate, non avviene.

Generare documenti RTF: la soluzione finale ?

E’ risaputo che la strada più semplice per produrre documenti formattati e stampabili nelle applicazioni web è quella di creare un file PDF al volo, usando una delle diverse librerie disponibili (la mia preferita rimane comunque FPDF).
Nelle applicazioni gestionali capita frequentemente che il cliente richieda la produzione di un documento da trattare con MS-Word e che abbia una formattazione predefinita e allora le soluzioni diventano più complesse: si potrebbe pensare a interfacciare PHP con OpenOffice usando ad esempio, la libreria PHP DocWriter oppure usare le funzioni COM per interfacciarsi direttamente a MS-Word.
Queste due strade sono poco percorribili quando l’applicazione deve girare su uno spazio web su server in hosting condiviso per via dell’impossibilità di installare a proprio piacimento librerie o applicazioni aggiuntive.
Ecco allora che una soluzione più facilmente realizzabile è la produzione di un documento RTF con una libreria che, secondo me, è nel panorama open source la più completa in assoluto, la più documentata in assoluto, la più ben fatta in assoluto: PhpRtf (http://www.phprtf.com).
Nonostante la versione attualmente distribuita è la 0.3, questa libreria risulta molto stabile e presenta le funzioni necessarie per creare i principali elementi di un documento RTF: Intestazioni e piè di pagina, tabelle, immagini, link, bordi, sflondi, sessioni…. che altro vi serve ?
Usando la programmazione a oggetti è stata realizzato un set di classi che possono essere usate con molta semplicità e molta flessibilità, grazie anche alla documentazione delle API realizzata con phpDocumentor.
Per creare un documento è sufficente istanziare la classe principale, aggiungere una sezione e cominciare a scrivere del testo nella sezione.
Una comodità che si può apprezzare usando la classe è quella dell’uso di tag all’interno del testo in stile HTML per la formattazione semplice e l’inserimento di elementi quali data corrente e numero di pagina.
L’integrazione con CakePHP è immediata utilizzando la funzione vendor.


vendor("rtf/rtf/Rtf");
$rtf = new Rtf();
$sect = &$rtf->addSection();
$sect->writeText('Hello World.', new Font(12), new ParFormat('center'));
$rtf->sendRtf('Hello World');

Questo è uno dei vari esempi presenti nel sito dal quale trarre spunto.

Stampare un PDF “in silenzio”

Non sempre si ha la necessità di leggere un file PDF… a volte si vuole inviare tutto direttamente alla stampante senza troppo rumore.

In un sistema Windows si può utilizzare Adobe Acrobat Reader per eseguire la stampa di un documento PDF direttamente da riga di comando.
Cosa c’entra questo con il PHP ? Basta usare exec() …..

Tutorial ed esempi in rete
Can I print a PDF directly to a printer?
iText: a freeJava-PDF library
How To: Reader command line printing (direttamente da Adobe)

SET LOCALE

Impostazione dei formati in base alla lingua
Come impostare il formato di data, valuta, ecc. in base alla lingua scelta, per evitare noiosi script di traduzione.

Il comando setlocale permette di impostare i parametri di localizzazione che danno la possibilità di utilizzare date e valute in base alla lingua scelta.
Link al manuale
Il comando funziona in base al sistema operativo installato che interpreta in modo diverso il parametro category
Per rendere il comando utilizzabile sia su sistemi Windows che Linux ho cercato il maggior numero di stringhe riconoscibili da passare alla funzione come parametro category
Quindi ho creato un array delle lingue utilizzate da impiegare in fase di impostazione.

Questo è il codice di esempio che ho impiegato:


/*
 associazione della lingua scelta con le stringhe di identificazione
 di LOCALE (setlocale)
 tutte le stringhe specificate sono ricavate dal riferimento
 ISO 639 e dal sito Microsoft
 vedi http://www.w3.org/WAI/ER/IG/ert/iso639.htm e 

http://msdn.microsoft.com/library/default.asp

      ?url=/library/en-us/vclib/html/_crt_language_strings.asp
*/
$lan_locale = array('ita'=>array('it_IT','ita','italian'),
           'spa'=>array('esp','spanish','es_ES','spa','esl'),
           'eng'=>array('eng','en_EN','eng','english'),
           'fra'=>array('fra','fre','fr','french'),
           'deu'=>array('deu','de_DE','german'),
           'por'=>array('por','pt','portuguese','ptg'),
           'chi'=>array('chi','zho','zh','chinese','chinese-simplified','chs')
);

/*
 LOCALE
 Imposta il formato delle stringhe in base alla lingua scelta
*/
$lan = 'ita';
$loc_value = setlocale(LC_ALL, $lan_locale[$lan]);

// tenta i differenti nomi possibili per le impostazioni passate
setLocale(LC_ALL,$loc_value);

Deploying your Site with PHPEclipse

http://www.devarticles.com

Un articolo in due parti sull’uso di PHPEclipse

Eclipse è un IDE per lo sviluppo che ha come caratteristica principale quella di poter essere personalizzato con dei plug-in.
PHPEclipse è la versione ottimizzata per sviluppare in PHP offrendo molti tool che ho trovato molto comodi.
1^ parte
2^ parte

Misurare il tempo di esecuzione degli script

Per conoscere il tempo di esecuzione di uno script basta tener conto del tempo di inizio e di quello finale e calcolare il tempo trascorso.


$time_start = microtime(true);

// Sleep for a while
usleep(100);

$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did nothing in $time seconds\n";

Questo esempio è presente nel manuale ufficiale del PHP nella pagina della funzione microtime() che restituisce un timestamp Unix in microsecondi.

Una pagina in cinese

Vi è mai capitato di ospitare una pagina web in cinese sul vostro sito? Fate una semplice prova: scaricate una pagina HTML da un sito in lingua cinese che si vede correttamente (impostate la giusta codifica nel browser) e trasferitela sul vostro server.
Nella maggior parte dei casi vi troverete a dover impostare manualmente la codifica dei caratteri del browsere per vedere correttamente gli ideogrammi al posto di simboli insignificanti.
Il perchè di questo comportamento è spiegato benissimo qui: Rappresentazione dei documenti HTML

Quindi la soluzione consiste semplicemente nell’inviare un header prima della pagina che avvisi il browser dell’esatta codifica da adottare per leggere tutti i caratteri.

header("Content-Type: text/html; charset=gb2312");


......

Ovviamente il set di caratteri 2312 corrisponde al cinese (semplificato).

Apache
Se utilizzate Apache come Web Server, è sufficente impostare il charset di default nel file di configurazione o con il file .htaccess che deve contenere la riga

AddDefaultCharset GB2312

per permettere al server di comunicare il charset del file che sta inviando

Extensions: altro che deccommentare la riga in php.ini

E’ risaputo che per caricare un modulo dinamico per il PHP in ambiente Windows è sufficente decommentare la relativa riga nel file php.ini e riavviare Apache.

Ad esempio, volendo installare il modulo dinamico php_domxml.dll, è sufficente rimuovere il punto e virgola all’inizio della riga
;extension=php_domxml.dll
presente nel file php.ini.
Dopo aver riavviato Apache si hanno a disposizione le funzioni che servono.

Ma con PHP 4.4.1 in ambiente Windows XP Pro potrebbe accadere che il modulo non venga caricato e vi sia una segnalazione di errore da parte di Apache.

Cercando sulla rete ho trovato questo programmino per verificare le eventuali dipendenze di una libreria DLL Dependency Walker.

E cercando ancora ho trovato un post di questo forum dove si indica una soluzione banale per un problema simile a quello che ho riscontrato.

E’ sufficente rinominare il file expat.dll presente nella directory C:\php\dlls (o similare) in libexpat.dll.