Página 1 de 4

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 17 Jan 2016 19:05
por asimoes
A dica é a seguinte:

Incluir uma imagem na mensagem do email usando o objeto CDO.Message
Na função Envia_Mail que é chamada dentro da Envia_Email, procurem por AddRelatedBodyPart

O nome da imagem tem que ser o mesmo definido na variável cImagem e no método AddRelatedBodyPart

O teste:

Código: Selecionar todos

AzulHTML     := '<span style="color:#0000FF">'
VermelhoHTML := '<span style="color:#FF0000">'
QuebraHTML   := "<br>"
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.

A função que eu envio email é esta:
Modifiquei algumas informações por motivo de segurança.

Código: Selecionar todos

#include "error.ch"
#include "fileio.ch"

FUNCTION Envia_Email(aArquivo, cAssunto, cMensagem, 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(@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 <xhbsistemas@gmail.com>"
   cUser     := "xhbsistemas@gmail.com" 
   cPass     := "senha"
   vPORTSMTP := 465 
   aCC       := "Alexandre Simäes <a_1964_luz@yahoo.com.br>" // caracteres entre aspas
   aBCC      := "" // caracteres entre aspas
   lConf     := .F.
   lSSL      := .T.
   
   lOk := Config_Mail(aFiles,;
                      cSubject,;
                      aQuem,;
                      cMsg,;
                      cServerIp,;
                      cFrom,;
                      cUser,;
                      cPass,;
                      vPORTSMTP,;
                      aCC,;
                      aBCC,;
                      lConf,;
                      lSSL,;
                      lInformaEnvio)

RETURN lOk

FUNCTION Config_Mail(aFiles, cSubject, aQuem, cMsg, cServerIp, cFrom, cUser, cPass, vPORTSMTP, aCC, aBCC, lConf, lSSL, lInformaEnvio)
LOCAL lRet
LOCAL oCfg, oErroMail
LOCAL lAut:=.T. //cdpar000->mauth
   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
         hwg_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,;
                         lInformaEnvio)
   ENDIF
RETURN lRet

FUNCTION Envia_Mail(oCfg, cFrom, cDest, aFiles, cSubject, cMsg, aCC, aBCC, vEmaiL_Conf, lAut, lSSL, cServerIp, lInformaEnvio)
LOCAL aTo
LOCAL lRet
LOCAL nEle, oErroMail

  hb_Default(@lInformaEnvio, .T.)

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

   FOR I:=1 TO Len(aTo)
      TRY
         IF lInformaEnvio
            MsgTroca("Aguarde, processando o envio do email.")
         ENDIF
         oMsg := WIN_OleCreateObject( "CDO.Message" )
         
         WITH OBJECT oMsg
              :Configuration = oCfg
              :From = cFrom
              :To = aTo[i]
              :Cc = aCC
              :BCC = aBCC
              :Subject = cSubject
              :AddRelatedBodyPart(hb_DirBase()+"img\asaprev1.jpg","asaprev1.jpg",1)
              :Fields:Item("urn:schemas:mailheader:Content-ID"):Value = "<asaprev1.jpg>"
              :Fields:Item("urn:schemas:mailheader:Content-Disposition"):Value = "inline"
              :Fields:Update()
              :HTMLBody = cMsg 
                 
              FOR X := 1 TO Len( aFiles )
                 :AddAttachment(AllTrim(aFiles[x]))
                 hwg_DoEvents()
              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()
              :Send()
               hwg_DoEvents()
         END WITH
         IF lInformaEnvio
            MsgFim()
            hwg_MsgInfo("E-mail enviado com sucesso", "Atenção")
         ENDIF
         lRet:=.T.
      CATCH oErroMail
         IF lInformaEnvio
            MsgFim()
            hwg_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

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 17 Jan 2016 19:15
por asimoes
se a imagem for de uma URL:

cIm:='https://lh3.googleusercontent.com/-hKEP ... anigif.gif'

cImagem:='<p><IMG SRC="&cIm" alt="Logo"></p>'

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

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 08:40
por asimoes
O resultado é esse:
Imagem no Email
Imagem no Email

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 12:56
por fladimir
Aí sim hein ASIMOES....

Vou testar...

Vlw.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 14:52
por asimoes
Agora o exemplo usando tip_MailSend() (*)

(*) Estes exemplos foram testados com Harbour 3.4

Precisa ter estas dll´s na pasta do executável:

libeay32.dll
msvcr120.dll
ssleay32.dll

Precisa das libs:
hbssl.hbc
hbtip.hbc

Código: Selecionar todos

/*
 * Copyright 2009 Viktor Szakats (vszakats.net/harbour)
 * www - http://harbour-project.org
 *
 * Gmail work with ssl on port 465 and with tls on port 587
 * tls mode is fully automatic and require that ssl must be disabled at first (We will activate it on request after STARTTLS command)
 */
#include "hbcompat.ch"
#include "dbinfo.ch"
#include "fileio.ch"
#include "hbdyn.ch"
#include "simpleio.ch"

#require "hbssl"
#require "hbtip"

#if ! defined( __HBSCRIPT__HBSHELL )
   REQUEST __HBEXTERN__HBSSL__
#endif

PROCEDURE Main( cUser, cPassword, cAlias, cFrom, cTo, cCC, cHost )

LOCAL nPort
PUBLIC AzulHTML    :='<span style="color:#0000FF">'
PUBLIC VermelhoHTML:='<span style="color:#FF0000">'
PUBLIC QuebraHTML  :="<br>"

 hb_default( @cUser , "usuario")
 hb_default( @cPassword, "senha" )
 hb_default( @cAlias , "Seu Apelido" )
 hb_default( @cFrom , "seuemail@gmail.com")
 hb_default( @cTo , {"emaildestino@gmail.com"} )
 hb_default( @cCC , "comcopia@gmail.com" )
 hb_default( @cHost , "smtp.gmail.com" )
 
 cHost := Lower( cHost )

 IF ! tip_SSL()
    hwg_MsgInfo("Error: Requires SSL support")
    RETURN
 ENDIF

 cIm := 'https://lh3.googleusercontent.com/-lJ9SOHOjv1Y/Vp0QG_sXorI/AAAAAAAABBs/PW7a4aIYjz8/s574-Ic42/screenshot.png'
 // 
 cImagem:= '<p><IMG SRC="&cIm" alt="Logo"></p>'
 cBody  := "<strong>"+AzulHTML   +"Log de confirma‡Æo de envio de email em: "+HB_DtoC(Date(),"DD/MM/YYYY") +;
            QuebraHTML+;
            VermelhoHTML+"Feito pelo pelo harbour."+"</strong>" +;
            QuebraHTML +;
            QuebraHTML +;
            "VersÆo: "+Version()+" "+hb_compiler() +;
            QuebraHTML +;
            cImagem + ;
            QuebraHTML
                  
 cBodyTemp   := hb_GetEnv("TEMP")+hb_PS()+"BODY.HTML"
 nFileHandle := fCreate(cBodyTemp)
                fWrite(nFileHandle,cBody)
                fClose(nFileHandle)
 
 cSubJect  := "Assunto do email - MINGW - "+Version()+" "+hb_Compiler()     
 aAnexo    := {hb_DirBase()+"teste.txt"} 
 nPriority := 3 //1=Alto, 3=Normal (padrão), 5=Low
 cAlias    := cAlias +" <"+cFrom+"> "
 lRead     := .T.
 nPorta    := 465
 lSSL      := (nPorta==465)
 
 lRet  := tip_MailSend(cHost, ;
                       465, ;
                       cAlias, ;
                       cTo, ;
                       cCC, ;
                       {} , ;
                       cBodyTemp , ;
                       cSubJect , ;
                       aAnexo , ;
                       cUser, ;
                       cPassword, ;
                       "", ;
                       nPriority , ;
                       lRead , ;
                       .F. , ;
                       .F., ;
                       10 , ;
                       NIL , ;
                       .T. , ;
                       lSSL )
          
    If lRet
       hwg_Msginfo("email enviado")
    Else
       hwg_Msgexclamation("Falha enviando email")
    EndIf
 
RETURN


INIT FUNCTION AppSetup()
  
  ANNOUNCE hwg_ErrSys
  
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" ) 
  
  SETMODE(25,80)
 
  SetColor("W+/B")
  
  CLS
 
  SetColor("W+/B")
  
  IniciaJanela()
 

RETURN Nil 
 

FUNCTION IniciaJanela(nLi,nCi,nLf,nCf)
 
LOCAL oCrt
   HB_Default(@nLi,0)
   HB_Default(@nCi,0)
   HB_Default(@nLf,MaxRow())
   HB_Default(@nCf,MaxCol())
  
   
   cTituloJanela:="Teste envio de Email - "+Version()+" "+hb_Compiler()
   
   HB_gtInfo(HB_GTI_FONTNAME, "Lucida Console")
   HB_gtInfo(HB_GTI_WINTITLE, cTituloJanela)
   HB_gtInfo(HB_GTI_ICONFILE, "" )
   HB_gtInfo(HB_GTI_CLOSABLE, .F. )
   HB_gtInfo(HB_GTI_ISGRAPHIC, .T. )
   HB_gtInfo(HB_GTI_STDERRCON, .T. )
   HB_gtInfo(HB_GTI_COMPATBUFFER, .T. ) 
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_SHOWWINDOW, SW_NORMAL )
   HB_GtInfo( HB_GTI_MAXIMIZED, .T. )
    
