Help with inbound email action script
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-16-2025 05:09 PM
Hi - I need some help with a new email inbound email action script that:
1) Checks if the sender has an open Incident created in the last 15 minutes.
2) If no, create a new incident
3) If yes, add the new email body as a comment on the most recent open incident.
The script runs and finds the last open incident but is not adding 15 minutes to the variable fifteenMinutesLater. Therefore, a new incident always gets created. I added some logging to get the value of fifteenMinutesLater and it's the same as the variable incidentCreated.
d
Below is the script and a snapshot of the logs.
(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;
gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);
// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();
if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}
var userId = userGr.sys_id;
// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();
(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;
gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);
// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();
if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}
var userId = userGr.sys_id;
// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();
if (incGr.next()) {
var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());
var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());
gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();
var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}
var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}
// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();
var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);
})(email);
if (incGr.next()) {
/*var incidentCreated = new GlideDateTime(incGr.sys_created_on);
var fifteenMinutesLater = new GlideDateTime();
fifteenMinutesLater.setValue(incidentCreated.getValue());
fifteenMinutesLater.addMinutes(15);*/
var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());
var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());
gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();
var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}
var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}
// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();
var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);
})(email);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-16-2025 05:13 PM