Enviando emails - SMTP

Started by Dark_Side, 02 de July , 2006, 03:31:38 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,
Com o tempo livre que consegui, fiz este simples tutorial sobre SMTP, mas especificamente, como enviar emails utilizando este protocolo.

1) Breve introdução sobre o SMTP.

Simples Mail Tranfer Protocol ou Protocolo de Tranferência de Correio Simples é o protocolo padrão utilizado para enviar email na internet. Trata-se de um protocolo simples e também NÃO-CONFIÁVEL o que torna um alvo atrativo para SPAMMERS.

2) Conectando a um servidor SMTP.

Para podermos enviar email's utilizando o SMTP, é necessários conectar-se a um servidor que o suporte.
Existem diversos servidores espalhados na internet, os melhores são aqueles que possuem Open Relay aberto, isto é, permitem que qualquer usuário envie emails sem nenhuma autenticação.

Conectando:

Você pode executar o processo até mesmo pelo telnet, mas recomendo que utilze outro terminal, como o PUTTY por exemplo.

Conecte-se ao servidor pelo porta 25 (porta SMTP).

Caso esteja utilizando o telnet:
telnet smtp.servidor_aqui.com 25

Após se conectar, você receberá uma resposta do servidor que geralmente lhe informa o nome do servidor, o tipo de protocolo e sua versão.

3) Enviando um email simples.

Depois de conectado, devemos utilizar o comando HELO, que indica o início da "conversa" com o servidor.
A sintaxe é: HELO seuhost

Exemplo:
HELO www.servidor.com

O servidor deverá retornar uma mensagem incluindo o host deste.

Muito bem, continuando...

Utilizaremos agora o comando MAIL FROM.
Sua sintaxe é: MAIL FROM
Este comando diz ao servidor o remetente da mensagem.

Exemplo:
MAIL FROM

Resposta do servidor: SENDER OK.
Isso demostra que o servidor aceitou o remetente.

Iremos agora configurar o(s) remetente(s) da mensagem, para isso utilzamos RCPT TO .
Utilizamos RCPT TO, para cada destinatário.

Exemplo:
RCPT TO:
RCPT TO:
RCPT TO:

O servidor deverá responder: RECIPIENT OK para cada email.
Caso obtenha outra resposta, provalmente, seu servidor necessita de autenticação para que você possa enviar emails. Isso será abordado mais a frente.
Após configurados o remetente e o destinatário.
Vamos escrever nossa mensagem.

Observe:
DATA
From: Parreira
Subject: LOL
hahahaha
Tchau.
.

Explicando:
DATA    -> inicia a configuração da mesagem;
From    -> indica o nome do remetente;
Subject -> indica o assunto da mensagem;
hahaha  -> Primeira linha da mensage; 
Tchau.  -> Segunda linha da mensagem;
.       -> Indica o fim do email, diz ao servidor para enviá-lo.

O servidor nesse caso, retorna um código contendo a ID da mensagem enviada.

Exemplo completo:

telnet smtp.meuservidor.com 25
HELO localhost
MAIL FROM:
RCPT TO:
DATA
From: eu
Subject: teste
testando
123
bye
.

Muito bem. O processo acima vale para servidores com Open Relay, difíceis de encontrar hoje em dia.
Caso seu servidor necessite de autenticação, teremos que utilizar o seguinte processo:

1) Conectamos neste pela porta 25.
2) Nos identificamos com HELO.

3) Enviamos o comando AUTH LOGIN

O servidor retornará uma mensagem criptografada com BASE64, que é o tipo de critpografia padrão do protocolo SMTP.
Esta mensagem, irá lhe pedir seu login.
Se você simplesmente colocá-lo, seu login não será feito. Por quê? porque é necessário que você o envie criptografado em BASE64 também.
Para isto, utilize: http://makcoder.sourceforge.net/demo/base64.php
Vamos supor que meu login no servidor seja: meulogin, que em BASE64 seria: bWV1bG9naW4=
Muito bem, após o comando AUTH LOGIN, enviaremos "bWV1bG9naW4=" (sem aspas) ao servidor.
O servidor pedirará seu password, novamente, encripte-o com base64 e o envie.
Caso tenha enviado os dados corretos, o servidor responderá com: ok, go ahead (ok, siga em frente)
Após isso, você poderá enviar seu email normalmente, utlizando MAIL FROM, RCPT TO, DATA, etc.

Bem, por enquanto é isso. No próximo módulo, mostrarei como manipular Headers, enviar emails com HTML, anexos, etc.
Bye.

Anonymous

muito bom para saber passo a passo o processo de envio :)
esse texto é 100% original seu? :O

Dark_Side

Hi,
O texto é totalmente de minha autoria... Heheh, eu não custumo colocar as notas de que foi eu quem fiz :).
Bye.

HadeS

Muito bom o texto Dark_Side!

Ótimo texto. É sempre bom saber como as coisas funcionam por trás dos panos.

Eu postei umtexto sobre o handshake de uma conexão SLL aqui que também pode ajudar muito. Dêem uma olhada depois. ;)

HadeS

Dark_Side

Hi,
continuando o tutorial sobre como enviar emails utilizando o SMTP.

