Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucaswxp

[Resolvido] Enviando múltiplos e-mails com autenticação SMTP

Recommended Posts

Olá pessoal, ensinarei vocês a criar um simples sistema de newsleter com o pacote Mail do PEAR. PEAR (PHP Extension and Application Repository), para quem não sabe, é um repositório de classes/pacotes e aplicações que facilitam sua vida. Áh pacote para tudo: texto, abstração de banco de dados, autenticação, e-mail, validações e etc… Site oficial: http://pear.php.net/

Vamos começar!

 

Baixe este arquivo: http://pear.php.net/go-pear.phar OBS: Não aconselho que abra ele direto no navegador, pois é bem possivel que trave tudo ;D Este é um arquivo de mais ou menos uns 4MB, é ele que vai instalar o PEAR para nós. Na mesma pasta onde você esta o interpretador do php (php.exe) crie outra chamada “PEAR” e dentro dela cole o go-pear.phar. OK! Agora abre o terminal (DOS, prompt, cmd etc…) e vá até a pasta que se encontra o “PEAR”

 

Utilize o comando “cd” no terminal para ir até a pasta, exemplo: cd C:\Arquivos de Programas\Php.

 

Agora vamos mandar o php interpretar o go-pear, na pasta onde se encontra o php.exe execute o seguinte:

php PEAR/go-pear.phar

Na primeira pergunta ele perguntará se quer instalar um sistema ou uma cópia local, apenas pressione Return (Enter). Na proximo ele perguntará se o layout de instalação estará correto, novamente apenas pressione Return. Agora o go-pear irá automaticamente baixar e instalar o PEAR para você. Agora vamos instalar os pacotes necessários para autenticação e e-mail. Agora, na pasta onde você instalou o php, terá alguns novos arquivos, como por exemplo: pear.bat. Agora você pode executar comandos por este arquivo. Ainda no terminal, na mesma pasta que se encontra o pear.bat, execute o seguinte comando:

pear channel-update pear.php.net

Isso atualizará o canal pelo qual o pear buscará os pacotes. Agora digite:

Ver código

pear install Mail

Isso instalará o pacote Mail, perceba que na pasta “PEAR” agora existe um arquivo chamado Mail.php e uma pasta chamada Mail. Agora vamos instalar uns complementos necessários. Digite:

pear install Net_SMTP

Isso intalará o complemento SMTP que cuidará da autenticação. Agora:

pear install Mail_mime

Isso instalará o complemento responsável por possibilitar o envio de anexos (não abordaremos nesse tutorial) e html no/com e-mail. Estes dois ultimos complementos não serão necessários caso você queria apenas enviar e-mails em formato txt e sem autenticação. Agora vamos começar a programar.

Tabela

 

Comecemos criando a tabela que conterá todos os e-mails para qual você quer enviar as news:

