Inserir uma imagem ao Corpo da Mensagem do Email

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por asimoes »

Quintas,

Para não esgotar o assunto:

COM CDOSYS funciona usar uma imagem local (computador) no corpo do email (webmail/thunderbird), essa eu já tinha resolvido, mas bati cabeça para descobrir como fazer, buscando no google algum exemplo que não era muito claro, enfim acabei descobrindo.

É assim:

Vou postar a função novamente para demonstrar o exemplo:
Não é bem assim, mas é só para titulo de demonstração:
O arquivo asaprev1.png está em uma pasta \sistema\img
O programa roda na pasta sistema
A chamada da função de email:

Código: Selecionar todos

cMensagem:=AzulHTML +"Log de confirmação de atualização de sistema em: "+;
HB_DtoC(Date(), "DD/MM/YYYY")+" "+Time()+" "+QuebraHTML+;
VermelhoHTML+"Feito pelo Monitor AsaPrev Versão 3." + QuebraHTML + cImagem + QuebraHTML
Envia_Email({hb_DirBase()+"ASAPREV.NEW"},, cMensagem, "asaprev1.png", .F.)
Dentro da função Envia_Email tem a chamada para Config_Mail que chama Envia_Mail (eu sei que poderia estar tudo em uma única função) mas o intuito é mostrar como é feita a mágica.
O principal está na função Envia_Mail
Na chamada destes métodos:
:AddRelatedBodyPart(hb_DirBase()+"img"+hb_PS()+cImagem, cImagem, 1) //aqui adiciona a imagem ao corpo da mensagem.
:Fields:Item("urn:schemas:mailheader:Content-ID"):Value := "<"+cImagem+">" //aqui é indentificação da image
:Fields:Item("urn:schemas:mailheader:Content-Disposition"):Value := "inline"


E isso funciona tanto em algum webmail como em algum gerenciador de email por exemplo thunderbird, etc.

Código: Selecionar todos

FUNCTION Envia_Email(aArquivo, cAssunto, cMensagem, cImagem, lInformaEnvio)
LOCAL lOk := .T.

   hb_Default(@aArquivo,{})
   hb_Default(@cAssunto, "Log de atualização de sistema em: "+hb_DtoC(Date(), "DD/MM/YYYY"))
   hb_Default(@cMensagem, "Log de erro de sistema em: "+hb_DtoC(Date(), "DD/MM/YYYY"))
   hb_Default(@cImagem, "")
   hb_Default(@lInformaEnvio, .T.)
   
   aFiles   := aArquivo // pode ser uma matriz com vários endereços
   cSubject := cAssunto
   aQuem    := "Alexandre Simões <asimoesluz@gmail.com>"
   cMsg     := cMensagem
   cServerIp:= "smtp.gmail.com" // servidor smtp
   cFrom    := "Sistema AsaPrev <origem@gmail.com>"
   cUser    := "origem@gmail.com" //"xhbsistemas"
   cPass    := senha"
   vPORTSMTP:= 465 
   aCC      := "Alexandre Simões <copia@yahoo.com.br>" 
   aBCC     := "" // caracteres entre aspas
   lConf    := .F.
   lSSL     := .T.
   
   lOk := Config_Mail(aFiles,;
                      cSubject,;
                      aQuem,;
                      cMsg,;
                      cServerIp,;
                      cFrom,;
                      cUser,;
                      cPass,;
                      vPORTSMTP,;
                      aCC,;
                      aBCC,;
                      lConf,;
                      lSSL,;
                      cImagem,;
                      lInformaEnvio)

RETURN lOk

