Enviando emails pelo xHarbour

Projeto Harbour

 Harbour Project

Estava faltando descomplicar...


 

Para enviar emails pelo xHarbour é melhor utilizar a função SendMail que estamos anexando a esta matéria no rodapé para download.

Veja sua sintaxe:

FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, lTrace, lPopAuth, lnoauth, nTimeOut)
/*
cServer    -> Obrigatório. IP ou domínio do servidor de emails
nPort      -> Opcional. Porta usada pelo servidor de emails

cFrom      -> Obrigatório. Email do remetente
aTo        -> Obrigatório. String ou array de endereços de email para serem enviados
aCC        -> Opcional. String ou array de endereços de email para CC (Carbon Copy)
aBCC       -> Opcional. String ou array de endereços de email para BCC (Blind Carbon Copy)
cBody      -> Opcional. A mensagem do corpo do email como texto ou arquivo HTML

cSubject   -> Opcional. Assunto do email

aFiles     -> Opcional. Array de arquivos para serem enviados como anexo
cUser      -> Obrigatório. Nome de usuário do servidor POP3
cPass      -> Obrigatório. Senha do cUser
cPopServer -> Obrigatório. Nome ou endereço do servidor de emails POP3 [sic][Usa-se o SMTP para enviar email]
nPriority  -> Opcional. Prioridade do Email: 1=Alta, 3=Normal (Padrão), 5=Baixa
lRead      -> Opcional. Se for .T., uma requisição de confirmação será solicitada. Por padrão é .F.
lTrace     -> Opcional. Se for .T., um arquivo de log é criado (sendmail<nNr>.log). O padrão é .F.
lnoauth    -> Opcional. Desativa método de autenticação
nTimeOut   -> Opcional. Número de milisegundos para esperar. O padrão é 20000 (20s).
*/

 

Veja dois exemplos de minha autoria para enviar emails pelo xHarbour com o SendMail:

 

IF (ALERT("ENVIA ARQUIVOS POR EMAIL AGORA?", {"Sim", "Não"})) = 1
   @ 24,00 SAY PADC("Preparando email... AGUARDE!",80) COLOR "W+/BG"

   // ARQUIVOS A SEREM ENVIADOS
   aFILES := {cPASTA+cARQLC, cPASTA+cARQLI, cPASTA+cARQCON}

   // COMPACTA ARQUIVOS
   fZIP := cPASTA+"Portal.zip"
   IF FILE(fZIP)
      RUN ("DEL "+fZIP) // APAGA ZIP ANTERIOR
   ENDIF
   HB_ZIPFILE(fZIP, aFILES) // COMPACTA OS 3 ARQUIVOS EM PORTAL.ZIP

   // preparing data for eMail
   cSubject  := "Aqui vai o assunto do seu email"
   cFrom     := "email@remetente.com.br"    // email do remetente
   cMAILUSER := "usuariodoemail"            // login de acesso do seu email
   cPASSWORD := "senhadoemail"              // sua senha de email
   cSMTP     := "smtp.seudominio.com.br"    // seu domínio do email
   cTo       := "email@destinatario.com.br" // email do destinatário
   cCC       := cFrom                       // manda cópia carbono pra você mesmo ter certeza que deu certo
   aAttach   := {fZIP}                      // sempre array


   cBody := "Prezados,"+HB_OsNewLine()+HB_OsNewLine()+;
            HB_OemToAnsi("Estamos encaminhando as informações da STU-MAC/CBTU para o Portal da Transparência referente ao período de ";

            +DTOC(dINIPROC)+" a "+DTOC(dFIMPROC)+".")+HB_OsNewLine()+;
            "Atenciosamente,"+HB_OsNewLine()+HB_OsNewLine()+;
            "Fulano de Tal"+HB_OsNewLine()+;
            "Cargo/empresa"+HB_OsNewLine()+;
            "Fone: (99) 9999-9999"

   nEMAILSIZE := HB_FSIZE(fZIP) / 1024
   @ 24,00 SAY PADC("Enviando arquivo Portal.zip por email... ("+ALLTRIM(STR(nEMAILSIZE))+"Kb) AGUARDE!",80) COLOR "W+/BG"

   IF HB_SENDMAIL(cSMTP,, cFROM, cTO, cCC,, cBODY, cSUBJECT, aAttach, cMAILUSER, cPASSWORD, cSMTP, 1, .T., .T.)
      ALERT("ARQUIVOS ENVIADOS COM ÊXITO.")
   ELSE
      ALERT("Falha ao enviar o email.")
   ENDIF
