Visualizar email com imagem enviado com INDY

Delphi

19/10/2006

Estou enviando um email com imagem no corpo da mensagem pelo Indy. Em clientes de email como outlook eu consigo visualizar a imagem corretamente. Em webmail como o YahooMail tudo ocorre normalmente mas no GMAIL a imagem aparece como anexo. Alguem sabe se tem como conseguir com que a imagem seja exibida no GMAIL?


Rjun

Rjun

Curtidas 0

Respostas

Massuda

Massuda

19/10/2006

O GMail tem um bloqueio para exibição de imagens em mensagens HTML, [b:8f78e5299c]independente[/b:8f78e5299c] das imagens estarem embutidas na própria mensagem ou terem de ser baixadas de algum servidor.

Quem controla a exibição é quem recebeu o email.

Quando uma mensagem com imagens é recebida, no topo aparece um aviso...
[b:8f78e5299c]Imagens não exibidas[/b:8f78e5299c] Exibir imagens abaixo - Sempre exibir imagens do fulano@inter.net
...para ver as imagens, o destinatário tem de clicar em ´Exibir...´ ou ´Sempre exibir...´.


GOSTEI 0
Rjun

Rjun

19/10/2006

Massuda

O problema é que não aparece essa mensagem. Aparece somente os anexos, como se a imagem tivesse sido enviada como um anexo comum.


GOSTEI 0
Massuda

Massuda

19/10/2006

Precisa fazer uma pequena alteração no código HTML da sua mensagem, conforme esse exemplo:
...
Html := TIdText.Create(Email.MessageParts);
Html.Body.Text := ´<html><body>´ + 
  ´<img src="cid:imagem.jpg" >´ +
  ´</body></html>´;
Html.ContentType := ´text/html´;

Imagem := TIdAttachment.Create(Email.MessageParts, ´c:\pasta\imagem.jpg´);
Imagem.ContentType := ´image/jpg´;
Imagem.Headers.Add(´Content-ID: <imagem.jpg>´);
...
...o importante aqui é o [b:1a58e9073c]cid:[/b:1a58e9073c] que está na tag [b:1a58e9073c]img[/b:1a58e9073c].


GOSTEI 0
Rjun

Rjun

19/10/2006

Massuda, coloco abaixo o código que estou usando.

procedure AttachImage;
  var
    newText: TIdText;
    newAttach: TIdAttachment;
  begin
    if (EmailContent.BodyIsHtml) then
      Exit;

    EmailContent.BodyText := StringReplace(EmailContent.BodyText, ´#1310´, ´<br>´, [rfReplaceAll]);

    // Converte o texto em um HTML
    newText := TIdText.Create(IndyMessage.MessageParts);
    newText.ContentType := ´text/html´;
    newText.Body.Add(´<html><body>´);
    newText.Body.Add(EmailContent.BodyText);
    newText.Body.Add(´<br><br>´);
    newText.Body.Add(´<img src="cid:´ + ExtractFileName(EmailContent.AttachmentImage) + ´">´);
    newText.Body.Add(´</body></html>´);

    newText := TIdText.Create(IndyMessage.MessageParts);
    newText.ContentType := ´text/html´;

    // Anexa a imagem ao corpo do email
    newAttach := TIdAttachment.Create(IndyMessage.MessageParts, EmailContent.AttachmentImage);
    newAttach.ContentType := ´image/jpg´;
    newAttach.ExtraHeaders.Values[´Content-ID´] := ´<´ + ExtractFileName(EmailContent.AttachmentImage) + ´>´;
  end;


Aparentemente está igual a sua sugestão. Mesmo assim não consigo comque o email seja exibido corretamente no gmail e no hotmail.


GOSTEI 0
Massuda

Massuda

19/10/2006

Pode parecer estranho, mas inclua no seu código...
...
  EmailContent.BodyText := ....

  newText := TIdText.Create(IndyMessage.MessageParts); 
  newText.Body.Text := ´´; 
  newText.ContentType := ´text/plain´; 

  // Converte o texto em um HTML
...



GOSTEI 0
Rjun

Rjun

19/10/2006

Massuda, ainda não deu certo. Tem mais alguma sugestão?


GOSTEI 0
Massuda

Massuda

19/10/2006

Não sei... estou usando a versão 9.0.0.18 com D5. Este código funciona sem problemas...
var
  Email: TIdMessage;
  Texto: TIdText;
  Html: TIdText;
  Anexo: TIdAttachment;
begin
  Email := TIdMessage.Create(nil);
  try
    ...ajusta remetente, destinatário, etc...

    Email.ContentType := ´multipart/mixed´;

    Texto := TIdText.Create(Email.MessageParts);
    Texto.Body.Text := ´This message contains HTML and images.´;
    Texto.ContentType := ´text/plain´;

    Html := TIdText.Create(Email.MessageParts);
    Html.Body.Text := ´<html><body>´ +
      ´Mensagem de <b>Teste</b><br>´ +
      ´<img src="cid:imagem.jpg" >´ +
      ´</body></html>´;
    Html.ContentType := ´text/html´;

    Anexo := TIdAttachment.Create(Email.MessageParts, ´c:\pasta\imagem.jpg´);
    Anexo.ContentType := ´image/jpg´;
    Anexo.Headers.Add(´Content-ID: <imagem.jpg>´);

    ... envia o email...
  finally
    Email.Free;
  end;
end;
.
No GMail, a mensagem exibe o aviso que existem imagens não exibidas, como citei anteriormente.


GOSTEI 0
Rjun

Rjun

19/10/2006

Massuda, minha versão do Indy é a 9.0.0.10 com D7. Baixei um instalador da versão 9.0.0.19. Executei o instalador mas quando coloque um componente e vejo o form com a versãoa ainda aparece 9.0.0.10. Será que não foi atualizado?


GOSTEI 0
Massuda

Massuda

19/10/2006

Nunca usei o instalador, sempre instalei manualmente.

Na pasta com os .pas do Indy, a versão está no arquivo IdVers.inc.

Verifiquei meu Indy e vi que estou usando a versão 9.0.0.50(!), que é uma versão ´snapshot´ do CVS deles. Se você tiver interesse, pode baixar [url=http://indy.fulgan.com/ZIP/]desta página[/url].


GOSTEI 0
Massuda

Massuda

19/10/2006

Outra coisa... certifique-se de ter removido as DCUs originais (que vieram com o Delphi) do Indy que eventualmente estejam nas pastas padrão do Delphi (($Delphi)\lib, ($Delphi)\source, etc)


GOSTEI 0
Rjun

Rjun

19/10/2006

Massuda

Um dia inteiro, mas consegui. Obrigado pela força. Realmente tive que atualizar a versão para 9.0.0.18. E essa parte do código foi extremamente necessária.

Texto := TIdText.Create(Email.MessageParts); 
Texto.Body.Text := ´This message contains HTML and images.´; 
Texto.ContentType := ´text/plain´



GOSTEI 0
POSTAR