
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
| Anexo | Tamanho |
|---|---|
| SENDMAIL.zip | 6.5 KB |