Automate adding a comment to an existing issue when the subject line of an email sent to Jira contains a valid issue key. If you want to allow comments from unregistered Jira users, you can choose a registered user who will add those comments on behalf of the email sender.
As a project manager, I want the body of emails sent to Jira to automatically be added as a comment on existing issues when the user includes that issue key in the email subject. Comments should be added as the sender user, or as a delegated/impersonating user commenting on behalf of the sender.
Use the dispatchCommentedEvent
boolean to tell Jira to send an Issue Commented event or not.
Use the allowCommentsFromUnregisteredUsers
boolean and the commentAsUser
user Name string to allow a designated user to add comments for unregistered Jira users.
Regarding the allowCommentsFromUnregisteredUsers
variable. You must be certain that you want to allow comments from emails sent to Jira from senders that are not registered users. This could open up your Jira server to comments from any source that knows a valid issue key. Please assess the risks before you use this script.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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.MessageHandlerContext
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.mail.MailUtils
import groovy.transform.Field
import javax.mail.Message
// should dispatch Issue Commented event
final dispatchCommentedEvent = 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"
(messageHandlerContext as MessageHandlerContext).createComment(issue as Issue, commentUser as ApplicationUser, commentBody as String, dispatchCommentedEvent as Boolean)
def getCommentUser(Message message, Issue issue, Boolean allowCommentsFromNonJiraUsers) {
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
// if sender can add comments return sender user, else return the commentAsUser
permissionManager.hasPermission(ProjectPermissions.ADD_COMMENTS, issue, sender) ? sender : delegatedUser
}