Dúvida TMailMessage

Bom dia

Existe a possibilidade de que o email informado no campo "DE (FROM)" da classe TMailMessage seja diferente do utilizado na autenticação e envio do e-mail ?

Ex.:

O e-mail protheus@meuemail.com.br vai fazer a autenticação na classe TMailManager e o envio do e-mail

Porém o e-mail recebido pelo destinatário terá o e-mail user@meuemail.com.br no campo "DE (FROM)"

Obrigado

Thyago,

A classe de mensagem TMailMessage permite você escrever um "DE" diferente, isso utilizando a propriedade cFrom:


oMessage:cFrom := "Mendes, Daniel"

https://tdn.totvs.com/display/tec/TMailMessage%3AcFrom


Porém isso pode ser alterado conforme os servidores envolvidos no processo.

Por exemplo, eu fiz o envio com esse valor acima no cFrom, porém o GMail modificou o mesmo e criou um header específico dele com esse valor:


X-Google-Original-From: Mendes, Daniel

O from recebido foi o meu e-mail...

Já o teste com o hotmail (sim, eu tenho hotmail de milianos), ele nem envia o e-mail... Fiz diversos testes e só com a propriedade cFrom igual ao e-mail de autenticação ele permitiu o envio.

Se não me engano depende das permissões no servidor de e-mail, acredito que tem alguns serviços de e-mail que tipo locaweb e etc… que não deixam mudar o from. kkkkk, eu também tenho hotmail é sinal de experiência rsrs.

Thyago,

