Commit inicial: fuentes MBS ERP (Genero 6) + .gitignore + docs/SETUP_PC_MBS.md
This commit is contained in:
@@ -0,0 +1,344 @@
|
||||
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
|
||||
Reference in New Issue
Block a user