Files

345 lines
10 KiB
Plaintext

IMPORT os
IMPORT JAVA java.lang.System
IMPORT JAVA java.lang.Object
IMPORT JAVA java.io.ByteArrayOutputStream
IMPORT JAVA java.io.PrintStream
IMPORT JAVA java.util.Properties
IMPORT JAVA javax.mail.Session
IMPORT JAVA javax.mail.Transport
IMPORT JAVA javax.mail.Authenticator
IMPORT JAVA javax.mail.Message
IMPORT JAVA javax.mail.Message.RecipientType
IMPORT JAVA javax.mail.internet.InternetAddress
IMPORT JAVA javax.mail.internet.MimeMessage
IMPORT JAVA javax.mail.internet.MimeMultipart
IMPORT JAVA javax.mail.internet.MimeBodyPart
IMPORT JAVA com.sun.mail.smtp.SMTPTransport
IMPORT security
CONSTANT debug_level = 2
DEFINE logtext STRING
DEFINE out_stream ByteArrayOutputStream
TYPE cnf_t RECORD
hostname STRING,
smtphost STRING,
smtpport INTEGER,
senderemail STRING,
smtpauth SMALLINT, -- 1: uses SMTP AUTH, 0: doesn't use AUTH
username STRING,
password STRING,
use_ssl SMALLINT, -- 1: uses SSL, 0: doesn't use SSL
use_tls SMALLINT, -- 1: uses TLS, 0: doesn't use TLS
cnxtimeout INTEGER
END RECORD
DEFINE cnf cnf_t
DEFINE xpassword STRING
FUNCTION enviaemail(rcpt_to,subject,body,codperfil,attachment)
DEFINE sesion Session,
password,s_protocol,rcpt_to,subject,m_charset,body,attachment STRING
DEFINE msg MimeMessage
DEFINE mbodyp MimeBodyPart
DEFINE multip MimeMultipart
DEFINE trans SMTPTransport,
codperfil SMALLINT
IF NOT validate_param_smpt_auth() THEN
DISPLAY "NO EXISTE CONEXION","INFO"
RETURN false
END IF
CALL create_cxion_session(codperfil) RETURNING sesion,password,s_protocol
LET rcpt_to = rcpt_to CLIPPED
LET subject = subject CLIPPED
LET body = body CLIPPED
LET m_charset=getCharset()
LET msg=MimeMessage.create(sesion)
# Email Message creation : add recipients -> From, To, CC and BCC
CALL msg.setFrom(InternetAddress.create(cnf.senderemail))
CALL msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(rcpt_to, FALSE))
CALL msg.setSubject(subject)
# Email Message creation : create multipart (for text and attachments)
LET multip=MimeMultipart.create()
# Email Message creation : add body part
# LET body = "ESTO ES EL CUERPO DEL EMAIL DESDE MI APP"
LET mbodyp=MimeBodyPart.create()
CALL mbodyp.setText(body, m_charset, "html")
-- CALL mbodyp.setText(body, m_charset)
IF attachment IS NOT NULL THEN
CALL mbodyp.attachFile(attachment)
END IF
CALL multip.addBodyPart(mbodyp)
CALL msg.setContent(multip)
CALL show_debug_msg(1,"Email Message created.")
# Sending the email
CALL show_debug_msg(1,SFMT("Connecting to server %1 ...",cnf.hostname))
TRY
LET trans = CAST(sesion.getTransport(s_protocol) AS SMTPTransport)
CALL trans.connect(cnf.smtphost, cnf.username, password)
CALL trans.sendMessage(msg,msg.getAllRecipients())
CALL trans.close()
CATCH
# CALL show_output_dialog("ERR")
CALL mbox_ok("Error", SFMT("Error trying to send email through server %1 (code=%2)",cnf.hostname,err_get(STATUS)), "stop")
RETURN FALSE
END TRY
CALL show_output_dialog("OK")
CALL show_debug_msg(1,SFMT("Email sent through server %1.",cnf.hostname))
RETURN true
END FUNCTION
FUNCTION base64_to_string(str_b64)
DEFINE str_out,str_b64,str_aux STRING
TRY
CALL security.Base64.ToString(str_b64) RETURNING str_out
CATCH
LET str_aux="Unable to convert the Base64 string into plain-text:",STATUS
CALL mbox_ok("Error", str_aux, "stop")
LET str_out=NULL
END TRY
RETURN str_out
END FUNCTION
PRIVATE FUNCTION show_debug_msg(lev,msg)
DEFINE lev SMALLINT
DEFINE msg STRING
IF lev>=debug_level THEN
DISPLAY msg
END IF
END FUNCTION
PRIVATE FUNCTION setMailProperties(props,prot,prop,val)
DEFINE props Properties
DEFINE auxi,prot,prop,val STRING
LET auxi=SFMT("mail.%1.%2",prot,prop)
CALL props.put(auxi,val)
CALL show_debug_msg(1,SFMT("Property '%1' set to value '%2'", auxi, val))
END FUNCTION
FUNCTION mbox_ok(t, m, i)
DEFINE t,m,i STRING
MENU t ATTRIBUTES(STYLE="dialog",COMMENT=m,IMAGE=i)
COMMAND "Ok" EXIT MENU
END MENU
END FUNCTION
FUNCTION string_to_base64(str_ent)
DEFINE str_ent,str_b64,str_aux STRING
TRY
CALL security.Base64.FromString(str_ent) RETURNING str_b64
CATCH
LET str_aux="Unable to convert the input string into Base64:",STATUS
CALL mbox_ok("Error", str_aux, "stop")
LET str_b64=NULL
END TRY
RETURN str_b64
END FUNCTION
FUNCTION validate_param_smpt_auth()
DEFINE flag_ok BOOLEAN
LET flag_ok=TRUE
IF xpassword=cnf.password THEN
-- if password didn't change we don't encrypt as it is already encrypted
ELSE
IF LENGTH(cnf.password)>0 THEN
CALL string_to_base64(cnf.password) RETURNING cnf.password
END IF
LET xpassword=cnf.password -- store new encrypted value
END IF
IF cnf.smtpauth THEN
IF LENGTH(cnf.username) == 0 THEN
LET flag_ok=FALSE
CALL mbox_ok("Error", "The username is mandatory when using Smtp Auth", "stop")
ELSE
IF LENGTH(cnf.password) == 0 THEN
LET flag_ok=FALSE
CALL mbox_ok("Error", "The password is mandatory when using Smtp Auth", "stop")
END IF
END IF
END IF
RETURN flag_ok
END FUNCTION
# Retrieve the current charset
FUNCTION getCharset()
DEFINE l STRING
DEFINE c base.Channel
LET c = base.Channel.create()
CALL c.openPipe("fglrun -i mbcs 2>&1", "r")
LET l = c.readLine()
WHILE l IS NOT NULL
IF l MATCHES "Charmap : *" THEN
RETURN l.subString(16,length(l))
EXIT WHILE
END IF
LET l = c.readLine()
END WHILE
RETURN "ISO-8859-1" -- default value
END FUNCTION
PRIVATE FUNCTION show_output_dialog(s_stat)
DEFINE s_stat,s_msg,s_color STRING
DEFINE strbuf base.StringBuffer
IF s_stat="OK" THEN
LET s_color="green"
LET s_msg="The SMTP connection ended OK."
ELSE
LET s_color="red"
LET s_msg="The SMTP connection ended with Error."
END IF
# separates the Session debug message into html lines
LET strbuf = base.StringBuffer.create()
CALL strbuf.append(out_stream.toString())
CALL strbuf.replace("\n","<BR>",0)
LET logtext=strbuf.toString(),"<BR>", # first adds the debug lines without additional format
SFMT("<font color='%1'>",s_color),s_msg,"</font>" # then adds the result message in color
END FUNCTION
FUNCTION create_cxion_session(codperfil)
DEFINE s_proto, s_password,sendingUser STRING
DEFINE x_timeout,codperfil INTEGER
DEFINE sess Session
DEFINE props Properties
DEFINE custom_ps PrintStream
# Buscar los parametros del usuario que envia
SELECT a.nombre_servidor,a.nombre_servidor,a.puerto, a.from_address,a.from_address,a.clave
INTO cnf.hostname, cnf.smtphost, cnf.smtpport,cnf.senderemail,cnf.username, cnf.password
FROM Tbperfil_mail a
WHERE a.cod_perfil = codperfil
# Connection parameters preparation
CALL show_debug_msg(1,"Preparing connection parameters ...")
# LET cnf.senderemail = 'shop@marmotech.com.do'
LET cnf.hostname = 'smtp.office365.com'
LET cnf.smtphost = 'smtp.office365.com'
LET cnf.smtpport = '587'
LET cnf.username = 'nominas@marmotech.com.do'
LET cnf.password = 'Nuevo2018'
# LET cnf.username = 'shop@marmotech.com.do'
# LET cnf.password = 'Nuevo2020'
LET cnf.smtpauth = TRUE
CALL string_to_base64(cnf.password) RETURNING cnf.password
LET s_password=base64_to_string(cnf.password)
IF cnf.cnxtimeout>0 THEN
LET x_timeout=cnf.cnxtimeout*1000 # convert to miliseconds
ELSE
LET x_timeout=0
END IF
LET cnf.use_tls = TRUE
LET cnf.use_ssl = FALSE
IF cnf.use_ssl THEN
LET s_proto="smtps"
ELSE
LET s_proto="smtp"
END IF
CALL show_debug_msg(2,SFMT("Host: %1",cnf.smtphost))
CALL show_debug_msg(2,SFMT("Port: %1",cnf.smtpport))
CALL show_debug_msg(2,SFMT("User: %1",cnf.username))
CALL show_debug_msg(4,SFMT("Password: %1",cnf.password)) # this is the base64 password
CALL show_debug_msg(5,SFMT("Pswd txt: %1",s_password)) # this is the plain-text password
CALL show_debug_msg(2,SFMT("Prot: %1",s_proto))
CALL show_debug_msg(2,SFMT("TLS: %1",cnf.use_tls))
CALL show_debug_msg(2,SFMT("Timeout: %1",x_timeout))
# Session properties preparation
CALL show_debug_msg(1,"Preparing Session properties ...")
LET props=System.getProperties()
IF cnf.use_ssl THEN
CALL setMailProperties(props,"smtp","ssl.enable","true")
ELSE
CALL setMailProperties(props,"smtp","ssl.enable","false")
END IF
IF cnf.smtpauth THEN
CALL setMailProperties(props,s_proto,"auth","true")
ELSE
CALL setMailProperties(props,s_proto,"auth","false")
END IF
CALL setMailProperties(props,s_proto,"port",cnf.smtpport)
CALL setMailProperties(props,s_proto,"connectiontimeout",x_timeout)
IF cnf.use_tls THEN
CALL setMailProperties(props,s_proto,"starttls.enable","true")
# the following 2 parameters are needed for FourJs mail server
# but also work fine with Gmail servers when TLS option is selected
# both servers were tested on 2016-06-02
CALL setMailProperties(props,s_proto,"ssl.checkserveridentity","false")
CALL setMailProperties(props,s_proto,"ssl.trust","*")
ELSE
CALL setMailProperties(props,s_proto,"starttls.enable","false")
END IF
# Session creation
CALL show_debug_msg(1,"Creating Session ...")
LET sess=Session.getInstance(props)
LET out_stream = ByteArrayOutputStream.create()
LET custom_ps = PrintStream.create(out_stream)
CALL sess.setDebugOut(custom_ps)
CALL sess.setDebug(TRUE)
RETURN sess,s_password,s_proto
END FUNCTION