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:
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.
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