Enviando email via Delphi 2007

Delphi

16/09/2010

Bom dia pessoal estou precisando de ajuda, mas não venho de mãos vazias. Neste post estou disponibilizando o códidgo para enviar email utilizando o Delphi 2007 e componentes Indy.

Meu problema é o seguinte, o email em si é enviado normalmente! Porem o corpo do email fica todo desconfigurado e os anexos não estão no email .. é como se o anexo foi desmembrado no corpor!

Exemplo
Envio de email BOL para email IG
SMTP = smtp.bol.com.br
Usuário = diego.paraizo100@bol.com.br
Senha = ********

Corpo do email: Mensagem teste
Anexo: Texto.txt

Quando abro o email o corpo fica assim:

This is a multi-part message in MIME format --vs7sb=_7I7dWRe35MX9qEL5iU0JwRs6lpw Content-Type: text/plain Content-Transfer-Encoding: quoted-printable =20 --vs7sb=_7I7dWRe35MX9qEL5iU0JwRs6lpw Content-Type: text/html Content-Transfer-Encoding: quoted-printable DS02.Dataset.Edit;
if DS02.Dataset.FieldByName('VAGAS').As= Integer <=3D 0 then
DS02.Dataset.FieldByName('VAGAS2').AsStrin= g :=3D 'ESGOTADO'
else
DS02.Dataset.FieldByName('V= AGAS2').AsString :=3D IntToStr(DS02.Dataset.FieldByName('VAGAS').ASInt= eger);

//Neste momento o DS01 pega as informa=E7= =F5es necess=E1rias para exibir na grade e preenche o DS02 passando tu= do como texto, para usar o ESGOTADO
DS01.Dataset.Active :=3D True;=
DS02.Dataset.Active :=3D True;
DS01.DataSet.First;
while = not DS01.Dataset.EOF do begin
VAGAS :=3D DS01.Dataset.FieldB= yName('ATV_NUM_VAGAS_DISPONIVEIS').AsInteger - DS01.Dataset.FieldByNam= e('ATV_NUM_VAGAS_PREENCHIDAS').AsInteger;

DS02.Dataset.I= nsert;
DS02.Dataset.FieldByName('ATV_COD_EXT').AsString := =3D DS01.Dataset.FieldByName('ATV_COD_EXT').AsString;
DS02.D= ataset.FieldByName('ATV_TXT_DESC').AsString :=3D DS01.Dataset.FieldByN= ame('ATV_TXT_DESC').AsString;
DS02.Dataset.FieldByName('ATV_= TXT_PERIODO').AsString :=3D DS01.Dataset.FieldByName('ATV_TXT_PERIODO'= ).AsString;
if VAGAS <=3D0 then
DS02.Dataset.Fi= eldByName('VAGAS').AsString :=3D 'ESGOTADO'



Eis o código que estou utilizando:

procedure TTelaEmails.btnEnviarClick(Sender: TObject);
var
        x: integer;
begin
  assunto:=edtAssunto.Text;
  usuario:=edtUsuario.Text;
  servidor:=edtServidor.Text;
  senha:=edtSenha.Text;        //passando valores de componentes para variaveis privadas
  emailEnvio:=edtEMailEnvio.Text;
  nomeEnvio:=edtNomeEnvio.Text;
  porta:=StrToInt(edtPorta.Text);
  maxEnviosConexao:=StrToInt(edtMaxEnvioConexao.Text); 
 
  if MemoEnvio.Text <> '' then
          lblTotalEMail.Caption:='Total de ' + IntToStr(MemoEnvio.Lines.Count) + ' E-Mails a enviar.'
  else
          lblTotalEMail.Caption:='Total de 0 E-Mail a enviar.';
 
  if IdSMTP.Connected then//Reloga
          Desconecta();
  Conecta();
 
  if IdSMTP.Connected then
          begin    //Barrinha de progresso
          Gauge.MaxValue:=MemoEnvio.Lines.Count - 1;
          Gauge.Progress:=0;
          Gauge.Visible:=True;
          Gauge.Refresh;
          for x:=0 to MemoEnvio.Lines.Count - 1 do
                 begin
                 EnviarEMail(MemoEnvio.Lines.Strings[x]);
                 Gauge.Progress:=Gauge.Progress + 1;
                 Gauge.Refresh;
                 end;
         Gauge.Visible:=False;
         Gauge.Refresh;
         MemoStatus.Lines.Add('');
         MemoStatus.Lines.Add('Mensagens enviadas');
         MemoStatus.Lines.Add('Total de ' + IntToStr(MemoEnviado.Lines.Count) + ' emails enviados.');
         MemoStatus.Lines.Add('Total de ' + IntToStr(MemoRecusado.Lines.Count) + ' emails não enviados.');
         end;
 Desconecta();
 Application.MessageBox('Concluído envio !','Envio de E-Mail',MB_OK or MB_APPLMODAL or   MB_ICONINFORMATION);
end;
//==============================================================================
procedure TTelaEmails.EnviarEmail(email: string);
var
   str: string;
   lTextPart: TIdText;
   lAnexo: TIdAttachmentFile ;
   enviado: boolean;
   x: integer;
