Publicidade   
 você está aqui: phpbrasil.com    artigos    artigo  
 
:: novos artigos ::

:: recomendado ::

MYSQL & MSQL

Compre esse livro no Submarino.com.br

:: publicidade ::


:: novos scripts ::

:: elenco phpbrasil ::

fccd
Pontos: 10353

Visite a página de perfil de Carlos SicaEnviando Emails Autenticados com o Protocolo SMTP
por Carlos Sica
Lista de Categorias  |  Contribua um Novo Artigo  |  Entre em Contato Conosco

Várias pessoas perguntam sobre como enviar um email quando o servidor exige autenticação de login e senha. A maioria dos servidores de email utilizam o SMTP. Com este protocolo, o usuário pode enviar emails com ou sem autenticação. Este artigo explica os dois modos.
Vote aqui!
Média de Votos Atual: 9.13
Total de Votos: 23
Nota:   

Índice
1 - Conceitos Iniciais
2 - Verbos SMTP
3 - Código Fonte do Script
4 - Informações Complementares e Conclusão


O que é SMTP?
Em principio, é um servidor para enviar email, mas como o nome SMTP, que vem do inglês "Simple Mail Transfer Protocol" diz, é um Protocolo Simples de Transferência de Mensagens, eletrônicas, naturalmente.

O que é protocolo?
Protocolo é um conjunto de regras utilizadas para se estabelecer uma comunicação entre dois sistemas, neste caso, entre o cliente com o servidor.

Os protocolos trabalham através de requerimentos (requisições ou perguntas) e respostas, ou seja, o servidor emite uma resposta para cada requerimento. Em geral, os requerimentos são compostos por uma linha texto, contendo um comando que pode exigir parâmetros ou não. Já a resposta pode conter uma ou mais linhas texto, mas todas elas contém um código que pode ser de acerto ou de erro.

Como é o protocolo SMTP?
Em primeiro lugar é necessário estabelecer um canal de comunicação com o servidor. Muitas linguagens de programação oferecem alguma função que permite o estabelecimento de comunicação entre o computador cliente e o servidor. Em PHP esta função e a fsockopen() que espera como principal parâmetro, o nome do servidor para criar um socket entre o cliente e o servidor.

O que é socket?
Pense numa tomada de energia que liga o aparelho de som na rede elétrica, é essa a idéia. O computador cliente vai se conectar ao computador servidor através de uma ligação lógica para comunicação bidirecional. Esta ligação é chamada socket.

Como são os requerimentos e as respostas nesse protocolo?
Um requerimento é uma string de bytes que contém um comando, chamado na literatura técnica de verbo, que pode receber parâmetros ou não. Ao final de cada comando (e parâmetros) deve vir uma quebra de linha, pois, o próximo comando deve iniciar em uma nova linha. Em PHP a quebra de linha é comandada pelas constantes \r\n.

Forma geral de um comando para o servidor SMTP.


VERBO parâmetro\r\n


As respostas são compostas por um número de três dígitos no formato de uma string ASCII, seguido por uma mensagem explicativa. Este dois componentes podem estar separados por espaço, traço ou outro separador.


999 resposta exemplo
999-resposta exemplo




<< Anterior 1 2 3 4 Próxima >>

 
Imprimir  |  Enviar para um Amigo


Comentários de Usuários

Muito Bom
publicado por Lucas Stephanou - 2005-08-19 15:33:32

Apesar de nao ter testado! Achei muito bom o artigo , bem elaborado!

Quanto a um arquivo, acho interessante qualquer tipo de artigo sobre conexóes de socket

Erro / Dúvidas
publicado por sbc.mfreitas - 2005-08-21 09:35:07

Parabéns pelo trabalho e apenas um dúvida , após configurar o script com meus dados no teste o seguinte erro retornou:

conectou com: Resource id #1
conexão: 220 buvuma.terra.com.br ESMTP
auth login: 503 Error: send HELO/EHLO first
login: 502 Error: command not implemented
senha: 502 Error: command not implemented
mail from: 503 Error: send HELO/EHLO first
recpt to: 503 Error: need MAIL command
data: 503 Error: need RCPT command
email: 221 Error: I can break rules, too. Goodbye.
quit:

Bem, vc sabe dizer oque está acontecendo?

Obrigado

Marcos Freitas

Erros..
publicado por Rafael Rebelo - 2005-08-21 18:54:18

Nao conheço muito bem esse assunto.. mas vou tentar ajudar...

auth login: 503 Error: send HELO/EHLO first