RETURN Nil
 
FUNCTION HB_GTSYS()
   REQUEST HB_GT_WVT_DEFAULT
   REQUEST HB_GT_WVT
   REQUEST HB_GT_WGU
   REQUEST HB_GT_WVG
RETURN Nil 

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 16:08
por JoséQuintas
Se der uma olhada na hbtip vai conseguir fazer melhor, e verdadeiramente embutir a imagem no html.

Código: Selecionar todos

   cHtml := ["] + "data:" + tip_FileNameMimeType( "any.jpg", cName, cName ) + ";base64," + oEncoder:Encode( cFileContent ) + ["]
email.png
Pequena correção/informação:
Essas DLLs não tem nada a ver com a imagem.
Elas tem a ver com o tipo de autenticação do servidor de email.
Não tenho nenhuma delas instalada em nenhum lugar.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 16:23
por asimoes
Quintas,

Tem como você postar um exemplo completo? assim fica dificil entender. desculpa ai o velinho.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 19:26
por asimoes
Corrigindo:

Basta: libeay32.dll

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 18 Jan 2016 22:20
por JoséQuintas
Dependendo da conta de email, não precisa nada.

Sobre a imagem:

TUDO que está no email usa a rotina de conversão da hbtip.
Eu só olhei como a hbtip faz, e fiz igual.