begin
 if maxEnviosConexao > 0 then   //O usuario escolhe quantos enviar por vez se passa do limite estipulado o sistema para
         if enviadosConexao >= maxEnviosConexao then
                 begin
                 MemoStatus.Lines.Add('Atingido o limite de ' + IntToStr(maxEnviosConexao) + ' envios, fazer reconexão !');
                 Desconecta();
                 Conecta();
                 end;
 enviado:=False;
 str:='';

 IdMessage.Headers.Values['X-Library']:='';  //Setando valores padroes no Idmessage
 IdMessage.MessageParts.Clear;
 IdMessage.Recipients.EMailAddresses:=email;
 IdMessage.Subject:=assunto;
 IdMessage.ContentType:='text/html';

 lTextPart:=TIdText.Create(IDMessage.MessageParts); //Instancia
 lTextPart.Body.Text:=' ';                             //Corpo do email
 lTextPart.ContentType:='text/plain';
 lTextPart:=TIdText.Create(IdMessage.MessageParts);
 if (rgModEnvio.ItemIndex = 1) then begin
       lTextPart.Body.Text:=MemoTextoEnvio.Text;
       IdMessage.ContentType:='text'
 end else begin
       lTextPart.Body.Text:='<html>' + ConverteEnterBR(MemoTextoEnvio.Text) + '</html>';
       lTextPart.ContentType:='text/html'
 end;
 for x:=0 to listArquivos.Items.Count-1 do //Anexa os arquivos
         begin
         lAnexo:=TIdAttachmentFile.Create(IdMessage.MessageParts,listArquivos.Items.Strings[x
 ]);
         lAnexo.Headers.Add('Content-ID: <AnexoNro' + IntToStr(x) + '>');
         end;
 IdMessage.From.Address:=emailEnvio;  //De quem
 IdMessage.From.Name:=nomeEnvio;  //Nome de quem
 IdMessage.Priority:=mpNormal; //Prioridade
 try
          IdSMTP.Send(IdMessage); //Enviar!
         enviado:=True;
 except
         on E: Exception do     //Mostra o erro no memo
                 MemoRecusado.Lines.Add(email + ' - Erro: ' + RemoveEnter(E.Message));
         end;

 if enviado then
         MemoEnviado.Lines.Add(email);

 Inc(enviadosConexao);
end;


Se alguem puder ajudar. Agradecido Diego Paraizo
email: diego.paraizo100@hotmail.com




Diego Paraizo

Diego Paraizo

Curtidas 0

Respostas

Diego Paraizo

Diego Paraizo

16/09/2010

Bom dia pessoal estou precisando de ajuda, mas não venho de mãos vazias. Neste post estou disponibilizando o códidgo para enviar email utilizando o Delphi 2007 e componentes Indy.

Meu problema é o seguinte, o email em si é enviado normalmente! Porem o corpo do email fica todo desconfigurado e os anexos não estão no email .. é como se o anexo fosse desmembrado no copor!

Exemplo
Envio de email BOL para email IG
SMTP = smtp.bol.com.br
Usuário = diego.paraizo100@bol.com.br
Senha = ********

Corpo do email: Mensagem teste
Anexo: Texto.txt

Quando abro o email o corpo fica assim:

 This is a multi-part message in MIME format --vs7sb=_ 7I7dWRe35MX9qEL5iU0JwRs6lpw Content-Type: text/plain Content-Transfer-Encoding: quoted-printable =20 --vs7sb=_7I7dWRe35MX9qEL5iU0JwRs6lpw Content-Type: text/html Content-Transfer-Encoding: quoted-printable DS02.Dataset.Edit;
if DS02.Dataset.FieldByName('VAGAS').As= Integer <=3D 0 then
DS02.Dataset.FieldByName('VAGAS2').AsStrin= g :=3D 'ESGOTADO'
else
DS02.Dataset.FieldByName('V= AGAS2').AsString :=3D IntToStr(DS02.Dataset.FieldByName('VAGAS').ASInt= eger);

//Neste momento o DS01 pega as informa=E7= =F5es necess=E1rias para exibir na grade e preenche o DS02 passando tu= do como texto, para usar o ESGOTADO
DS01.Dataset.Active :=3D True;=
DS02.Dataset.Active :=3D True;
DS01.DataSet.First;
while = not DS01.Dataset.EOF do begin
VAGAS :=3D DS01.Dataset.FieldB= yName('ATV_NUM_VAGAS_DISPONIVEIS').AsInteger - DS01.Dataset.FieldByNam= e('ATV_NUM_VAGAS_PREENCHIDAS').AsInteger;

DS02.Dataset.I= nsert;
DS02.Dataset.FieldByName('ATV_COD_EXT').AsString := =3D DS01.Dataset.FieldByName('ATV_COD_EXT').AsString;
DS02.D= ataset.FieldByName('ATV_TXT_DESC').AsString :=3D DS01.Dataset.FieldByN= ame('ATV_TXT_DESC').AsString ;
DS02.Dataset.FieldByName('ATV_= TXT_PERIODO').AsString :=3D DS01.Dataset.FieldByName('ATV_      TXT_PERIODO'= ).AsString;
if VAGAS <=3D0 then
  DS02.Dataset.Fi= eldByName('VAGAS').AsString :=3D 'ESGOTADO'