ENDIF
 

Enviar emails pelo sistema pode ser útil quando você tem que mandar um email para vários destinatários, ninguém pode conhecer o email do outro (para evitar conluios) e você precisa do comprovante de envio (prova de pesquisa de mercado). Assim, não adianta mandar via BCC, pois não vai ter comprovante.

Veja outro exemplo de minha autoria para resolver esse problema:

 

#INCLUDE "COMMON.CH"
FUNCTION ORCAMENTO()
PRIVATE LL, nMAXPROW
SAVE SCREEN TO cTEL
nSIGN := 0

ABREDBF("GRUPOS", "GRP")
ABREDBF("SUBGRUPO", "SGR")
ABREDBF("USUARIOS", "US")
ABREDBF("UNIDADE", "UG")
ABREDBF("CADASTRO", "CRC")
ABREDBF("ESPECIAL", "ESP")
ABREDBF("PROCESSO", "PRO")

US->(ORDSETFOCUS("CODIGO"))
US->(DBSEEK(xOPERADOR))

cEMAIL := LOWER(US->EMAIL)
cTELEFONE := TRANSFORM(US->TELEFONE, "@R (99) 9999-9999")

@ 01,00 SAY PADC("SOLICITAÇÃO DE ORÇAMENTO POR EMAIL",80) COLOR "N/W+*"

