Busqueda sobre Linux y software libre

Noticias sobre linux y software libre - Google 

Conectando PHP con SendMail

Este mensaje va a propósito de un problema de codificación no resuelto
aun en otra hilera de la lista. Así que a modo de explicar el problema,
les cuento cómo se programó el helpdesk de nuestra empresa, para
documentarlo para mi mismo y para compartirlo con la comunidad.

Para quienes no lo tienen claro, los helpdesk son sistemas de atención
al usuario. En este caso, es para solicitar soporte informático.

La idea es que el usuario final escriba un mensaje de correo a

helpdesk@mioficina.org.bo

y el mensaje entre en el sistema helpdesk. No solo eso. Automáticamente
debería crear un registro en una base de datos, notificar al
administrador por email, modificar un registro estadistico, devolver un
reporte y un código de ticket al solicitante y varias cosas más.

Así que, usando Fedora, y aprovechando varias clases en PHP ya hechas
resolvimos el problema. Lo explico por partes.

1. Alias que disparan procesos
==============================

El archivo /etc/aliases no solamente redirecciona correos a casillas,
sino que lo puede hacer... ¡a scripts!

Se hace así. Añadimos la siguiente línea a /etc/aliases:

helpdesk: "|/usr/bin/helpdesk"

(ojo con el pipe o "|")

y luego, le damos permisos de ejecución con chmod. Pero aun no
funcionará. El sistema smrsh es quien vigila que sendmail sea seguro. Más en

http://adf.ly/1eKB4X


Debemos enlazar el archivo a /etc/smrsh. Si no está enlazado, obtenemos el error
"Service Unavailable" en /var/log/maillog

# ln -s /usr/bin/helpdesk /etc/smrsh/helpdesk

# ls -l /etc/smrsh/

-rwxr-xr-x 1 root root 19K May 3 2006 vacation*
lrwxrwxrwx 1 root mailman 29 May 31 2006 mailman -> /usr/lib/mailman/mail/mailman*
lrwxrwxrwx 1 root root 17 Jun 1 11:50 helpdesk -> /usr/bin/helpdesk*

2. Obteniendo el Contenido de STDIN con PHP
===========================================

Ahora viene lo simple: Obtener el contenido del mensaje con PHP:

#!/usr/bin/php -q


Listo. En el ejemplo, $lines es un array con todas las lineas de texto. En nuestro caso,
lo volvimos un solo texto:

$lines = file('php://stdin');
$text=implode("", $lines);
$email=New emailMessage($text);

Ahí hacemos lo que queramos. Estamos en PHP. Podemos enviar mensajes, cargar registros en bases de datos,
y en fin, el resto es facil. Pongo un ejemplo de procesamiento con el objeto emailMessage recién mencionado,
que programamos a punta de regex.

3. La clase emailMessage
========================
$value) $hdrArray[$key]=trim($value, TRIM_CHARS);
}

function emailMessage($allText) {
$this->allText=trim($allText, TRIM_CHARS);

// Obteniendo el FROM del mensaje:

preg_match('/^From (.*)\n/', $allText, $line);
$this->from1=$line[1];

// Obteniendo los headers como un array y el body como un solo texto.

$this->getParts($this->allText, $this->headers, $this->fullBody);

preg_match('/.*?([A-Za-z0-9._-]+@[A-Za-z0-9._-]+).*/', $this->headers['From'], $line);
$this->from=$line[1];

// Igual, con el boundary:

preg_match('/.*?boundary="(.*)".*/', $this->headers['Content-Type'], $line);
$this->boundary=$line[1];

$this->rawSections=preg_split("/".$this->boundary."/", $this->fullBody);

// Quitamos los limites del mensaje

array_shift($this->rawSections);
array_pop($this->rawSections);

foreach($this->rawSections as $key=>$text) {
$text=trim($text, TRIM_CHARS);
$this->getParts($text, $hdrArray, $bodyText);
$this->bodyHeaders[$key]=$hdrArray;
$this->bodyParts[$key]=trim($bodyText, TRIM_CHARS);
}
}
}
?>

Cómo lo usamos:

from."\n";
echo "------------------- Headers: \n";
print_r($email->headers);
echo "------------------- Ejemplo uso header Subject: ".$email->headers['Subject']."\n";

echo "------------------- Array bodyHeaders de cada seccion: \n";
print_r($email->bodyHeaders);

echo "------------------- Tipo de mensaje en la primera seccion: \n".$email->bodyHeaders[0]['Content-Type']."\n";

echo "------------------- Body Completo: \n";
print_r($email->body);
echo "\n";

echo "------------------- Body 0: \n".$email->body[0]."\n";
?>

Ejemplo:

> ./simple.php < mailjaime.txt ------------------- From: jaime.suarez@mioficina.org.bo
------------------- Headers:
Array
(
[Received] => from JaimeSL ([10.0.0.142]) by mail.mioficina.org.bo (8.13.7/8.13.7) with ESMTP id l99ItF6K001300 for <helpdesk@mioficina.org.bo>; Tue, 9 Oct 2007 14:55:15 -0400
[From] => "Jaime Suarez." <jaime.suarez@mioficina.org.bo>
[To] => <helpdesk@mioficina.org.bo>
[Subject] => problema
[Date] => Tue, 9 Oct 2007 14:55:02 -0400
[Message-ID] => <001d01c80aa5$e61693a0$b243bae0$@heredia@padep.org.bo>
[MIME-Version] => 1.0
[Content-Type] => multipart/alternative; boundary="----=_NextPart_000_001E_01C80A84.5F04F3A0"
[X-Mailer] => Microsoft Office Outlook 12.0
[Thread-Index] => AcgKpeYDOTJjsYP+SF6kpQ1wFcULSQ==
[Content-Language] => es-bo
... (Cortado por razones obvias)
)
------------------- Ejemplo uso header Subject: problema
------------------- Array bodyHeaders de cada seccion:
Array
(
[0] => Array
(
[Content-Type] => text/plain; charset="iso-8859-1"
[Content-Transfer-Encoding] => quoted-printable
)

[1] => Array
(
[Content-Type] => text/html; charset="iso-8859-1"
[Content-Transfer-Encoding] => quoted-printable
)

)
------------------- Tipo de mensaje en la primera seccion:
text/plain; charset="iso-8859-1"
------------------- Body Completo:
Array
(
[0] => No funciona mi mouse.
...
)



Ads by CJ - Linux Foundation

Share This