Palavras-chave: PHP, enviar, e-mail, email, gmail, evolution
Uma das coisas mais chatas em PHP é enviar email. Não por causa do PHP, mas porque cada software cliente de email trata os headers de uma maneira diferente.
Passei uma madrugada dessas quebrando a cabeça, porque os emails funcionavam no Evolution, mas não no Gmail. Depois funcionavam no Gmail, mas não no Evolution. Quando consegui fazer funcionar nos dois, empacotei tudo numa classe.
E aí está, para ajudar outros a não quebrarem a cabeça :-)
<?php /* * Classe Mail * para envio de emails */ class Mail { private $parts; /* * Método construtor */ function __construct() { $this->parts = array(); $this->boundary = md5(time()); } /* * Adiciona HTML */ function addHtml($body) { $body = stripslashes($body); $msg = "--{$this->mime_boundary}\\n"; $msg .= "Content-Type: text/html; charset=ISO-8859-1\\n\\n"; $msg .= $body; $this->parts[] = $msg; } /* * Adiciona Texto */ function addText($body) { $body = stripslashes($body); $msg = "--{$this->mime_boundary}\\n"; $msg .= "Content-Type: text/plain; charset=ISO-8859-1\\n\\n"; $msg .= $body; $this->parts[] = $msg; } /* * Adiciona Imagem */ function addPng($filename, $download) { $fd=fopen($filename, 'rb'); $contents=fread($fd, filesize($filename)); $contents=chunk_split(base64_encode($contents),68,"\\n"); fclose($fd); $msg = "--{$this->mime_boundary}\\n"; $msg .= "Content-Type: image/png; name={$download}\\n"; $msg .= "Content-Transfer-Encoding: base64\\n"; $msg .= "Content-Disposition: attachment; filename={$download}\\n\\n"; $msg .= "{$contents}"; $this->parts[] = $msg; } /* * Envia Email */ function send($from, $to, $subject) { $headers = "From: {$from}\\n"; $headers .= 'Content-Type: multipart/mixed; boundary="'.$this->mime_boundary."\"\\n"; $headers .= 'X-Mailer: PHP-' . phpversion() . "\\n"; $headers .= "Mime-Version: 1.0\\n\\n"; $msg = implode("\\n", $this->parts); mail($to, $subject, $msg, $headers); } } ?>
Perfeita essa classe. Já a adicionei em meu framework. Parabéns.
Ou você pode evitar reinventar a roda e usar o Mail_Mime do PEAR, que é mais robusto.
http://pear.php.net/manual/en/package.mail.mail-mime.example.php
Parabéns pela classe. Vai ajudar bastante…
Não funciona pro Outlook…
Isso dá pra adicionar attachments? Ou só imagens dentro do mail a enviar?
rsrsrsrs
funciona pra Globo.com?
Porque eu utilizei a função normal mail() do php sem tantas especificações no headers, e o único que não recebeu foi o e-mail da Globo.
Aguardo notícias,
Grato.
Parabéns pela classe. Vai ajudar bastante…