Código: Selecionar todos

      cHtmlText += [ <img src=] + HtmlEncodeJPEG( ::cLogotipoContent ) + [ width="150" height="75">]

Código: Selecionar todos

FUNCTION HtmlEncodeJPEG( cFileContent )

   LOCAL cTxt, oEncoder := TipEncoderBase64():New()

   cTxt := ["] + "data:" + tip_FileNameMimeType( "ptprapqp.jpg",  "ptprapqp", "ptprapqp" ) + ";base64," + oEncoder:Encode( cFileContent ) + ["]
   RETURN cTxt

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 07:21
por asimoes
Quintas,

Estamos falando do harbour 3.4

Dos fontes que estão na pasta contrib\hbtip\tests

Qual destes fontes funcionam com o seu exemplo:

tipmail.prg
tipmmail.prg
gmail.prg
email.prg

Email e GMail precisam de SSL e exigem a dll libeay32.dll para funcionar.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 08:43
por JoséQuintas
Não faço a menor idéia do que esses fontes tem.
Mas se prestou atenção na rotina, não faz diferença.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 08:50
por asimoes
Quintas,

2 peguntas:

1- Qual a função de envio de email do harbour você usa?
2- O que é ::cLogotipoContent, é um arquivo?

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 09:02
por asimoes
Quintas,

Tentei aqui o seu exemplo mas nada aconteceu aparece um quadrado sem imagem.

Obs.: estou usando os objetos CDO.Configuration e CDO.Message
Screen Shot 01-19-16 at 08.59 AM.PNG

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 09:20
por asimoes
Tentei tip_MailSend também não funcionou.

Deixa pra lá, vou continuar no meu método lusitano.

Inserir uma imagem ao Corpo da Mensagem do Email

Enviado: 19 Jan 2016 11:28
por JoséQuintas
Bom sinal, pelo menos o espaço da imagem está reservado.

Vamos lá, pegando dos seus posts anteriores:

Código: Selecionar todos

cImagem:='<IMG SRC="&cIm" alt="Logo">'
e pegando o que postei:

Código: Selecionar todos

cHtmlText += [ <img src=] + HtmlEncodeJPEG( ::cLogotipoContent ) + [ width="150" height="75">]
Usam a mesma coisa, portanto vão funcionar com o mesmo esquema de envio de email.
É só trocar uma coisa por outra, ok, essa parte não tem porque ter dúvida.


Agora vamos à função, tem pouca coisa...

Código: Selecionar todos

FUNCTION HtmlEncodeJPEG( cFileContent )
 LOCAL cTxt, oEncoder := TipEncoderBase64():New()
 cTxt := ["] + "data:" + tip_FileNameMimeType( "ptprapqp.jpg", "ptprapqp", "ptprapqp" ) + ";base64," + oEncoder:Encode( cFileContent ) + ["]
 RETURN cTxt

Vamos ver...
Pelo nome, recebe uma imagem jpeg.
Mas e aquele nome "ptprapqp.jpg"? Porque não cFileName no parâmetro da função?
Então não tem a ver com o nome de arquivo....

FileContent, isso não deve ser arquivo feliz e contente.....
O que é content? ..... conteúdo....
Ah.... então só pode ser o conteúdo do arquivo.

Então vamos testar isto pra ver o que dá

Código: Selecionar todos

cFileContent := Memoread( "imagem.jpg" )