Tem uma função do terminal de informação (https://terminaldeinformacao.com/2017/10/17/funcao-dispara-e-mail-varios-anexos-em-advpl/) que eu usei como base no meu sistema e que resolve essa tua questão passando o cDe como argumento. Diferente do fonte original, no fonte abaixo o cDe é usado em oMsg:cFrom := cDe, mas a autenticação é feita com o MV_RELACNT (oSrv:Init("", cServer, cUser, cPass, 0, nPort)). No teu caso, tu faria a autenticação no servidor de e-mail com o protheus@meuemail.com.br, mas a mensagem vai com o e-mail que tu quiser (user@meuemail.com.br).

Espero que te ajude.


//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zEnvMail
Função para disparo do e-mail utilizando TMailMessage e tMailManager com opção de múltiplos anexos
@author Atilio
@since 26/05/2017
@version 1.0
@type function
    @param cPara, characters, Destinatário que irá receber o e-Mail
    @param cAssunto, characters, Assunto do e-Mail
    @param cCorpo, characters, Corpo do e-Mail (com suporte à html)
    @param aAnexos, array, Anexos que estarão no e-mail (devem estar na mesma pasta da protheus data)
    @param lMostraLog, logical, Define se será mostrado mensagem de log ao usuário (uma tela de aviso)
    @param lUsaTLS, logical, Define se irá utilizar o protocolo criptográfico TLS
    @return lRet, Retorna se houve falha ou não no disparo do e-Mail
@example Exemplos:
    -----
    1 - Mensagem Simples de envio
    u_zEnvMail("teste@servidor.com.br", "Teste", "Teste TMailMessage - Protheus", , .T.)

    -----
    2 - Mensagem com anexos (devem estar dentro da Protheus Data)
    aAnexos := {}
    aAdd(aAnexos, "\pasta\arquivo1.pdf")
    aAdd(aAnexos, "\pasta\arquivo2.pdf")
    aAdd(aAnexos, "\pasta\arquivo3.pdf")
    u_zEnvMail("teste@servidor.com.br", "Teste", "Teste TMailMessage com anexos - Protheus", aAnexos)

@obs Deve-se configurar os parâmetros:
    * MV_RELACNT - Conta de login do e-Mail    - Ex.: email@servidor.com.br
    * MV_RELPSW  - Senha de login do e-Mail    - Ex.: senha
    * MV_RELSERV - Servidor SMTP do e-Mail     - Ex.: smtp.servidor.com.br:587
    * MV_RELTIME - TimeOut do e-Mail           - Ex.: 120
/*/

User Function zEnvMail(cPara, cAssunto, cCorpo, aAnexos, lMostraLog, lUsaTLS, cDe)
    Local aArea        := GetArea()
    Local nAtual       := 0
    Local lRet         := .T.
    Local oMsg         := Nil
    Local oSrv         := Nil
    Local nRet         := 0
    Local cFrom        := Alltrim(GetMV("MV_RELACNT"))
    Local cUser        := SubStr(cFrom, 1, At('@', cFrom)-1)
    Local cPass        := Alltrim(GetMV("MV_RELPSW"))
    Local cSrvFull     := Alltrim(GetMV("MV_RELSERV"))
    Local cServer      := Iif(':' $ cSrvFull, SubStr(cSrvFull, 1, At(':', cSrvFull)-1), cSrvFull)
    Local nPort        := Iif(':' $ cSrvFull, Val(SubStr(cSrvFull, At(':', cSrvFull)+1, Len(cSrvFull))), 587)
    Local nTimeOut     := GetMV("MV_RELTIME")
    Local cLog         := ""
    Default cPara      := ""
    Default cAssunto   := ""
    Default cCorpo     := ""
    Default aAnexos    := {}
    Default lMostraLog := .F.
    Default lUsaTLS    := .F.

    //Se tiver em branco o destinatário, o assunto ou o corpo do email
    If Empty(cPara) .Or. Empty(cAssunto) .Or. Empty(cCorpo)
        cLog += "001 - Destinatario, Assunto ou Corpo do e-Mail vazio(s)!" + CRLF
        lRet := .F.
    EndIf

    If lRet
        //Cria a nova mensagem
        oMsg := TMailMessage():New()
        oMsg:Clear()

        //Define os atributos da mensagem
        oMsg:cFrom    := cDe
        oMsg:cTo      := cPara
        oMsg:cSubject := cAssunto
        oMsg:cBody    := cCorpo

        //Percorre os anexos
        For nAtual := 1 To Len(aAnexos)
            //Se o arquivo existir
            If File(aAnexos[nAtual])

                //Anexa o arquivo na mensagem de e-Mail
                nRet := oMsg:AttachFile(aAnexos[nAtual])
                If nRet < 0
                    cLog += "002 - Nao foi possivel anexar o arquivo '"+aAnexos[nAtual]+"'!" + CRLF
                EndIf

            //Senao, acrescenta no log
            Else
                cLog += "003 - Arquivo '"+aAnexos[nAtual]+"' nao encontrado!" + CRLF
            EndIf
        Next

        //Cria servidor para disparo do e-Mail
        oSrv := tMailManager():New()

        //Define se irá utilizar o TLS
        If lUsaTLS
            oSrv:SetUseTLS(.T.)
        EndIf

        //Inicializa conexão
        nRet := oSrv:Init("", cServer, cUser, cPass, 0, nPort)
        If nRet != 0
            cLog += "004 - Nao foi possivel inicializar o servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF
            lRet := .F.
        EndIf

        If lRet
            //Define o time out
            nRet := oSrv:SetSMTPTimeout(nTimeOut)
            If nRet != 0
                cLog += "005 - Nao foi possivel definir o TimeOut '"+cValToChar(nTimeOut)+"'" + CRLF
            EndIf

            //Conecta no servidor
            nRet := oSrv:SMTPConnect()
            If nRet <> 0
                cLog += "006 - Nao foi possivel conectar no servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF
                lRet := .F.
            EndIf

            If lRet
                //Realiza a autenticação do usuário e senha
                nRet := oSrv:SmtpAuth(cFrom, cPass)
                If nRet <> 0
                    cLog += "007 - Nao foi possivel autenticar no servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF
                    lRet := .F.
                EndIf

                If lRet
                    //Envia a mensagem
                    nRet := oMsg:Send(oSrv)
                    If nRet <> 0
                        cLog += "008 - Nao foi possivel enviar a mensagem: " + oSrv:GetErrorString(nRet) + CRLF
                        lRet := .F.
                    EndIf
                EndIf

                //Disconecta do servidor
                nRet := oSrv:SMTPDisconnect()
                If nRet <> 0
                    cLog += "009 - Nao foi possivel disconectar do servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF
                EndIf
            EndIf
        EndIf
    EndIf

    //Se tiver log de avisos/erros
    If !Empty(cLog)
        cLog := "zEnvMail - "+dToC(Date())+ " " + Time() + CRLF + ;
            "Funcao - " + FunName() + CRLF + CRLF +;
            "Existem mensagens de aviso: "+ CRLF +;
            cLog
        ConOut(cLog)

        //Se for para mostrar o log visualmente e for processo com interface com o usuário, mostra uma mensagem na tela
        If lMostraLog .And. ! IsBlind()
            Aviso("Log", cLog, {"Ok"}, 2)
        EndIf
    EndIf

    RestArea(aArea)
Return lRet