Anexo de e-mail Incorreto

26/03/2010

Boa Tarde,

Em minha aplicação estou utilizando um recurso de enviar um e-mail contendo varios anexos, só que os anexos estão sendo enviados como um arquivo .DAT.

* O Tipo de Arquivo que estou tentando enviar é .XML, Mas já tentei com outras extenções e tambem não funcionou.

Resumindo o e-mail chega mais o anexo vai errado.

Estou utilizando a seguinte codificação:


NO BOTÃO DO FORM PASSANDO PARAMETROS DE CONEXÃO

procedure TfrmGerarArquivos.btnEnviarArquivosClick(Sender: TObject);
var
  xLFuncoes:TFuncoes;
  xLUsuario      : string;
  xLSenha        : string;
  xLHost         : string;
  xLPorta        : string;
  xLtitulo       : string;
  xLRemetente    : string;
  xLDestinatario : string;
  xLTextoCorpo   : string;
  xLArqAnexos    : string;
begin
  xLFuncoes:=TFuncoes.Create;

  xLArqAnexos:= 'BSK02.xml'; +
                'BSK02.xml;' +
                'BSK03.xml;' +
                'BSK04.xml;' +
                'BSK05.xml;' +
                'BSK06.xml;' +
                'BSK08.xml;' +
                'BSK09.xml;' +
                'BSK10.xml;' +
                'BSK11.xml;' +
                'BSK12.xml;' +
                'BSK13.xml;' +
                'BSK85.xml';

  DMClientPrincipal.cdsK13EMLCFG.Active:=True;
  xLUsuario      := DMClientPrincipal.cdsK13EMLCFG.FieldByName('EmlUse') .Value;
  xLSenha        := DMClientPrincipal.cdsK13EMLCFG.FieldByName('EmlKey') .Value;
  xLHost           := DMClientPrincipal.cdsK13EMLCFG.FieldByName('EmlHost').Value;
  xLPorta          := DMClientPrincipal.cdsK13EMLCFG.FieldByName('EmlPort').Value;
  xLtitulo           := 'Envio de Sync Atualizado - '+ DateToStr(Now);
  xLRemetente  := UDMClientPrincipal.GEmailUser;
  xLDestinatario := DMClientPrincipal.cdsK13EMLCFG.FieldByName('EmlDest').Value;
  xLTextoCorpo   := 'Em anexo arquivo(s) para sincronização de dados em: '+ DateToStr(Now);{Memo1.Lines.Text;}
  xLArqAnexos    := xLArqAnexos;

  xLFuncoes.EnviarEmail(xLUsuario,xLSenha,xLHost,xLPorta,xLtitulo,xLRemetente,
                        xLDestinatario,xLTextoCorpo,xLArqAnexos);

  end;




A PROCEDURE DE ENVIO:

procedure TFuncoes.EnviarEmail(LUsuario, LSenha, LHost, LPorta, LTitulo,
                                LRemetente, LDestinatario,LTextoCorpo, LArqAnexos: String);
var
IdSMTP : TIdSMTP;
lMensagem : TIdMessage;

//Código para envio de mensagens
begin
  try
    try
      IdSMTP := TIdSMTP.Create(Application);

    try
      lMensagem := TIdMessage.Create(Application);

      idSMTP.Username := LUsuario;
      idSMTP.Password := LSenha;
      idSMTP.Host := LHost;
      idSMTP.Port := 25;
      idSMTP.Connect;

    try
      with lMensagem do
        begin
        Subject := LTitulo;
        From.Address := LRemetente;
        Recipients.EmailAddresses := LDestinatario;
        Body.Text := LTextoCorpo;


        TIdAttachmentFile.Create(MessageParts, LArqAnexos); // usado para anexar arquivos

        idSMTP.Send(lMensagem);
        MessageBox(0, 'E-mail enviado com Sucesso !!!', 'Envio de e-mail', MB_ICONINFORMATION or MB_OK);
    end;

    finally
      idSMTP.Disconnect;
    end;

    finally
      lMensagem.Free;
    end;

    finally
      IdSMTP.Free;

    end;

 // Close;

  except