FUNCTION Config_Mail(aFiles, cSubject, aQuem, cMsg, cServerIp, cFrom, cUser, cPass, vPORTSMTP, aCC, aBCC, lConf, lSSL, cImagem, lInformaEnvio)
LOCAL lRet
LOCAL oCfg, oErroMail
LOCAL lAut := .T. //cdpar000->mauth
   hb_Default(@cImagem, "")
   hb_Default(@lInformaEnvio, .T.)
   TRY
      oCfg := win_OleCreateObject( "CDO.Configuration" )
      WITH OBJECT oCfg:Fields
           :Item("http://schemas.microsoft.com/cdo/configuration/smtpserver"):Value       := cServerIp
           :Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport"):Value   := vPORTSMTP
           :Item("http://schemas.microsoft.com/cdo/configuration/sendusing"):Value        := 2
           :Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"):Value := lAut
           :Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl"):Value       := lSSL
           :Item("http://schemas.microsoft.com/cdo/configuration/sendusername"):Value     := AllTrim(cUser)
           :Item("http://schemas.microsoft.com/cdo/configuration/sendpassword"):Value     := AllTrim(cPass)
           :Update()
      END WITH
      lRet := .T.
   CATCH oErroMail
      IF lInformaEnvio
         MsgStop("Não foi possível enviar o e-mail!"                       +hb_EOL()+ ;
                 "Error: "     + Transform(oErroMail:GenCode,   nil) + ";" +hb_EOL()+ ;
                 "SubC: "      + Transform(oErroMail:SubCode,   nil) + ";" +hb_EOL()+ ;
                 "OSCode: "    + Transform(oErroMail:OsCode,    nil) + ";" +hb_EOL()+ ;
                 "SubSystem: " + Transform(oErroMail:SubSystem, nil) + ";" +hb_EOL()+ ;
                 "Mensagem: "  + oErroMail:Description, "Atenção", 150, 10000, 2, .T.)
      ENDIF
      lRet := .F.
   END
   //--> FIM DAS CONFIGURAÇOES.
   IF lRet
      lRet := Envia_Mail(oCfg,;
                         cFrom,;
                         aQuem,;
                         aFiles,;
                         cSubject,;
                         cMsg,;
                         aCC,;
                         aBCC,;
                         lConf,;
                         lAut,;
                         lSSL,;
                         cServerIp,;
                         cImagem,;
                         lInformaEnvio)
   ENDIF
RETURN lRet

FUNCTION Envia_Mail(oCfg, cFrom, cDest, aFiles, cSubject, cMsg, aCC, aBCC, vEmaiL_Conf, lAut, lSSL, cServerIp, cImagem, lInformaEnvio )
LOCAL aTo
LOCAL lRet
LOCAL nEle, oErroMail
LOCAL cImagem1:='<img src="asaprev1.png" alt="AsaPrev">'

  hb_Default(@cImagem, "")
  hb_Default(@lInformaEnvio, .T.)
  
  IF !Empty(cImagem)
     cImagem1:='<img src="'+cImagem+'" alt="AsaPrev">'
  ENDIF

  aTo:= { cDest } //--> PARA
  
  nEle := 1

   FOR I:=1 TO Len(aTo)
      TRY
         Notificar("Aguarde, processando o envio do email.", "Monitor AsaPrev")
         oMsg := win_OleCreateObject( "CDO.Message" )
         WITH OBJECT oMsg
              :Configuration := oCfg
              :From          := cFrom
              :To            := aTo[i]
              :Cc            := aCC
              :BCC           := aBCC
              :Subject       := cSubject
              * ---------------------------------------------------------
              * Aqui adiciona a imagem ao corpo da mensagem
              * ---------------------------------------------------------
              IF !Empty(cImagem)
                 :AddRelatedBodyPart(hb_DirBase()+"img"+hb_PS()+cImagem, cImagem, 1)
                 :Fields:Item("urn:schemas:mailheader:Content-ID"):Value := "<"+cImagem+">"
                 :Fields:Item("urn:schemas:mailheader:Content-Disposition"):Value := "inline"
                 :Fields:Update()
              ENDIF
              :HTMLBody := cMsg + QuebraHTML + IF(!Empty(cImagem), cImagem1, "")
              * ------------------------------------------------------------------------------------------------
              FOR X := 1 TO Len( aFiles )
                 :AddAttachment(AllTrim(aFiles[x]))
                 DO EVENTS
              NEXT
              :Fields("urn:schemas:mailheader:disposition-notification-to"):Value := cFrom
              :Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"):Value := lAut
              :Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl"):Value := lSSL
              :Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver"):Value := cServerIp
              :Fields:update()
              DO EVENTS
              :Send()
         END WITH
         IF lInformaEnvio
            MsgInfo("E-mail enviado com sucesso", "Atenção")
         ENDIF
         lRet := .T.
      CATCH oErroMail
         IF lInformaEnvio
            MsgStop("Não foi possível enviar a mensagem: "+cSubject+hb_EOL()+;
                        "para o email: " + aTo[i]+"."                  +hb_EOL()+;
                        "Erro: " +oErroMail:Description , "Atenção")
         ENDIF
         lRet := .F.
      END
   NEXT
   
   oCfg := Nil
   oMsg := Nil