Iremos abordar:
1) MIME - Conheca e utilize as normas para envio de emails.
2) Enviando emails com conteúdo múltiplo
3) Considerações finais

Bem, no tópico anterior, foi demonstrado como os emails são enviados por SMTP.Nota-se também que o tipo de email enviado, é extremamente simples.
Vamos ver agora, como melhorar nosso email.
O MIME (Extensões Multifunção para Mensagens de Internet), do inglês Multipurpose Internet Mail Extensions, é uma norma da Internet para o formato dos emails.
Este padrão, estabelece várias informaçoes no envio de um email, como arquivos binários contento imagens, sons, etc.

Cabeçalhos do MIME.

Versão do MIME: Como o nome surgere indica a versão do MIME, e consequentemente, indica que o email possui o formato MIME.

Sintaxe: MIME-VERSION: 1.0
Content-Type

Indica o tipo de conteúdo do email, que pode ser: texto puro, html, binário, etc.

Sintaxe: Content-type: TIPO
Tipos de conteúdo mais comuns:
text/plain => texto puro
text/html  => html
text/xml   => xml
image/gif  => imagem gif
image/jpeg => imagem jpg
image/png  => imagem png
audio/x-wav => som wav
audio/x-aiff => som aiff
video/mpeg => vídeo mpeg
text/richtext => documento RTF
application/pdf => documento PDF
application/msword => Microsoft Word
application/vnd.ms-powerpoint => Microsoft Powerpoint
application/vnd.ms-excel => Microsoft Excel
application/zip => Arquivo .Zip
application/octet-stream => Arquivos binários em geral, geralmente executáveis (.EXE)

MultiPart

O MIME reserva um limite no header CONTENT-TYPE, para especificar limites em uma mensagem de email, devido a isso, é possível, em um mesmo email, apresentarmos texto puro, html, imagens, anexos, etc.

Sintaxe: Content-type: multipart/mixed; boundary="DIVISAO"

Onde em 'DIVISÃO', estabelecemos um limite entre um tipo de conteúdo e outro.
Exemplo:

Content-type: multipart/mixed; boundary="limite"

--limite
Content-type:text/plain

texto puro
--limite
Content-type: text/html

HTML--limite--

Note, que usamos --limite, para cada divisão de conteúdo, e no final: --limite--.

Content-Transfer-Encoding

Sintaxe: Content-Transfer-Encoding: tipo
Indica como um conteúdo binário deve ser representado.
7bit -> suporta até 998 octetos por linha de código(max 127) finalizada com CRLF (\r\n).
quoted-printable -> utilizado para codificar caracteres não -ASCII em caracteres ASCII.
8bit -> suporta até 998 ocetos por linha de código.
base64 -> O mais utilizado para arquivos binários.

Content-Disposition
Sintaxe: Content-Disposition: local
Para local, temos:
inline => o conteúdo será apresentado no corpo da mensagem
attachment => o conteúdo será apresentando na forma de anexo.
Neste último, necessitamos especificar o nome do arquivo. Observe:
Content-Disposition: attachment; filename="arquivo.extensao"


Bem, este são os principais headers do MIME.
Vamos agorar, colocar em prática.

2) Enviando emails com conteúdo múltiplo

Observe:
telnet smtp.meuservidor.com 25
helo localhost
auth login
bWV1bG9naW4
=bWluaGFzZW5oYQ==
MAIL FROM: <email@hi.com.br>
RCPT TO: <teste@teste.com.br>
DATA
From: eu!
Subject: lol
MIME-VERSION: 1.0
Content-type: multipart/mixed; boundary="limite"

--limite
Content-Type: text/html

<font color=red>Este é um exemplo de como usar HTML em emails.
--limite
Content-Type: image/gif
Content-Disposition: inline
Content-Tranfer-Enconding: base64

Q29sb2Nhcu1hbW9zIGFxdWksIG8gY/NkaWdvIGZvbnRlIGNvbXBsZXRvIGRhIGltYWdlbSByZWZlcmlkYSwgY3JpcHRvZ3JhZmFkYSBlbSBCQVNFIDY0Lg==
--limite
Content-Type: application/zip
Content-Disposition: attachment;filename="anexo.zip"
Content-Tranfer-Enconding: base64

Q29sb2Nhcu1hbW9zIGFxdWksIG8gY/NkaWdvIGZvbnRlIGNvbXBsZXRvIGRvIGFycXVpdm8gLlpJUCByZWZlcmlkbywgY3JpcHRvZ3JhZmFkYSBlbSBCQVNFIDY0Lg==
--limite--
.
Obs:: Observere os espaços entre uma linha e outra.
Após preencher os cabeçalhos, é necessário enviar uma linha nula (\n\r) antes de iniciar a sua mensagem.

3) Considerações finais
Bem, fica aqui o básico sobre o envio de emails com SMTP.
Espero que tenha ajudado alguém e que possam deselvolver algo emcima disso.
Se tiver tempo, pretendo deselvolver e postar um programa feito em C/C++ para colocar em prática o conteúdo aqui apresentado na área de programação.
Bye.   :D

DarkGenesis

Bom, depois desse tuto nêm tenho o que dizer.
Excelênte trabalho Dark_Side , você sempre está contribuindo com o forum. ;D

rog

realty.sys is corrupt :  reboot the universe (Y/N)