Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Denis_Uyeda

[Resolvido] Problemas com nome do anexo do e-mail

Recommended Posts

Olá!

 

Tenho uma aplicação que envia e-mail com anexo e estou tendo uns problemas com o nome do anexo.

 

Estou usando TIdMessage, TIdSMPT e para anexos estou usando TIdAttachmentFile.

 

Quando eu coloco, por exemplo, um anexo chamado x.pdf na minha conta de e-mail da Locaweb o arquivo chega com o nome certo, porém quando mando nas contas do Hotmail e Gmail ele chega com um nome assim: x.pdf name="x.pdf".

 

Alguém tem alguma ideia do que possa ser?

 

Segue a parte do código que anexa o arquivo

 

   anexoCaminho := 'C:\x.pdf';
   anexo := TIdAttachmentFile.Create(MessageParts,anexoCaminho);
   anexo.ContentType := getTipoMIME(ExtractFileExt(anexoCaminho))+ ';name='+ ExtractFileName(anexoCaminho);

 

e a função getTipoMIME

 

function TForm1.getTipoMIME(const Extensao: String): String;
const
 TIPOS_MIME : Array[0..3] of String = ('.jpg;image/jpeg',
                                       '.jpeg;image/jpeg',
                                       '.txt;text/plain',
                                       '.pdf;application/pdf');
var
 Retorno : String;
 tpExt   : String;
 i       : Integer;
begin
 Retorno := '';
 tpExt   := LowerCase(Extensao);

 for I := 0 to Length(TIPOS_MIME) - 1 do
 begin
   if Pos(tpExt,TIPOS_MIME[i]) > 0 then
   begin
     Retorno := Copy(TIPOS_MIME[i],Pos(';',TIPOS_MIME[i]) + 1,length(TIPOS_MIME[i]) - Pos(';',TIPOS_MIME[i]));
     break;
   end;
 end;


 Result := Retorno;
end;

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, acho que consegui resolver.

 

-----

 

Agora há pouco, depois de pesquisar e testar muito eu consegui resolver o problema da seguinte forma:

aqui:

anexo.ContentType := 'application/pdf; name=' + ExtractFileName(anexoCaminho);

 

eu coloquei apenas:

anexo.ContentType := 'application/pdf;';

PS: IMPORTANTE: Com o ponto-e-vírgula!

 

Observando o fonte dos e-mails, parece que ou os serviços de e-mail ou os componentes Indy já incluem o nome do arquivo, de modo que o "name=x.pdf" ficava duplicado. Por algum motivo no Webmail e no Yahoo! isso era ignorado.

 

Segue abaixo o código de envio de e-mail com anexo completo: (Nota: Eu testei apenas enviando para Yahoo!, Hotmail, Gmail e Webmail da Locaweb. Usando como remetente um e-mail do Webmail da Locaweb)

 

Procedure para envio de e-mail com anexo

procedure TForm1.enviar;
var
 anexoCaminho     : String;
 IdAttachmentFile  : TIdAttachmentFile;
 IdSMTP1              : TIdSMTP;
 IdMessage1         : TIdMessage;
begin
 try
   //Mensagem
   IdMessage1 := TIdMessage.Create(Self);
   with IdMessage1 do
   begin
     Recipients.EMailAddresses := 'email_de_destino@xpto.com.br'; //Destinatário

     Subject       := 'Assunto'; //Assunto
     Body.Text     := 'Este e-mail tem um PDF em anexo'; //Corpo do e-mail
     Sender.Name   := 'Fulano'; //Nome de quem está enviando
     From.Name     := 'Fulano'; //Nome de quem está enviando
     From.Address  := 'email_do_remetente@xpto.com.br'; //e-mail de quem está enviando
     ContentType   := 'multipart/mixed'; //Tipo de conteúdo do e-mail
   end;

   //Anexo
   anexoCaminho := 'C:\x.pdf'; //Caminho do arquivo
   with IdAttachmentFile do
   begin
     IdAttachmentFile := TIdAttachmentFile.Create(IdMessage1.MessageParts, anexoCaminho); //Incluindo o anexo na mensagem
     IdAttachmentFile.ContentType := 'application/pdf;'; //Informando o tipo MIME do anexo. IMPORTANTE! Colocar o tipo MIME + ; (ponto-e-vírgula)
     IdAttachmentFile.FileName := ExtractFileName(anexoCaminho); //Nome do arquivo
   end;


   //SMTP
   IdSMTP1    := TIdSMTP.Create(Self); //Criando o objeto
   with IdSMTP1 do
   begin
     Username := 'email_do_remetente@xpto.com.br'; //Nome de usuário (e-mail do remetente)
     Password := 'senha_do_email_do_remetente'; //Senha do remetente
     Host := 'smtp.xpto.com.br'; //Host do remetente

     Connect(); //Conectar
     Authenticate(); //Autenticar

     Send(IdMessage1); //Enviar
     Disconnect(); //Desconectar
   end;

   ShowMessage('Enviado!');
 except
   on e : Exception do
   begin
     MessageDlg('Ocorreu um erro' + #13 + e.Message,mtError,[mbOK],0);
   end;
 end;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.