RETURN lRet
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por JoséQuintas »

Ainda não tinha pensado nisso de novo, mas....

Talvez dê pra colocar essa imagem como anexo, ao invés de embutido no html, e de alguma forma ser considerado como parte do email.


Lembro que no blat eu usava algo como <img src="cid:imagem">, e mais a opção embed pras imagens.

Vamos precisar de um email onde isso funcione, e salvá-lo em formato mime, pra ver como é feito.

Depois é alterar a montagem do email no Harbour pra fazer igual.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por asimoes »

Outras considerações, achei no google
Screen Shot 01-22-16 at 11.35 AM.PNG
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por rubens »

Boa tarde...

ASimoes,

Qual o conteúdo da variável

QuebraHTML

Na minha cMSG usei hb_eol() para quebra de linha mas percebi na linha que voce usa a QuebraHTML é um texto html então provavelmente deve ter sido isso que não deixou o meu texto formatado. Foi todo enviado com uma linha só...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por asimoes »

Olá Rubens,

QuebraHTML := "<br>"
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por JoséQuintas »

Agora que vi seu último post.
Acabei chegando no mesmo texto.

https://sendgrid.com/blog/embedding-ima ... ils-facts/

Resumindo: Não existe jeito 100% eficiente.

3 formas citadas:

- Usando CID:, igual BLAT
- Incorporando no Html igual eu faço
- Usando link externo
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por lugab »

Boa noite, Asimoes...

Para testar o primeiro exemplo que vc postou ( primeiro da primeira página) precisa desses arquivos também ?
libeay32.dll
msvcr120.dll
ssleay32.dll
Precisa das libs:
hbssl.hbc
hbtip.hbc
Se a respost for não, diga quais arquivos precisa...


Só pra lembrar, o seu primeiro exemplo ( que pretendo testar ) , foi

Código: Selecionar todos

AzulHTML  := '<span style="color:#0000FF">'
VermelhoHTML := '<span style="color:#FF0000">'
QuebraHTML := "
"
cImagem:='<img src="asaprev1.jpg" alt="Monitor AsaPrev">'

cMensagem:=AzulHTML  +"Log de confirma‡Æo de atualiza‡Æo de sistema em: "+hb_DtoC(Date(),"DD/MM/YYYY")+QuebraHTML+;
         VermelhoHTML+"Feito pelo Monitor AsaPrev."+QuebraHTML+;
         cImagem
             
Envia_Email({hb_DirBase()+"ASAPREV.NEW"},,cMensagem,.F.) //Envia email para mim informando que foi feito a atualização.
lugab
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por asimoes »

Olá Lugab,

Você precisa somente destas dll´s e libs

libeay32.dll
msvcr120.dll
hbtip.hbc
hbssl.hbc

As dll´s você vai achar aqui nesta url

http://slproweb.com/products/Win32OpenSSL.html

Ou:
http://slproweb.com/download/Win32OpenSSL-1_0_2f.exe
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por lugab »

Obrgado, Asimoes...
lugab
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por Itamar M. Lins Jr. »

Ola!
Passei horas aqui... Estudando como DIAGRAMAR o corpo do texto.
Se salvar em arquivo os comandos HTML, fica ok o email, se mandar como string, o texto, os comandos html, aparecem como se fosse parte do texto.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por JoséQuintas »

Pois é.... Só agora vou testar a minha rotina.

Achei isto no fonte

Código: Selecionar todos

#ifndef HARBOUR34
   FUNCTION hb_MimeFName( x )
      RETURN x
#endif
Então não sei se vai funcionar no 3.2
Na época do post era harbour 3.4.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
SOSSOFT
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 23 Out 2024 10:04

Inserir uma imagem ao Corpo da Mensagem do Email

Mensagem por SOSSOFT »

Eu tinha envio de imagem no email pelo Gmail usando hbtip mas faz tempo que não testo e árece que o gmail mudou bastante, não é?
Alguém usa assim?
Responder