Você tem que mandar os comandos HELO ou EHLO (comentados no artigo) antes de enviar outro comando pro servidor..

login: 502 Error: command not implemented

O comando login não existe, esse servidor que voce esta usando não requer autenticação.. voce pode mandar um email por ele sem autenticar nada..

senha: 502 Error: command not implemented

O comando senha não existe, esse servidor que voce esta usando não requer autenticação.. voce pode mandar um email por ele sem autenticar nada..

mail from: 503 Error: send HELO/EHLO first

Você tem que mandar os comandos HELO ou EHLO (comentados no artigo) antes de enviar outro comando pro servidor..

recpt to: 503 Error: need MAIL command

Como o comando mail não funcionou, ele da esse erro..

data: 503 Error: need RCPT command

Como o comando rcpt não funcionou, ele da esse erro..

email: 221 Error: I can break rules, too. Goodbye.
quit:


Ele termina a conexão depois dos sucessivos erros...

E-mail com cópia?
publicado por Pedro Luques - 2005-10-03 08:42:03

- Preciso de Ajuda: Como é o "verbo" SMTP para enviar e-mail como cópia carbono e oculta?

- Outra coisa é: Eu atribui vários e-mails separados por ; na variavel "<$para>" e somente enviou para o primeiro e-mail, os outros destinatarios não receberam... Como resolver isso?

Re: E-mail com cópia?
publicado por Carlos Sica - 2005-10-03 13:09:38

1) Não é o caso de usar um verbo específico e, sim, dentro do verbo DATA utilizando as strings 'CC' e 'BCC' que significam Carbon Copy (Cc) e Blind Carbon Copy (Bcc).

2) Já fiz isso e funcionou, pode ser uma restrição do seu servidor (?) tente utilizar a vígula, ou ainda, um espaço depois do ponto-e-virgula.

ajuda
publicado por poste9 - 2005-10-04 05:25:29

apareceu isso pra mim
220 mx.gmail.com ESMTP 33sm461219wra
250-mx.gmail.com at your service
250-SIZE 20971520
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
530 5.7.0 Must issue a STARTTLS command first 33sm461219wra
tem algo errado?

Re: ajuda
publicado por Carlos Sica - 2005-10-05 16:44:14

Testei o script várias vezes e mais uma agora.

O resultado (escondendo o nome do servidor) está ai:

conectou com: Resource id #2
conexão: 220 mail.xxx.yyy.br ESMTP
auth login: 334 VXNlcm5hbWU6
login: 334 UGFzc3dvcmQ6
senha: 235 ok, go ahead (#2.0.0)
mail from: 250 ok
recpt to: 250 ok
data: 354 go ahead
email: 250 ok 1128544837 qp 13633
quit: 221 mail.xxx.yyy.br

mail
publicado por tiegomaestri - 2005-10-10 18:55:13

ola,
eu tive o seguinte resultado!!!

conectou com: Resource id #2
conexão: 220 siaimail01.univali.br ESMTP
auth login: 250 siaimail01.univali.br
login: 334 VXNlcm5hbWU6
senha: 334 UGFzc3dvcmQ6
mail from: 235 Authentication successful
recpt to: 250 Ok
data: 554 : Helo command rejected: You are not me
email: 354 Enter mail, end with "." on a line by itself
quit: 554 Server said: 554 Error: no valid recipients

sera q alguem pode me ajudar?

O meu resultado foi:
publicado por Flávio Vargas - 2005-10-21 05:08:48

O primeiro erro solicitava o verbo Hello, então antes do AUTH-LOGIN coloquei:

fputs($conexao,"EHLO $servidor\r\n", 512)."<br>"; // envia a requisição
echo "Hello: ".fgets($conexao, 512)."<br>";

O retorno foi esse:

conectou com: Resource id #1
conexão: 220 scorpion4.uol.com.br ESMTP
Hello: 250-xxx.yyy.com.br
auth login: 250-PIPELINING
login: 250-SIZE 13312000
senha: 250-VRFY
mail from: 250-ETRN
recpt to: 250 8BITMIME
data: 503 Error: authentication not enabled
email: 502 Error: command not implemented
quit: 502 Error: command not implemented

O que pode estar errado aí?

Obrigado.

Re: O meu resultado foi:
publicado por Flávio Vargas - 2005-10-22 02:36:54

Desculpem, fiz besteira:

O server que escolhi é o não autenticado do UOL, mas agora coloquei o smtps.uol.com.br e recebi as seguinte respostas:

conectou com: Resource id #1
conexão: 220 scorpion5.uol.com.br ESMTP
Hello: 250-scorpion5.uol.com.br
auth login: 250-PIPELINING
login: 250-SIZE 13312000
senha: 250-VRFY
mail from: 250-ETRN
recpt to: 250-AUTH LOGIN PLAIN
data: 250-AUTH=LOGIN PLAIN
email: 250 8BITMIME
quit: 334 VXNlcm5hbWU6

O E-mail não foi enviado, acho que a resposta correta para senha seria 235 né?


Resolvi o problema
publicado por Flávio Vargas - 2005-10-22 04:53:26

// insira o trecho novo após esta linha

echo "conectou com: ".$conexao."<br>";
echo "conexão: ".fgets($conexao, 1024)."<br>";

//trecho novo...

fputs($conexao,"EHLO $servidor\r\n", 512);

$aux=0;
while ($aux==0) {
$buffer=fgets($conexao, 512);

$response = substr($buffer, 4, 8);
if ($response != '8BITMIME'){
echo "loop: ".$buffer."<br>";
}
else {
echo "loop: ".$buffer."<br>";
$aux=1;
}
}

// continuação do código

fputs($conexao,"AUTH LOGIN\r\n", 512);
...

O que percebi é que a maioria dos servidores de SMTP exigem o comando EHLO (Hello)

E por sua vez, o número de respostas para EHLO varia de servidor para servidor, sendo que a última resposta é: 250 8BITMIME

Por isso inclui este while que solicita respostas do servidor até que a resposta seja: 250 8BITMIME

aí ele segue em frente sem problemas.

Testei com o servidor do UOL e com o da Locaweb, sendo que o da UOL retorna 8 linhas de respostas e o da Locaweb 4.

Testei o envio para contas do UOL, GMAIL e HOTMAIL.

O único problema detectado foi que o servidor da Locaweb não conseguiu entegar ao HOTMAIL, nada mais.

Obrigado

HELO e EHLO
publicado por Carlos Sica - 2005-12-09 10:03:02

Os servidores que utilizo não utilizam o HELO, mas ai vai...

// handshaking com o servidor
fputs($conexao,"EHLO $servidor\r\n", 512);
do{
$buffer = fgets($conexao, 512);
echo "loop: ".$buffer."<br>";
}while (substr($buffer, 4, 8) != '8BITMIME');

complemento
publicado por Carlos Sica - 2005-12-09 10:04:03

... já está incluído no corpo do artigo!

Erro
publicado por tavs - 2006-01-06 11:58:43

Olá, quando executo o seu código à parte, ele funciona direitinho. Mas quando abro uma conexão com o mysql antes de executar o seu código, ele não manda o email...
Vc sabe pq isso acontece?


Gmail
publicado por pblrodriguez - 2006-01-18 10:41:09

Olá... algém conseguiu conectar com "smtp.gmail.com"
estou com o seguinte erro... o que está havendo de errado?

qual servidor SMTP voces conectaram com sucesso??
[CODE]
conectou com: Resource id #2
conexão: 220 mx.gmail.com ESMTP h36sm6654066wxd
loop: 250-mx.gmail.com at your service
loop: 250-SIZE 20971520
loop: 250-8BITMIME
auth login: 250-STARTTLS
login: 250 ENHANCEDSTATUSCODES
senha: 530 5.7.0 Must issue a STARTTLS command first h36sm6654066wxd
mail from: 502 5.5.1 Unrecognized command h36sm6654066wxd
recpt to: 502 5.5.1 Unrecognized command h36sm6654066wxd
data: 530 5.7.0 Must issue a STARTTLS command first h36sm6654066wxd
email: 530 5.7.0 Must issue a STARTTLS command first h36sm6654066wxd
quit: 530 5.7.0 Must issue a STARTTLS command first h36sm6654066wxd
[/CODE]

Erro com anexo em pdf
publicado por ocimjr - 2006-01-25 09:09:40

Olá, estou com problemas nos anexos em pdf. Fiz algumas alterações neste script e resultou nas linhas abaixo.
fputs($conexao, "MIME-Version: 1.0\r\n");
fputs($conexao, "Content-Type: multipart/mixed;\r\n");
fputs($conexao, "Date: $data\r\n");
fputs($conexao, "From: $deNome <$de>\r\n");
fputs($conexao, "To: $paraNome <$para>\r\n");
fputs($conexao, "Subject: $assunto\r\n");
fputs($conexao, "\r\n");
fputs($conexao, "Content-Type: text/plain;charset=iso-8859-1\r\n Content-Transfer-Encoding: 7bit\r\n");
fputs($conexao, "$corpo\r\n");
fputs($conexao, "\r\n");
fputs($conexao, "Content-type:application/pdf; filename=$imagem_nome \r\n");
fputs($conexao, "Content-Transfer-Deconding: base64\r\n $encoded_attach \r\n");
fputs($conexao, ".\r\n");

Ele faz o envio dos dados e o tamanho da mensagem calcula normal, mas ao abrir a mensagem aparece os dados abaixo:
t-Type: text/plain;charset=iso-8859-1


--------------------------------------------------------------------------------

tent-Transfer-Encoding: 7bit


--------------------------------------------------------------------------------

agem com autenticação OK<br>bysica123


--------------------------------------------------------------------------------




--------------------------------------------------------------------------------

ent-type:application/pdf; filename=email654.pdf


--------------------------------------------------------------------------------

ent-Transfer-Deconding: base64


--------------------------------------------------------------------------------

ERi0xLjQKJeTjz9IKMyAwIG9iago8PC9MZW5ndGggNCAwIFIKL0ZpbHRlci9GbGF0ZURlY29k


--------------------------------------------------------------------------------

PgpzdHJlYW0KeJxzCuHSdzNQMDJRCEnjMlQwAEJDBVMDBXMDA4WQXC7XEC4Ac9AGnAplbmRz

Alguém tem alguma dica para isto? Obrigado


Um detalhe...
publicado por 10Mb - 2006-02-14 13:55:03

Olá, você esqueceu de publicar para a galera como que envia vários emails ao mesmo tempo em uma única conexão...

Problemas!
publicado por tiobred - 2006-03-24 07:56:57

Meu velho, estou tendo problemas com esse código, não funciona comigo, aparece isso pra mim!

conectou com: Resource id #1
conexão: 220 mail1.salvador.ba.gov.br ESMTP
loop: 250-mail1.salvador.ba.gov.br
loop: 250-PIPELINING
loop: 250-SIZE 10000000
loop: 250-DATAZ
loop: 250-STARTTLS
loop: 250-AUTH LOGIN PLAIN
loop: 250 8BITMIME

Fatal error: Maximum execution time of 30 seconds exceeded in c:\inetpub

Já mudei o tempo do timeout e nada.

O que tá errado?
Abraços!
Anderson

Segurança
publicado por jonatasvenan - 2006-04-18 08:30:18

Aproveitando que você criou esse artigo super interessante você poderia também fazer alguns comentarios a respeito de segurança que envolve esse método, etc.
Até mais!

Espetacular
publicado por alexandre henrique - 2006-06-27 21:21:25

Carlos estou escrevendo para elogiar seu script e tb a sua iniciativa de compartilhar com os amigos do forum esse script senssacional !!!

Meus enormes parabéns
publicado por Líbene Fernandes - 2006-09-27 06:54:52

Carlos, ótimo artigo!
Meus parabéns mesmo, muito didático e funcional.
Junto à observação do Flavio Vargas eis um script muito bom.

Abraço,

Líbene Fernandes

Problema
publicado por Thiago Felipe Festa - 2007-04-19 13:44:43

Bem pessoal...
o meu fica assim:
conectou com: Resource id #1
conexão:
loop:
loop:
loop:
loop:
loop:
loop:
loop:
Loop infinitamente :S

alguem poderia me ajudar?
obrigado!

Máquina trava e a página é exibida
publicado por pelasaco - 2007-05-10 14:11:28

Máquina trava e a página é exibida

SOLUÇÃO:
substituir da linha 41 à 44 por:

//modificado ----------------
$i=0;
do
{
$i++;
$buffer=fgets($conexao, 512);
print($i." - loop: ".$buffer."<br>");
if(substr($buffer , 4, 8)=='8BITMIME')
break;
}
while ($buffer);
// fim -------------- modificado

Até mais!

Re: Máquina trava e a página >>NAO<< é exibida
publicado por pelasaco - 2007-05-10 14:13:52

ERRATA: O TÍTULO SERIA:

"Máquina trava e a página >>NÃO<< é exibida"

Até mais!

Publique os seus Comentários

Nome:
Email:
Título:
Comentário:

NOTA: Cadastre-se no site para poder publicar comentários.

 
webmaster: João Prado Maia   © 2000 - 2005 phpbrasil.com
Gerado em 1.576 segundos