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

Create a New Issue Using a Mail Handler Script and Set the Epic Link to an Existing Issue Found in the Mail Body

Created 1 year ago, Updated 3 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira Software (7.7 - 8.6)
compatibility bullet
ScriptRunner For Jira (5.6.14)
Language |
groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.exception.CreateException
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageHandlerContext
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils

final targetProjectKey = 'TEST'
final defaultReporterName = 'admin'
final issueTypeForNewIssue = 'Task'
final epicLinkFieldName = 'Epic Link'

def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor) as MessageUserProcessor
def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.projectManager
def issueFactory = ComponentAccessor.issueFactory
def customFieldManager = ComponentAccessor.customFieldManager

def subject = message.subject as String
def body = MailUtils.getBody(message) as String

def issueFromSubject = ServiceUtils.findIssueObjectInString(subject)
def issueFromBody = ServiceUtils.findIssueObjectInString(body)

if (issueFromSubject) {
    // Existing issue found in subject so will not create a new issue
    return
}

if (!(issueFromBody?.issueType?.name in ['Epic', 'Initiative'])) {
    // No existing Epic or Initiative Issue Key in email body so will not create a new issue
    return
}

def project = projectManager.getProjectObjByKey(targetProjectKey)
def user = userManager.getUserByName(defaultReporterName)
def reporterUser = messageUserProcessor.getAuthorFromSender(message) ?: user

def epicLinkField = customFieldManager.customFieldObjects.findByName(epicLinkFieldName)

def issueObject = issueFactory.issue.with {
    setProjectObject(project)
    setSummary(subject ?: 'Created via ScriptRunner mail handler') // Issues must always have a summary
    setDescription(body)
    setIssueTypeId(project.issueTypes.find { it.name == issueTypeForNewIssue }.id)
    setReporter(reporterUser)
    setCustomFieldValue(epicLinkField, issueFromBody)
    it
}

try {
    issue = (messageHandlerContext as MessageHandlerContext).createIssue(user, issueObject)
} catch (CreateException e) {
    log.error('Error creating issue: ', e)
}
Having an issue with this script?
Report it here