Enviar e-mail com formatação HTML e Anexo

21/11/2005

Boa tarde caros amigos Delphianos,

Estive procurando nos últimos dias como fazer para enviar um e-mail com comandos HTML e arquivos anexado, o que eu encontrei eu testei, mas não funcionou.
Qdo eu envio o e-mail com os comandos HTML ele vai como texto e não com a formatação HTML como deveria, qdo não anexo nada ele fica com a formatação HTML. Pelo que eu pesquisei é algo a ver com o ContentType ou Charset.
Estou usando os componentes Indy no Delphi 5.


Desde já agradeço,

Tenham um bom dia.

Robert
_____________________________________________________________
´Somos do tamaho dos nossos sonhos.´
Fernando Pessoa


Rgaffo

Respostas

21/11/2005

Massuda

Dê uma olhada no artigo [url=http://www.dragonsoftru.com/?html=indy-email.html]EMAIL MESSAGES FROM DELPHI. USING INDY TO SEND E-MAILS[/url] (de Serge Dosyukov da Dragon Software, em inglês). O artigo explica como gerar diversos tipos de mensagens (texto simples, texto simples com anexos, HTML e HTML com anexos); a parte 3 explica como gerar uma mensagem formatada em HTML com imagens anexas. Mesmo que você não leia inglês, o código exemplo deve te ajudar. Atente para o detalhe que você precisa definir corretamente os links para as imagens em seu código HTML.


Responder Citar

21/11/2005

Rgaffo

Massuda,
Eu já fui nesse site tb, vc até tinha indicado para outra pessoa que postou aki, acontece que a questão não é enviar figuras anexadas e sim outros arquivos, aí que está o problema, eu li quase tudo e não me ajudou muito. Pesquisei bastante antes de postar a duvida aki é que eu não encontrei nada msm para esse problema.

Desde já agradeço.

Sem mais.


Responder Citar

22/11/2005

Rgaffo

Massuda,

Obrigado pela indicação do artigo, olhei melhor e então entendi, mas qdo eu implementei o código deu o seguinte erro:

valid RCPT command must precede DATA.

Sabe o que isso pode ser.

Desde já agradeço e desculpe alguma coisa.

Sem mais,
Robert.


Responder Citar

22/11/2005

Massuda

Não conheço esse erro... qual servidor SMTP você está utilizando?


Responder Citar

22/11/2005

Rgaffo

estou usando o SMTP da empresa que eu trabalho.


Responder Citar

22/11/2005

Massuda

Você poderia postar aqui o código que você está usando para enviar o email?


Responder Citar

22/11/2005

Rgaffo

Descobri,
Esse erro acontece qdo falta informações para o envio de e-mail, por exemplo o destinatário, não descobri qual era a informação que faltava, pesquisei sobre RCPT no google, então resolvi digitar novamente, primeiramente com dados fixos e depois com as váriaveis dai funcionou, mas o problema do anexo ainda não resolvi.

Sem mais,
Obrigado.

Robert


Responder Citar

22/11/2005

Rgaffo

Claro, segue abaixo:


procedure TfrmENVP01A.EnviarEmail(Para, Assunto, MensagemEMail: String);
var
  sAssunto, sMensagem: String;
  TextPart: TIdText;
  Anexo: TIdAttachment;
begin

... // Validação de variaveis.

// Existe uma procedure que é chamada antes para conectar 
// ao servidor POP e SMTP
 
if not (POP3.Connected) or not (SMTP.Connected) or (SMTP.Username = ´´) then
Exit;

with Mensagem do Begin
  with From do Begin
    Name := ´Robert´;
    Address := SMTP.UserName;
  End; //with From do
  Subject := Assunto;
  Recipients.EMailAddresses := Para;
  ReceiptRecipient.Text := SMTP.UserName; // Auto Resposta
  Body.Text := MensagemEMail;
End; // with Mensagem do

{TextPart := TIdText.Create(Mensagem.MessageParts);
TextPart.Body.Text := MensagemEMail;
TextPart.ContentType := ´text/hmtl´;}

  TIdAttachment.Create(Mensagem.MessageParts, ´arquivo,cfg´);

{Anexo.ContentType := ´text/plain´;
Anexo.Headers.Add(´Content-ID: <ciscfg.cfg>´);}

Try
Screen.Cursor := crHourGlass;
SMTP.Send(Mensagem);
  ResultEnvio := ´E-Mail enviado´;
  SMTP.Disconnect;
  POP3.Disconnect;
Except
On E: Exception do Begin
    SMTP.Disconnect;
  POP3.Disconnect;
ResultEnvio := ´Erro ao enviar o E-Mail:´ + E.Message + #1310 + ´ Classe:´ + E.ClassName;
  Exit
  End;
End; // Try
end;



Responder Citar

22/11/2005

Rgaffo

O código acima funciona, mas a parte em que envia o e-mail com o anexo, que é a minha dúvida, não funciona.

Sem mais,

Obrigado.

Robert


Responder Citar

22/11/2005

Massuda

O envio está (de certa forma) funcionando, pois o erro que ocorre é que seu servidor SMTP está dizendo que não entendeu os comandos enviados.

Como você está conectando com o servidor? Seu servidor SMTP requer autenticação?


Responder Citar

22/11/2005

Rgaffo

Agora ele está enviando o e-mail normal, não está mais dando o erro, o problema agora é que o anexo faz com que o corpo vire texto. Ainda estou estuando o artigo que me passou, mas não resolveu, segui o artigo dai deu o problema do RCPT agora funciona, mas o problema do anexo continua.

O código para conexão com o servidor é:

procedure TfrmENVP01A.ConectaPOPSMTP;
begin
POP3.Disconnect;
SMTP.Disconnect;

SQLChange(qryExec, ´select * from SERVEREMAIL where TipoServ = 1´);
Screen.Cursor := crHourGlass;
if (qryExec.RecordCount > 0) then
  Try // Conectar ao servidor POP
    with POP3 do Begin
      Username := Descriptografar(qryExec.FieldByName(´User´).AsString);
      Password := Descriptografar(qryExec.FieldByName(´Pass´).AsString);
      Host  := LowerCase(qryExec.FieldByName(´Host´).AsString);
      Connect;
    End; // with POP3 do
  Except
    On E: Exception do Begin
      POP3.Disconnect;
      MsgInfo(´Erro ao conectar com o servidor POP: ´ + E.Message + ´ / Classe: ´ + E.ClassName);
      Exit
    End;
  End; // Try do Conectar ao servidor POP

SQLChange(qryExec, ´select * from SERVEREMAIL where TipoServ = 0´);
Screen.Cursor := crHourGlass;
if (qryExec.RecordCount > 0) then
  Try // Conectar ao servidor SMTP
    with SMTP do Begin
      Username := Descriptografar(qryExec.FieldByName(´User´).AsString);
      Password := Descriptografar(qryExec.FieldByName(´Pass´).AsString);
      Host := LowerCase(qryExec.FieldByName(´Host´).AsString);
      Connect;
    End; // with SMTP do
  Except
    On E: Exception do Begin
      POP3.Disconnect;
      SMTP.Disconnect;
      MsgInfo(´Erro ao conectar com o servidor SMTP: ´ + E.Message + ´ / Classe: ´ + E.ClassName);
      Exit
    End;
  End; // Try do Conectar ao servidor SMTP
end;


TipoServ = 0 -> Servidor SMTP
TipoServ = 1 -> Servidor POP


Responder Citar

23/11/2005

Massuda

Nas tabela SERVEREMAIL você tem exatamente um servidor POP e um servidor SMTP cadastrado? Se tiver mais de um, como você sabe que um determinado POP está relacionado com um determinado SMTP?


Responder Citar

23/11/2005

Rgaffo

Sim, tenho um servidor POP e outro SMTP cadatrado.
Essa tabela possui um só registro, nunca tera mais.
Pelo dominio eu sei que o POP está relacionado so SMTP


Responder Citar