CREATE DATABASE `newsleter`;
CREATE TABLE `e-mails` (
  `id` int(11) NOT NULL auto_increment,
  `nome` varchar(62) default NULL,
  `e-mail` varchar(82) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `e-mails` VALUES (1,'Fulano da Silva1','fulano_da_silva1@hotmail.com');
INSERT INTO `e-mails` VALUES (2,'Fulano da Silva2','fulano_da_silva2@hotmail.com');
(...)

Criamos uma simples tabela com 3 colunas (id, nome, e-mail).

 

Formulário

 

Agora o formulario index.php:

<?php
if (isset($_GET['act']) && $_GET['act'] == 'send'):
   // Aqui onde chamaremos o método que envia os e-mails
endif;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sistema newsleter</title>
</head>
<body>
<form method="POST" action="?act=send">
Assunto: <input type="text" name="assunto" /><br />
Mensagem: <textarea name="mensagem"></textarea><br />
<input type="submit" value="Enviar e-mail" />
</form>
</body>
</html>

Ok! Nada de mais até aqui, apenas criamos o formulario com o conteudo do e-mail que envia para “index.php?act=send” e um if PHP que "detectará" quando a GET['act'] existir e for igual a “send”.

Classe PHP newsleter

 

Agora vamos começar a fazer a classe que fara a conexão com a base de dados, pegará os e-mails e enviará:

class newsleter {
const USER_MYSQL = 'root'; // User mysql
const SERVER_MYSQL = 'localhost'; // Server mysql
const PASSWORD_MYSQL = ''; // Senha mysql
const DB_MYSQL = 'newsleter'; // Base de dados mysql

const USER_SMTP = 'seu_email@hotmail.com'; // O e-mail SMTP aqui
const PASSWORD_SMTP = '123456'; // A senha do SMTP
const SERVER_SMTP = 'smtp.live.com'; // O host STMP, aqui utilizaremos o live

private $mysqli; // A variavel que conterá o ponteiro de conexão com o MySQLi

public function __construct(){
 $this->mysqli = new mysqli(self::SERVER_MYSQL,self::USER_MYSQL,
 self::PASSWORD_MYSQL, self::DB_MYSQL); // Nos conectamos com a base de dados utilizando as contantes declaradas no começo do script
 
 include_once 'Mail.php'; // Arquivo que enviará os e-mails e cuidará da autenticação (autenticação apenas se tiver instalar o Net_SMTP - e o Net_Socket que é seu complemento)
 include_once 'Mail/mime.php'; // Arquivo responsável por possibilitar o envio de anexos (não abordaremos nesse tutorial) e html no/com e-mail.
 }
 
 public function __destruct(){
 $this->mysqli->close(); // Fechamos a conexão
 }
?>

Bom, no começo nada de mais, apenas criamos a nossa classe e algumas constante e a propriedade responsável por conter o ponteiro da conexão mysql. No método construct nos conectamos à base de dados e atribuimos à propriedade $mysqli o ponteiro mysqli ($this->mysqli->…). No mesmo método nós chamamos as classes necessarios para nosso sistema, perceba que não inclui o caminho completo, exemplo:

C:\Php\PEAR\Mail.php e C:\Php\PEAR\Mail\mime.php

Isso porque o pear ja adicionou na diretriz “include_path” do PHP onde se encontra a sua pasta (PEAR). Mas se porventura não tenha adicionado você pode fazer isso no inicio de nosso método construct assim:

...
public function __construct(){
$PATH_PEAR = "COLOQUE AQUI O CAMINHO DO PEAR" // exemplo: C:\PHP\PEAR
ini_set('include_path' , $PATH_PEAR);
}
....

A função ini_set define o valor de uma opção de configuração. E por fim no método destruct encerramos a conexão com o mysql. Ok! Agora vamos criar o método responsavel por autenticar e enviar os emails:

 

Irei colocar (…) para referenciar tudo que ja fizemos antes, com o fim do código não ficar muito extenso:

 

(...)
public function enviar(){
$mensagem = $_POST['mensagem']; // Conteudo do formulario (campo 'mensagem')
 
$sql = 'SELECT * FROM `e-mails`'; // Query SQL que selecionará todos
$query = $this->mysqli->query($sql) or exit($this->mysqli->error); // Executamos a query
 
while($data = $query->fetch_array()): // Criamos um loop para para enviar os e-mails
// Este vetor representa o cabeçalho do e-mail
$header = array(
'From' => 'Nome De Sua Empresa <e-mail_da@sua.empresa>',
'To' => "{$data['nome']} <{$data['e-mail']}>", // Pegamos os dados da base de dados e colocamos no "To" do cabeçalho
'Subject' => $_POST['assunto'] // Assunto do e-mail
);
 
// Este vetor só é necessário caso você queira autenticação SMTP
$params = array(
'auth' => true, // Definimos que deve ser autenticado
'username' => self::USER_SMTP,
'password' => self::PASSWORD_SMTP,
'host' => self::SERVER_SMTP
);

$mail = Mail::factory('smtp',$params); // Preparamos os envio, o primeiro parâmetro significa o driver que utilizaremos, caso você não queria utilizar autenticação altere-o para 'mail' e delete o segunto parametro
$mail_ref = $mail->send($data['e-mail'] , $header , $mensagem); // Enviamos o e-mail
 
endwhile;

if (PEAR::isError($mail_ref)): // Verificamos se aconteceu
echo "Ocorreu um erro: " . $mail_ref->getMessage();
else:
echo "Enviado com sucesso!";
endif;
}
(...)

No começo executamos nossa QUERY, criamos o vetor $header que deve conter os dados do cabeçalho e o vetor $params que contém os dados para autenticação. Depois executamos o método ‘factory’ da classe Mail que ‘prepará’ o e-mail para o envio, você pode alterar o primeiro parâmetro para ‘mail’ e exluir o segundo caso você não queria autenticação SMTP. E logo após executamos o métodos ’send’ que enviará o e-mail para nós. O primeiro parâmetro é o destinatario, pode ser uma simples string ou um array contendo os e-mails para qual enviará. Depois verificamos se ocorreu algum erro utilizando o método ‘isError’ do PEAR e se ocorrer pegamos a mensagem de erro com o método ‘getMessage’ sobre nosso objeto $mail_ref. Caso contrário exibimos uma mensagem de êxito. O código esta bem comentado, por isso não vou ficar explicando muito ;D

Enviando e-mails com HTML

 

Bom, até aqui você ja estará enviando e-mails numa boa, só que ainda não consiguirá enviar em formato HTML (e nem anexos), e é ai que a classe Mail_mime entra ;D Depois do vetor $params adicione apenas isso:

$mime = new Mail_mime(); // Instaciamos a classe Mail_mime, (esta classe esta no arquivo Mail/mime.php)
$mime->setHTMLBody($_POST['mensagem']); // Setamos o corpo em HTML

$mensagem = $mime->get(); // Agora trazemos o corpo já 'formatado'  com o metodo get() e atribuimos-o para a variavel $mensagem
$header = $mime->headers($header); // Agora trazemos o cabeçalho já 'formatado' através do método headers

O unico detalhe que devo lembrar é que você deve chamar os métodos get() e headers() sempre nessa mesma ordem, nunca os inverta pois não enviará o e-mail. Pronto agora só falta chamarmos o método enviar que acamos de criar no arquivo index.php ;D ficando assim:

<?php
if (isset($_GET['act']) && $_GET['act'] == 'send'):
include_once ('newsleter.php');
$newsleter = new newsleter();
$newsleter->enviar();
endif;
?>
(...)
Finalizando… ?>

 

Prontim, agora ja esta tudo certo, seria uma boa você colocar um edito WYSIWYG para a mensagem =) Só vou deixar um lembrete:

 

Caso sua hospedagem não disponibilize o PEAR Mail para você, você pode simplesmente baixa-lo, como eu ensinei aqui, e copiar a pasta PEAR para seu servidor! Só que tem um detalhe, não esqueça de utilizar a função ini_set para setar o caminho do PEAR – também ensinei aqui – e, por motivos de segunrança, negar acesso direto a esta pasta ;D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.