nGRP := nESP := 0
DO WHILE .T.
   SETCOLOR("W+/W,W/N")
   @ 02,00 CLEA TO 22,79
   WIN(02,00,05,79, "ESPECIALIDADE DAS EMPRESAS CADASTRADAS")
   * ESPECIALIDADE
   @ 03,02 SAY "Grupo........:" GET nGRP PICT "99" VALID { |oGET| VALGRP(oGET, .T.) }
   @ 04,02 SAY "Especialidade:" GET nESP PICT "99" VALID { |oGET| VALSUB2(oGET, .T.) }

   @ 24,00 SAY PADC( ALLTRIM(GRP->NOME)+" | "+ALLTRIM(SGR->NOMESGRP)+".", 80) COLOR "W+/BG"

   @ 22,00 SAY PADC(PRO->OBJETO, 80) COLOR "W/BG"
   @ 06,00 CLEA TO 22,79
   @ 24,00 SAY PADC("Preparando email... AGUARDE!",80) COLOR "W+/BG"

   WIN(06,00,21,79, "DADOS DO EMAIL")
   @ 22,00 SAY PADC( ALLTRIM(LEFT(PRO->OBJETO,80)), 80) COLOR "W/B"
 

   // preparing data for eMail
   cSubject := "CONTRATAÇÃO DE: "+SPACE(60)
   cFrom := cEMAIL
   cMAILUSER := SUBSTR(cEMAIL, 1, (AT("@", cEMAIL))-1 )
   cPASSWORD := SPACE(15)
   cSMTP := "smtp.cbtu.gov.br"
   cFILE := "C:\"+SPACE(97)

   @ 07,02 SAY "Email remetente.:" GET cFROM MESSAGE "Informe o email do remetente desta mensagem eletrônica."
   @ 08,02 SAY "Usuário do email:" GET cMAILUSER MESSAGE "Informe nome do usuário deste email."
   READ MSG AT 24,00,79 MSG COLOR "W+/BG"

   cPASSWORD := GetSecret( cPASSWORD, 09, 02, .T., "Senha do email..:")
   cPASSWORD := ALLTRIM(cPASSWORD)

   @ 10,02 SAY "Assunto:" GET cSUBJECT MESSAGE "Informe o objeto da cotação." PICT "@S60"
   @ 11,02 SAY "Arquivo:" GET cFILE MESSAGE "Informe o caminho do arquivo (path) a anexar. Se vários, compate-os." PICT "@S60"
   READ MSG AT 24,00,79 MSG COLOR "W+/BG"
   IF LASTKEY()=27
      RETURN
   ENDIF

   cFROM := ALLTRIM(LOWER(cFROM))
   cFILE := ALLTRIM(cFILE)
   aFILES := {}
   IF FILE(cFILE)
      IF RIGHT(cFILE,3) # "ZIP"
         nZIP := ALERT("COMPACTA ARQUIVO PARA EMAIL?", {"Sim", "Não"})
         IF nZIP = 1
            cFILEZIP := SUBSTR(cFILE, 1, LEN(cFILE)-3)
            cFILEZIP += "ZIP"
            HB_ZIPFILE(cFILEZIP, cFILE)
            cFILE := cFILEZIP
         ENDIF
      ENDIF
      aADD(aFILES, cFILE)
      nEMAILSIZE := HB_FSIZE(cFILE) / 1024
   ELSE
      nEMAILSIZE := 1 // 1KB
   ENDIF

   cBody := "Prezados,"+HB_OsNewLine()+HB_OsNewLine()+;
            "Estamos solicitando cotação do objeto epigrafado no assunto deste email cujas especificações constam no anexo."+HB_OsNewLine()+;
            "O recurso orçamentário está previsto no Plano Interno _______ e Natureza de Despesa ________."+HB_OsNewLine()+;
            "Abra o anexo deste email para verificar se sua empresa trabalha com o objeto que possa atender as nossas necessidades."+HB_OsNewLine()+;
            "Todos os custos devem estar incluídos na proposta (Frete, diferença de ICMS etc.)"+HB_OsNewLine()+;
            "A Administração contratará com a proposta mais vantajosa, o critério é 'menor preço'."+HB_OsNewLine()+;
            "A Nota de Empenho do recurso orçamentário é sua garantia de pagamento!"+HB_OsNewLine()+;
            "Gentileza confirmar o recebimento deste email e manifestar interesse em participar."+HB_OsNewLine()+;
            "Atenciosamente,"+HB_OsNewLine()+HB_OsNewLine()+;
            ALLTRIM(US->NOME)+HB_OsNewLine()+;
            ALLTRIM(US->CARGO)+"/"+ALLTRIM(US->LOTACAO)+"/STU-MAC/CBTU"+HB_OsNewLine()+;
            cTELEFONE

   @ 12,02 SAY "Corpo do email"
   @ 24,00 SAY PADC( "Alt+W = Termina edição com mudanças. Esc = Termina sem mudanças.", 80) COLOR "W+/BG"
   SETCOLOR("W/N")
   cBODY := MEMOEDIT(cBODY, 13,02,20,78)

   ALERT("Emails serão enviados a todas as empresas cadastradas no Grupo "+;
         STRZERO(nGRP,2)+" e Especialidade "+STRZERO(nESP,2)+".")

   nCONF := ALERT("CONFIRMA O ENVIO DESTE EMAIL?", {"Sim", "Não"})
   aTO := {}
   IF nCONF = 1 // CONFIRMA
      cCC := cFrom
      aFALHA := {}

      * FILTRA DADOS = APENAS POSICAO DESTA LICITACAO
      cRANDOM := ALLTRIM(STR(RAN(9999)))
      fINDEX := xTEMP+"TEMP" + cRANDOM
      SELECT ESP
      INDEX ON CNPJ TAG TEMP TO (fINDEX) ;
            FOR ESP->GRUPO=nGRP .AND. ESP->SUBGRUPO=nESP ;
            ADDITIVE TEMPORARY
      ESP->(DBGOTOP())
      DO WHILE !ESP->(EOF())
         CRC->(DBSEEK(ESP->CNPJ))
         IF EMPTY(CRC->EMAIL1)
            aADD(aFALHA, TRANSFORM(ESP->CNPJ, "@R 99.999.999/9999-99")+" não tem email cadastrado.")
            ESP->(DBSKIP())
            LOOP
         ENDIF

         aTO := {}
         aADD(aTO, LOWER(ALLTRIM(CRC->EMAIL1)) )
         IF !EMPTY(CRC->EMAIL2)
            aADD(aTO, LOWER(ALLTRIM(CRC->EMAIL2)) )
         ENDIF

         @ 24,00 SAY PADC("Enviando email ("+ALLTRIM(STR(nEMAILSIZE))+"Kb) para "+ALLTRIM(CRC->RAZAO)+". AGUARDE!", 80) COLOR "W+/BG"

         cEMPRESA := TRANSFORM(ESP->CNPJ, "@R 99.999.999/9999-99")+" "+;
                     ALLTRIM(CRC->RAZAO)+HB_OsNewLine()+;
                     IIF(!EMPTY(CRC->CONTATO), "Att.: "+ALLTRIM(CRC->CONTATO), "")+;
                     ALLTRIM(CRC->CELULAR)+" "+ALLTRIM(CRC->TELEFONE)+" "+ALLTRIM(CRC->FAX)+HB_OsNewLine()+HB_OsNewLine()

         cBODY2 := HB_OemToAnsi(cEMPRESA+cBODY)
         cSUBJECT2 := HB_OemToAnsi(cSUBJECT)

         IF !HB_SENDMAIL(cSMTP,, cFROM, aTO, cCC,, cBODY2, cSUBJECT2, aFILES,;
            cFROM, cPASSWORD, cSMTP, 1, .T., .T.)
            // cMAILUSER, cPASSWORD, cSMTP, 1, .T., .T.)
            aADD(aFALHA, "Email para "+TRANSFORM(ESP->CNPJ, "@R 99.999.999/9999-99")+" "+ALLTRIM(CRC->RAZAO)+" falhou.")
         ENDIF

         ESP->(DBSKIP())
         RELEASE aTO
      ENDDO

      IF EMPTY(aFALHA)
         MSGBOX("TODOS OS EMAILS FORAM ENVIADOS COM SUCESSO.","SUCESSO!","W+/G","G*/W")
      ELSE
         // GERA ARQUIVO DE LOG
         cARQUIVO := xPATH+"ORCAMENT.LOG"
         @ 24,00 SAY PADC("Preparando arquivo "+cARQUIVO+" com erros encontrados... AGUARDE!",80) COLOR "W+/BG"

         // GRAVA ARQUIVO DE LOG C/ VICIOS DO ARQUIVO
         IF FILE(cARQUIVO)
            RUN ("DEL "+cARQUIVO)
         ENDIF
         nHANDLE := FCREATE(cARQUIVO)
         FWRITE(nHANDLE, HB_OemToAnsi("SOLICITAÇÃO DE ORÇAMENTO"+HB_OsNewLine()))
         FWRITE(nHANDLE, HB_OemToAnsi("FALHA NO ENVIO DE EMAIL P/ AS SEGUINTES EMPRESAS:"+HB_OsNewLine()+HB_OsNewLine()))
         FOR X=1 TO LEN(aFALHA)
             FWRITE(nHANDLE, HB_OemToAnsi(aFALHA[X]+HB_OsNewLine()))
         NEXT
         FCLOSE(nHANDLE)
         @ 24,00 SAY SPACE(80) COLOR "W+/BG"

         // EXIBE O RELATÓRIO DE ERROS NA TELA
         WIN(06,00,21,79, "FALHAS NO ENVIO DE EMAIL")
         cRLT := MEMOREAD(cARQUIVO)
         @ 24,00 SAY "TECLE [ESC] P/ SAIR" COLOR "W+/BG"
         MEMOEDIT(cRLT,07,01,20,78)
         RELEASE cRLT, cARQUIVO
      ENDIF
   ENDIF
   SETCOLOR("W+/W")
   @ 06,00 CLEAR TO 22,79
ENDDO
RESTORE SCREEN FROM cTEL
RETURN

AnexoTamanho
SENDMAIL.zip6.5 KB