//===============================================================================
Eis o código que estou utilizando:

procedure TTelaEmails.btnEnviarClick(Sender: TObject);
var
        x: integer;
begin
  assunto                   :=edtAssunto.Text;
  usuario                    :=edtUsuario.Text;
  servidor                   :=edtServidor.Text;
  senha                      :=edtSenha.Text;        //passando valores de componentes para variaveis privadas
  emailEnvio               :=edtEMailEnvio.Text;
  nomeEnvio               :=edtNomeEnvio.Text;
  porta                        :=StrToInt(edtPorta.Text);
  maxEnviosConexao  :=StrToInt(edtMaxEnvioConexao.Text); 
 
  if MemoEnvio.Text <> '' then
          lblTotalEMail.Caption:='Total de ' + IntToStr(MemoEnvio.Lines.Count) + ' E-Mails a enviar.'
  else
          lblTotalEMail.Caption:='Total de 0 E-Mail a enviar.';
 
  if IdSMTP.Connected then//Reloga
          Desconecta();
  Conecta();
 
  if IdSMTP.Connected then
          begin    //Barrinha de progresso
          Gauge.MaxValue:=MemoEnvio.Lines.Count - 1;
          Gauge.Progress:=0;
          Gauge.Visible:=True;
          Gauge.Refresh;
          for x:=0 to MemoEnvio.Lines.Count - 1 do
                 begin
                 EnviarEMail(MemoEnvio.Lines.Strings[x]);
                 Gauge.Progress:=Gauge.Progress + 1;
                 Gauge.Refresh;
                 end;
         Gauge.Visible:=False;
         Gauge.Refresh;
         MemoStatus.Lines.Add('');
         MemoStatus.Lines.Add('Mensagens enviadas');
         MemoStatus.Lines.Add('Total de ' + IntToStr(MemoEnviado.Lines.Count) + ' emails enviados.');
         MemoStatus.Lines.Add('Total de ' + IntToStr(MemoRecusado.Lines.Count) + ' emails não enviados.');
         end;
 Desconecta();
 Application.MessageBox('Concluído envio !','Envio de E-Mail',MB_OK or MB_APPLMODAL or       MB_ICONINFORMATION);
end;
//==============================================================================
procedure TTelaEmails.EnviarEmail(email: string);
var
   str: string;
   lTextPart: TIdText;
   lAnexo: TIdAttachmentFile ;
   enviado: boolean;
   x: integer;
begin
 if maxEnviosConexao > 0 then   //O usuario escolhe quantos enviar por vez se passa do limite estipulado o para o sistema
         if enviadosConexao >= maxEnviosConexao then  
                 begin
                 MemoStatus.Lines.Add('Atingido o limite de ' + IntToStr(maxEnviosConexao) + ' envios, fazer reconexão !');
                 Desconecta();
                 Conecta();
                 end;
 enviado:=False;
 str:='';

 IdMessage.Headers.Values['X-Library']:='';  //Setando valores padroes no Idmessage
 IdMessage.MessageParts.Clear;
 IdMessage.Recipients.EMailAddresses:=email;
 IdMessage.Subject:=assunto;
 IdMessage.ContentType:='text/html';

 lTextPart:=TIdText.Create(IDMessage.MessageParts); //Instancia
 lTextPart.Body.Text:=' ';                             //Corpo do email
 lTextPart.ContentType:='text/plain';
 lTextPart:=TIdText.Create(IdMessage.MessageParts);
 if (rgModEnvio.ItemIndex = 1) then   begin
       lTextPart.Body.Text:=MemoTextoEnvio.Text;
       IdMessage.ContentType:='text'
 end else begin
       lTextPart.Body.Text:='' + ConverteEnterBR(MemoTextoEnvio.Text) + '';
       lTextPart.ContentType:='text/html'
 end;
 for x:=0 to listArquivos.Items.Count-1 do //Anexa os arquivos
         begin
         lAnexo:=TIdAttachmentFile.Create(IdMessage.MessageParts,listArquivos.Items.Strings[x
 ]);
         lAnexo.Headers.Add('Content-ID: ');
         end;
 IdMessage.From.Address:=emailEnvio;  //De quem
 IdMessage.From.Name:=nomeEnvio;  //Nome de quem
 IdMessage.Priority:=mpNormal; //Prioridade
 try
          IdSMTP.Send(IdMessage); //Enviar!
         enviado:=True;
 except
         on E: Exception do     //Mostra o erro no memo
                 MemoRecusado.Lines.Add(email + ' - Erro: ' + RemoveEnter(E.Message));
         end;

 if enviado then  
         MemoEnviado.Lines.Add(email);

 Inc(enviadosConexao);
end;


Se alguem puder ajudar. Agradecido Diego Paraizo
email: diego.paraizo100@hotmail.com




GOSTEI 0
Diego Paraizo

Diego Paraizo

16/09/2010


GOSTEI 0
POSTAR