Skip to main content
Example scripts
arrow icon
To homepage
Jira Service Desk
Data centre icon
Data Center

Add a Comment to the Service Management Issue Mentioned in the Mail Subject

Created 1 year ago, Updated 2 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira Service Desk (3.10 - 4.6)
compatibility bullet
ScriptRunner For Jira (5.6.14)
Language |
groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.permission.ProjectPermissions
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.mail.MailUtils
import com.atlassian.servicedesk.api.comment.ServiceDeskCommentService
import com.atlassian.servicedesk.api.customer.CustomerContextService
import com.atlassian.servicedesk.api.permission.ServiceDeskPermissionService
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import groovy.transform.Field
import javax.mail.Message

@WithPlugin('com.atlassian.servicedesk')

// add service desk comment as public
final addCommentAsPublic = true

// allow comments from non-jira users
final allowCommentsFromUnregisteredUsers = true

// to allow comments from any email sender you must specify an existing user who will add the comments on their behalf
@Field final commentAsUser = 'impersonatingUser'

def subject = message.subject as String
def issue = ServiceUtils.findIssueObjectInString(subject)
if (!issue) {
    // existing issue not found within subject, so no issue will be updated
    return
}

def body = MailUtils.getBody(message)
if (!body) {
    // mail has no body content so comment will not be added
    return
}

def commentUser = getCommentUser(message, issue, allowCommentsFromUnregisteredUsers)
if (!commentUser) {
    log.error("Could not add comment to ${issue.key} from email with subject $subject, as no user with permission to comment was found")
    return
}

// get senders email addresses and prepend to mail body so comment has source email address on the first line
def senders = MailUtils.getSenders(message).join(',')
def commentBody = "$senders\n$body"

createComment(commentUser as ApplicationUser, commentBody as String, issue as Issue, addCommentAsPublic as Boolean)

void createComment(ApplicationUser commentUser, String commentBody, Issue issue, Boolean publicComment) {
    @PluginModule ServiceDeskCommentService serviceDeskCommentService
    @PluginModule CustomerContextService customerContextService
    customerContextService.runInCustomerContext {
        def createCommentParameters = serviceDeskCommentService.newCreateBuilder()
            .author(commentUser)
            .body(commentBody)
            .issue(issue)
            .publicComment(publicComment)
            .build()

        serviceDeskCommentService.createServiceDeskComment(commentUser, createCommentParameters)
    }
}

// this method will return a user who can comment or null if a valid user cannot be found
def getCommentUser(Message message, Issue issue, Boolean allowCommentsFromNonJiraUsers) {
    @PluginModule ServiceDeskPermissionService serviceDeskPermissionService

    def userManager = ComponentAccessor.userManager
    def permissionManager = ComponentAccessor.permissionManager
    def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor)

    def sender = (messageUserProcessor as MessageUserProcessor).getAuthorFromSender(message)
    def delegatedUser = allowCommentsFromNonJiraUsers ? userManager.getUserByName(commentAsUser as String) : null

    // check if sender is customer user or they have the project permission to add comments
    def senderCanComment = null
    if (sender) {
        senderCanComment = serviceDeskPermissionService.isCustomer(sender, issue) ||
            permissionManager.hasPermission(ProjectPermissions.ADD_COMMENTS, issue, sender)
    }

    // if sender can add comments return sender, else return the commentAsUser
    senderCanComment ? sender : delegatedUser
}
Having an issue with this script?
Report it here