oriolrius.cat

Des del 2000 compartiendo sobre…

Tag: mail

phpMailer – una classe de PHP per enviar emails

Reading time: 5 – 8 minutes

En PHP quan s’ha d’enviar un email sovint s’usa la funció mail() tot i que aquesta és una mica limitada en quan a paràmetres que se li poden passar al servidor SMTP. Per exemple, temes d’autenticació i xifrat. Via pear hi ha diverses solucions però a vegades cal que la solució que incorpori el nostre aplicatiu sigui independent d’aquest tipus de requisits de sistema. Així doncs phpMailer ens pot servir per sortir de més d’un embolic.

Suporta:

  • Can send emails with multiple TOs, CCs, BCCs and REPLY-TOs
  • Redundant SMTP servers
  • Multipart/alternative emails for mail clients that do not read HTML email
  • Support for 8bit, base64, binary, and quoted-printable encoding
  • Uses the same methods as the very popular AspEmail active server (COM) component
  • SMTP authentication
  • Word wrap
  • Address reset functions
  • HTML email
  • Tested on multiple SMTP servers: Sendmail, qmail, Postfix, Imail, Exchange, etc
  • Works on any platform
  • Flexible debugging
  • Custom mail headers
  • Multiple fs, string, and binary attachments (those from database, string, etc)
  • Embedded image support

Un petit exemple d’ús perquè vegeu el senzill que és usar-lo:

require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();                                   // send via SMTP
$mail->Host     = "smtp1.site.com;smtp2.site.com"; // SMTP servers
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "jswan";  // SMTP username
$mail->Password = "secret"; // SMTP password
$mail->From     = "from@email.com";
$mail->FromName = "Mailer";
$mail->AddAddress("josh@site.com","Josh Adams");
$mail->AddAddress("ellen@site.com");               // optional name
$mail->AddReplyTo("info@site.com","Information");
$mail->WordWrap = 50;                              // set word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz");      // attachment
$mail->AddAttachment("/tmp/image.jpg", "new.jpg");
$mail->IsHTML(true);                               // send as HTML
$mail->Subject  =  "Here is the subject";
$mail->Body     =  "This is the <b>HTML body</b>";
$mail->AltBody  =  "This is the text-only body";
if(!$mail->Send())
{
   echo "Message was not sent <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
echo "Message has been sent";

Aquesta troballa l’he fet a través de l’article phpMailer , a great Email transfer class del blog de Moody Bahrain.

cleanup-maildir – netejant el maildir

Reading time: 2 – 2 minutes

Avui he trobat aquest article Cleanup Maildir folders (archive/delete old mails) | MDLog:/sysadmin i no he dubtat ni un segon en baixar-me l’script: cleanup-maildir (local) programat en python. De fet, el seu nom ja diu molt del que fa. Bàsicament jo l’uso per netejar el directori Junk. És a dir, allà on rebo les alertes de correus considerats spam, virus, phishing o d’altres malwares. És a dir, he posat l’script al cron i li he dit que el contingut de la carpeta Junk del maildir que tingui més de 15 dies es vagi eliminant. Així no m’he de preocupar d’anar borrant de forma periódica tot el correu mailiciós que ja mai miraré perquè ningú m’ha dit allò tan famós de: “T’he enviat un correu, no ho has vist?” i llavors comences a buscar per la carpeta on hi ha tota la brossa a veure si el troves. Doncs bé, ara només hi haurà 15 dies de brossa.

Realment és un script molt xorra però que el trobo molt útil, ja que té força opcions com per exemple no borrar els correus marcats com a llegits, o com a importants, o crear automàticament subcarpetes on guardar els correus que tenen una antiguitat determinada. Segurament encara em deixo alguna funció però jo diria que la idea queda més que clara.

winmail.dat – aprofundint una mica en el tema

Reading time: 2 – 2 minutes

Quan enviem un email amb el MS Exchange com a proveedor de correu d’internet si aquest email conté un missatge amb format de texte enriquit (rich-text message) llavors el missatge estarà enmarcat entre una capçalera de descripció MIME per tal de poder informar al MUA destí quin format té la informació que conté el cos del missatge. Però si no li diem res al client de correu de MS aquest enviarà l’email dintre d’un fitxer adjunt anomenat winmail.dat. Aquest fitxer es codificarà en format uuencoded. (informació fonamentada en XCLN: Sending Messages In Rich-Text Format)

Obviament el que ens interessa als no-usuaris d’aquests serveis de MS és que això s’envii d’una forma molt més estàndard. Per tal de poder informar als usuaris de MS de com han de configurar el seu MUA es pot consultar l’article How to Prevent the Winmail.dat File from Being Sent to Internet Users.

Article 138053 de suport MS:

This article describes how either an Exchange Server administrator or end users can prevent the Winmail.dat attachment from being sent to Internet users when using the Microsoft Exchange Internet Mail Connector (IMC).

En poques paraules el que ve a dir l’article és que s’ha de buscar on posa Always Send To This Recipient In Microsoft Exchange Rich-Text Format en el menú de configuració del MS Exchange (en cas de que siguem admins), o del Outlook (en cas de ser users) i desmarcar la checkbox.

mailgateway: postfix+amavisd+clamav+spamassassin+sasl

Reading time: 3 – 5 minutes

Algunes empreses disposen de servidors de correu amb infraestructures internes realment complexes i que seguint la màxima de la informàtica el millor que podem fer és: si alguna cosa va no la toquis. El problema és que sovint aquestes estructures tan complexes no disposen de filtres de correu mailiciós. O sigui, no són capaces de passar antivirus al correu, filtrar l’spam i controlar altres enviaments maliciosos de correu. A més intentar afegir un software dins el propi servidor que ens fassi aquestes funcions sobre l’Mail Transport Agent (MTA) que ja tenim corrent és un risc innecessari i poc rentable moltes vegades.

diagrama-xarxa.png

Una solució que s’usa sovint és afegir un servidor només per filtrar el correu que entre i surt de l’empresa i intentar eliminar amb aquest mail-gateway tots els correus no dessitjats. Bàsicament doncs el que fem és col·locar l’SMTP (Simple Mail Transport Protocol) del mail-gateway com a porta d’entrada del correu extern. Després modifiquem el servidor intern de correu perquè tots els correus que hagi d’enviar cap a fora ho fassi a través del mail-gateway. O sigui, posem com a servidor de relay fix del servidor intern la direcció del MTA del gateway.

Amb aquest escenari els usuaris no han de canviar res de res, ja que només estem intervenint el port 25/tcp, o sigui, l’SMTP. A més al servidor intern de correu podem crear una compte de gestió de correo mailiciós, per exemple mailgateway@exemple.com (sent exemple.com el nostre domini). En aquest compte li creem dues carpetes una que es digui spam i l’altre que es digui ham. El que farem és sincronitzar el correu d’aquestes comptes amb una carpeta del mail-gateway (si les comptes són IMAP és bona idea sincronitzar-les amb l’offlineimap). Quan tinguem aquests correus al mail-gateway li direm als filtres bayessians de l’antispam que aprenguin com és el correu maliciós que no és capaç de filtrar i com és el correu que ha filtrat i que era legítim.

Aquesta compte de correu (mailgateway@exemple.com) que hem creat al servidor intern, la podem configurar com a compte de correu secundaria a un administrador de la xarxa. Així aquest podrà gestionar el manteniment sense haver de tocar el mail-gateway. En cas de que hi hagi algún usuari de la xarxa que vulgui localitzar un correu que s’ha filtrat l’administrador ho podrà fer des d’aquesta compte.

A més pels usuaris que estan fora de l’empresa, delegacions o d’altres similars ens pot interessar autenticar l’SMTP per tal de que aquests usuaris puguin usar l’SMTP del mailgateway per enviar correu. Així doncs, aprofitarem el servei d’IMAP (Internet Message Access Protocol) del servidor intern per validar l’autenticació en l’SMTP. Sona una mica extrany però el mètode és ben senzill. Es tracta d’aprofitar la compte l’usuari i clau que tenen els usuaris en el servidor IMAP intern, llavors es configura el MUA perquè usi aquestes dades com a informació per autenticar l’SMTP i el servidor d’MTA quan rep una autenticació via SMTP el que fa és obrir una connexió IMAP contra el servidor intern i provar l’usuari i clau que el client l’hi ha enviat a l’SMTP si això és correcte l’MTA permet enviar correu al MUA amb l’origen i destí que vulgui.

La documentació d’aquest projecte la podeu trobar al wiki:

mail-gateway_amb_amavisd-new

Tenir-la al wiki em permet anar-a millorant i esta sempre localitzada.

Si teniu alguna cosa que no esta clara, petició o demanda del tipus que sigui sobre aquesta documentació podeu penjar els comentaris en aquest post.

La comanda EHLO (del SMTP) no funciona en remot amb un Postfix

Reading time: 2 – 2 minutes

Just el problema que descric al títol m’ha fet perdre una bona estona aquest matí, de fet, m’ha fet anar de cul. M’estava tornant boig connectava al port 25 des de dintre de la LAN:

$ telnet IP_XARXA_LOCAL 25
Trying IP_XARXA_LOCAL...
Connected to IP_XARXA_LOCAL.
Escape character is '^]'.
220 ESMTP
ehlo prova
250-nom_servidor
250-PIPELINING
250-SIZE 20480000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

Si connectava des d’una IP de fora de la xarxa local:

$ telnet IP_PUBLICA 25
Trying IP_PUBLICA...
Connected to IP_PUBLICA.
Escape character is '^]'.
220 ******************
ehlo prova
502 Error: command not implemented
quit
221 Bye
Connection closed by foreign host.

M’he repassat tropocientes vegades la documentació del postfix a veure quina opció era la que feia comportar al servidor SMTP de forma diferent si estava en una IP de la xarxa local o una IP externa a la xarxa. Però no he trobat res de res, al final he trobat en un fòrum la inspiració divina. El problema era del coi de Cisco PIX que tenia entremig. El molt cabron m’estava filtrant la connexió!!!

Així que m’he hagut de connectar al PIX i dir-li que deixes de tractar el tràfic del port 25 com a tràfic SMTP, perquè no l’hi apliqués cap filtre:

pix # show fixup
fixup protocol dns maximum-length 512
fixup protocol ftp 21
fixup protocol h323 h225 1720
fixup protocol h323 ras 1718-1719
fixup protocol http 80
fixup protocol rsh 514
fixup protocol rtsp 554
fixup protocol sip 5060
fixup protocol sip udp 5060
fixup protocol skinny 2000
fixup protocol smtp 25
fixup protocol sqlnet 1521
fixup protocol tftp 69
pix # conf te
pix(config)# no fixup protocol smtp 25

Només amb aquest tonteria ja podia saludar al postfix (servidor SMTP) amb la comanda EHLO que em permet cursar autenticacions i d’altres comandes avançades de l’SMTP (ESMTP).