MessageBox(0, 'Erro ao enviar e-mail'+#13+#10+'Verifique a conexão', 'Atenção', MB_ICONERROR or MB_OK);
  end;
end;


No aguardo,

Jorge

Jorge Silva

Jorge Silva

Curtidas 0

Respostas

Rodrigo Mourão

Rodrigo Mourão

26/03/2010

Olá Jorge,

O problema pode esta aqui:

xLArqAnexos:= 'BSK02.xml'; +
                'BSK02.xml;' +
                'BSK03.xml;' +
                'BSK04.xml;' +
                'BSK05.xml;' +
                'BSK06.xml;' +
                'BSK08.xml;' +
                'BSK09.xml;' +
                'BSK10.xml;' +
                'BSK11.xml;' +
                'BSK12.xml;' +
                'BSK13.xml;' +
                'BSK85.xml';


Vc esta passando o nome dos arquivos separado como ; . E esta anexando assim:

TIdAttachmentFile.Create(MessageParts, LArqAnexos); // usado para anexar arquivos

O problema que para cada arquivo anexo tem que ser criado um AttachmentFile. Entao o correto e colocar os arquivos numa lista e depois varrer a lista e criar os anexos. Exemplo

xLArqAnexos    :  TStringList;

xLArqAnexos:= TStringList.Create;
xLArqAnexos.Add('BSK02.xml');
xLArqAnexos.Add('BSK03.xml');
xLArqAnexos.Add('BSK04.xml');
xLArqAnexos.Add('BSK05.xml');
xLArqAnexos.Add('BSK06.xml');
xLArqAnexos.Add('BSK08.xml');
xLArqAnexos.Add('BSK09.xml');
xLArqAnexos.Add('BSK10.xml');
xLArqAnexos.Add('BSK11.xml');
xLArqAnexos.Add('BSK12.xml');
xLArqAnexos.Add('BSK13.xml');
xLArqAnexos.Add('BSK85.xml');

Para Enviar faça:

Body.Text := LTextoCorpo;
for I := 0 to xLArqAnexos.Count -1
begin
  TIdAttachmentFile.Create(MessageParts, xLArqAnexos.Strings[I]); // usado para anexar arquivos
end;
idSMTP.Send(lMensagem);

Att,


GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

Boa tarde Rodrigo,

Como vai ?, tudo certinho ?, Prazer em falar com você rapaz.

Rodrigo fiz o que mandou, e ele realmente mandou os 12 arquivos, mas mandou como antes com a extensão .DAT, cada um com um tamanho diferentes. Eu envio: BSK01.xml BSK02.xml BSK03.xml BSK04.xml BSK05.xml BSK06.xml BSK07.xml BSK08.xml BSK09.xml BSK10.xml BSK11.xml BSK12.xml   E o que chega é:

ATT00031.DAT
ATT00034.DAT
ATT00037.DAT
ATT00040.DAT
ATT00043.DAT
ATT00046.DAT
ATT00049.DAT
ATT00052.DAT
ATT00055.DAT
ATT00058.DAT
ATT00061.DAT
ATT00064.DAT


Atente que a geração dos nomes segue a mesma formatação incrementando de 3 em 3.

Abri os arquivos em um editor de texto e vi que a informação está lá, no mesmo formato do arquivo original.

Então ele esta mandando, mas antes esta renomeando e ainda trocando a extensão. E agora ?
Fico no aguardo
Jorge
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

26/03/2010

Rapaz, isso e muito estranho.

Mas vamos tentar mais um coisa, existe um propriedade onde dizemos o tipo de informação que estamos enviando, neste caso se nao me engano e multipart.

Vou verificar a sintaxe  e te informo.

Att,

GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

Realmente estranho,


Estava procurando na internet e vi que é mais comum que eu esperava, mas até agora não vi uma resposta para aquestão.

No aguardo

Jorge
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Olá amigo, estou agora à frente deste seu chamado, e irei dar continuidade. ok ?Vamos lá!!!

   Os endereços de envio de e-mail e o remetente, ambos são de um domínio próprio ? Ou você esta usando Gmail/Hotmail, por exemplo?

  Você já tentou mandar para outro e-mail ? Já tentou mandar os XML's compactados ?

Um abraço

Wesley Y
GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

Ola Wesley,

Ja enviei para o mesmo dominio para dominios diferentes, arquivos .xml, arquivos .txt, arquivo.xls e nada.

o arquivo que eu mandar sempre chega do mesmo jeito.


Jorge
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Olá amigo, peço que aguarde um pouco, para que eu possa montar um exemplo e lhe enviar.

Um abraço

Wesley Y
GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

ok,

Fico no aguardo

Jorge
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Olá amigo, eu tenho um disparador de e-mail que achei aqui, nele codifiquei o seguinte :


procedure TFrmPrincipal.BitBtn8Click(Sender: TObject);
Var
  I,J : Integer;
  Tot : Currency;
begin
  for I := 0 to ChckLstBxEmail.Count - 1 do
  begin
    if ((ChckLstBxEmail.Checked[I]) and
        (ChckLstBxEmail.State[I] <> cbGrayed)) then
    begin
      with IdMessage do
      begin
        Recipients.Clear;
        CCList.Clear;
        Body.Clear;
        Recipients.Add.Address  := ChckLstBxEmail.Items.Strings[I];
        From.Name               := EdtNomeRemetente.Text ;
        From.Address            := EdtEmailRemetente.Text;
        Subject                 := EdtAssuntoEmail.Text  ;
        Date                    := Date                  ;
        if EdtCC.Text <> '' then
          CCList.Add.Address    := EdtCC.Text            ;

        MessageParts.Clear;
        ContentType := 'text/plain';
        TIdAttachmentFile.Create(MessageParts,'C:\Wesley.XML');
        IdSMTP.Connect;
        IdSMTP.Send(IdMessage);
        IdSMTP.Disconnect;
      end;
    end;
  end;
end;


O arquivo XML, foi normalmente, veja se isso irá lhe ajudar.

Obs : Faça adaptações no seu código para funcionar.


Um abraço

Wesley Y
GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

Wesley,

Não ficou muito claro, qual é a linha que informa/controla o formato do arquivo em anexo ?

Para que serve a linha: ContentType := 'text/plain';

agora o corpo do e-mail exibe tipo uma representação dos arquivos em um formato não legivel.


o codigo que adaptei foi o seguinte favor verificar:

procedure TFuncoes.EnviarEmail(LUsuario, LSenha, LHost, LPorta, LTitulo,
  LRemetente, LDestinatario, LTextoCorpo: String; LArqAnexos: TStringlist);
var
IdSMTP : TIdSMTP;
lMensagem : TIdMessage;
I:Integer;

//Código para envio de mensagens
begin
  try
    try
      IdSMTP := TIdSMTP.Create(Application);

    try
      lMensagem := TIdMessage.Create(Application);

      idSMTP.Username := LUsuario;
      idSMTP.Password := LSenha;
      idSMTP.Host := LHost;
      idSMTP.Port := 25;
      idSMTP.Connect;
      lMensagem.MessageParts.Clear;
    try
      with lMensagem do
        begin
        Subject := LTitulo;
        From.Address := LRemetente;
        Recipients.EmailAddresses := LDestinatario;
        Body.Text := LTextoCorpo;
        ContentType := 'text/plain';

        for I := 0 to LArqAnexos.Count -1 do
          begin
            TIdAttachmentFile.Create(MessageParts, LArqAnexos.Strings[I]); // usado para anexar arquivos

          end;
        idSMTP.Send(lMensagem);
        MessageBox(0, 'E-mail enviado com Sucesso !!!', 'Envio de e-mail', MB_ICONINFORMATION or MB_OK);
    end;

    finally
      idSMTP.Disconnect;
    end;

    finally
      lMensagem.Free;
    end;

    finally
      IdSMTP.Free;

    end;

 // Close;

  except

MessageBox(0, 'Erro ao enviar e-mail'+#13+#10+'Verifique a conexão', 'Atenção', MB_ICONERROR or MB_OK);
  end;
end;

GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Olá amigo,

  Faça uma alteração mude a linha vermelha por ContentType := 'multipart/mixed'; assim sua mensagem irá com anexo e o conteúdo do e-mail . Esta é a linha que define que o e-mail vai ter partes mistas, tanto corpo, como arquivo anexo.

Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Olá amigo, e ai consegui fazer a alteração o envio do e-mail funcionou ?

Um abraço

Wesley Y
GOSTEI 0
Jorge Silva

Jorge Silva

26/03/2010

Wesley,

Desculpe a demora na resposta, mas estava sem internet, mas pode fechar o chamado agora funcionou, não testei com outro tipo de arquivo mas provavelmente não vai dar problema.

Pode fecher o chamado

Obrigado novamente, Até a proxima.


Jorge
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

26/03/2010

Grande Jorge, estamos a disposição se precisar estamos aqui .

Um abraço

Wesley Y
GOSTEI 0
POSTAR