var MXServer = Java.type("psdi.server.MXServer") var SimpleDateFormat = Java.type("java.text.SimpleDateFormat") var MimeMessage = Java.type("javax.mail.internet.MimeMessage") var Properties = Java.type("java.util.Properties") var Boolean = Java.type("java.lang.Boolean") var Session = Java.type("javax.mail.Session") var InternetAddress = Java.type("javax.mail.internet.InternetAddress") var Message = Java.type("javax.mail.Message") var StringBuilder = Java.type("java.lang.StringBuilder") var MimeBodyPart = Java.type("javax.mail.internet.MimeBodyPart") var DataHandler = Java.type("javax.activation.DataHandler") var ByteArrayDataSource = Java.type("javax.mail.util.ByteArrayDataSource") var MimeMultipart = Java.type("javax.mail.internet.MimeMultipart") var CommonUtil = Java.type("psdi.util.CommonUtil") var HTML = Java.type("psdi.util.HTML") var Transport = Java.type("javax.mail.Transport") var System = Java.type("java.lang.System") var SmtpAuthenticator = Java.type("psdi.server.MXServer$SmtpAuthenticator") var UUID = Java.type("java.util.UUID") var TimeZone = Java.type("java.util.TimeZone") // call the demo function to show how this works. demo() function demo(){ var f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); f.setTimeZone(TimeZone.getDefault()) // this is a Date type, from an MBO you can Mbo.getDate("DATEATTRIBUTE") var startTime = f.parse("2021-01-31T13:00:00Z") var endTime = f.parse("2021-01-31T14:00:00Z") // test the sendInvite function with sendInvite("noreply@sharptree.io", "jason@sharptree.io", "This is a meeting request", "Here are details about our meeting.", startTime, endTime) } function sendInvite(from, to, subject, message, startTime, endTime){ var session = getMailSession() var mimeMessage = new MimeMessage(session); mimeMessage.addHeaderLine("method=REQUEST"); mimeMessage.addHeaderLine("charset=UTF-8"); mimeMessage.addHeaderLine("component=VEVENT"); mimeMessage.setFrom(new InternetAddress(from)); mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); mimeMessage.setSentDate(MXServer.getMXServer().getDate()); var charset = MXServer.getMXServer().getProperty("mxe.email.charset"); if(subject!=null && !subject.isEmpty()){ subject = CommonUtil.removeNewLines(subject) if (charset != null && !charset.isEmpty()) { mimeMessage.setSubject(subject, charset); }else{ mimeMessage.setSubject(subject); } } var multipart = new MimeMultipart(); if (message && !message.isEmpty()) { var mimeMessagePart = new MimeBodyPart(); var emailContentType = MXServer.getMXServer().getConfig().getProperty("mxe.email.content.type"); var convertToPlainText = MXServer.getMXServer().getConfig().getProperty("mxe.email.convertToPlainText"); if (!"text/html".equalsIgnoreCase(emailContentType) && "1".equalsIgnoreCase(convertToPlainText)) { message = HTML.toPlainText(message); } else if (!HTML.isHtml(message) || HTML.isHtml(message) && !HTML.containsHtmlBreakTags(message)) { message = HTML.replaceNewLineWithBR(message); } if (emailContentType) { if (charset && charset.length() > 0) { mimeMessagePart.setText(message, charset); mimeMessagePart.setHeader("Content-Type", emailContentType + ";charset=" + charset); } else { System.out.println(mimeMessagePart.class.getName()) mimeMessagePart.setText(message); mimeMessagePart.setHeader("Content-Type", emailContentType); } } else if (charset && !charset.isEmpty()) { mimeMessagePart.setText(message, charset) } else { mimeMessagePart.setText(message) } multipart.addBodyPart(mimeMessagePart) } var formatter = new SimpleDateFormat("yyyyMMdd HHmmss") formatter.setTimeZone(TimeZone.getDefault()) var timestampFormatter = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'") timestampFormatter.setTimeZone(TimeZone.getDefault()) TimeZone.getDefault() var builder = new StringBuilder() builder.append("BEGIN:VCALENDAR\n") .append("METHOD:REQUEST\n") .append("PRODID:Microsoft Exchange Server 2010\n") .append("VERSION:2.0\n") .append("BEGIN:VTIMEZONE\n") .append("TZID:").append(TimeZone.getDefault().getID()).append("\n") .append("END:VTIMEZONE\n") .append("BEGIN:VEVENT\n") .append("ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:").append(to).append("\n") // .append("ORGANIZER;CN=:MAILTO:").append(from).append("\n") .append("ORGANIZER:MAILTO:").append(from).append("\n") .append("DESCRIPTION;LANGUAGE=en-US:").append(message).append("\n") .append("UID:").append(UUID.randomUUID().toString()).append("\n") .append("SUMMARY;LANGUAGE=en-US:").append(subject).append("\n") .append("DTSTART:").append(formatter.format(startTime).replace(" ", "T")).append("\n") .append("DTEND:").append(formatter.format(endTime).replace(" ", "T")).append("\n") .append("CLASS:PUBLIC\n") .append("PRIORITY:5\n") .append("DTSTAMP:").append(timestampFormatter.format(MXServer.getMXServer().getDate())).append("\n") .append("TRANSP:OPAQUE\n") .append("STATUS:CONFIRMED\n") .append("SEQUENCE:$sequenceNumber\n") // .append("LOCATION;LANGUAGE=en-US: \n" + .append("BEGIN:VALARM\n") .append("DESCRIPTION:REMINDER\n") .append("TRIGGER;RELATED=START:-PT15M\n") .append("ACTION:DISPLAY\n") .append("END:VALARM\n") .append("END:VEVENT\n") .append("END:VCALENDAR"); var invite = new MimeBodyPart(); invite.setHeader("Content-Class", "urn:content-classes:calendarmessage"); invite.setHeader("Content-ID", "calendar_message"); invite.setDataHandler(new DataHandler( new ByteArrayDataSource(builder.toString(), "text/calendar;method=REQUEST;name=\"invite.ics\""))); multipart.addBodyPart(invite); mimeMessage.setContent(multipart); var sslEnabled = Boolean.parseBoolean(MXServer.getMXServer().getProperty("mail.smtp.ssl.enable")) if (sslEnabled) { var transport = session.getTransport("smtps"); transport.connect(); transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); transport.close(); } else { Transport.send(mimeMessage); } } function getMailSession(){ var mailProperties = new Properties() // this method is deprecated and on 7.6.1+ systems should be replaced with: mailProps = MXServer.getMXServer().getMxServerConfig() // mailProps = MXServer.getMXServer().getConfig() var smtpHost = null smtpHost = MXServer.getMXServer().getProperty("mail.smtp.host") if (smtpHost != null && !smtpHost.isEmpty()) { mailProps.put("mail.smtp.host", smtpHost) } var sslEnabled = Boolean.parseBoolean(MXServer.getMXServer().getProperty("mail.smtp.ssl.enable")) if (sslEnabled) { mailProps.put("mail.transport.protocol", "smtps") mailProps.put("mail.smtps.ssl.enable", sslEnabled) mailProps.put("mail.smtps.socketFactory.port", 465) mailProps.put("mail.smtps.socketFactory.class", "javax.net.ssl.SSLSocketFactory") mailProps.put("mail.smtps.socketFactory.fallback", "false") } var user = MXServer.getMXServer().getProperty("mxe.smtp.user") var password = MXServer.getMXServer().getProperty("mxe.smtp.password") if (user != null && !user.isEmpty()) { mailAuth = new SmtpAuthenticator (MXServer.getMXServer(), user, password) } else { mailAuth = null } if (mailAuth != null) { mailProps.put("mail.smtp.auth", "true") } var smtpTimeout = MXServer.getMXServer().getProperty("mxe.smtp.timeout"); if (smtpTimeout != null && !smtpTimeout.isEmpty()) { mailProps.put("mail.smtp.timeout", smtpTimeout); } var smtpConnectionTimeout = MXServer.getMXServer().getProperty("mxe.smtp.connectiontimeout") if (smtpConnectionTimeout != null && !smtpConnectionTimeout.isEmpty()) { mailProps.put("mail.smtp.connectiontimeout", smtpConnectionTimeout); } mailProps.put("mail.smtp.sendpartial", mailProps.getProperty("mail.smtp.sendpartial").equals("0") ? "false" : "true"); return Session.getInstance(mailProps, mailAuth); }