Archivo de la etiqueta: email

PHP, IMAP y encoding

Hoy sí que estuve renegando con los encoding y las funciones IMAP de PHP. El problema es que hay dos encodings, uno es el encoding de caracteres del body (UTF-8, ISO, etc.) y otro el encoding “quotable string” que es una especie de encoding de transporte. El tema es que para lograr, por ejemplo, que los mails que obtenemos de un servidor vengan en UTF-8 tenemos que hacer toda esta magia:


private function _get_plain_text_email_body($inbox, $email_number) {
 $st = imap_fetchstructure($inbox, $email_number);

 $body = null;
 $is_html = false;

 if (!empty($st->parts)) {
 for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
 $part = $st->parts[$i];
 if ($part->subtype == 'PLAIN') {
 $body = imap_fetchbody($inbox, $email_number, $i+1);
 $part = $st->parts[$i+1];
 break;
 } elseif ($part->subtype == 'HTML') {
 $body = imap_fetchbody($inbox, $email_number, $i+1);
 $part = $st->parts[$i+1];
 $is_html = true;
 // No break - keep looking for PLAIN part
 }
 }
 } else {
 // TODO: implementar el checkeo de encoding cuando los mails vienen SOLO en texto plano o SOLO en HTML
 if ($st->subtype == 'PLAIN') {
 $body = imap_body($inbox, $email_number);
 } elseif ($st->subtype == 'HTML') {
 $body = imap_body($inbox, $email_number);
 $is_html = true;
 }
 }

 $body = imap_qprint($body);
 $charset = 'UTF-8';

 if(!empty($part->parameters)){
 for ($k = 0, $l = count($part->parameters); $k < $l; $k++) {
 $attribute = $part->parameters[$k];
 if(strtolower($attribute->attribute) == 'charset'){
 $charset = $attribute->value;
 }
 }
 }
 echo "Body's character encoding: $charset";

 $bodytext = mb_convert_encoding($body, 'UTF-8', $charset);

// Probablemente querramos implementar un método para evitar tener contenido HTML en los mails.
//if ($is_html){
//$bodytext = convert_html_to_text($bodytext);
//}
 return $bodytext;
 }

De donde saqué parte de la solución: http://stackoverflow.com/questions/10462212/mail-reading-in-php-with-imap

Enviar mails con PyroCMS

PyroCMS tiene su propia forma de enviar mails. Usa unos templates guardados en la base de datos. Así se manda un mail en PyroCMS:

  Events::trigger('email', array(
            'slug' => 'messaging_email',
            'from' => 'myemailaddress@mydomain.com',
            'reply-to' => 'myemailaddress@mydomain.com',
            'to' => $to,
            'subject' => $email_data['subject'],
            'body' => $email_data['body']
        ), 'array');

Para crear un template en la base de datos, es ir a Design / Email Templates y agregar un template. Este template tiene que tener el mismo “slug” que el que se indica en el trigger.