Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

How to add sender to custom field with incoming mail in scriprunner?

nihcet August 16, 2019

Hi,

I want to add e-mail sender to custom field (email adress). I can add to text to custom field, but I can't add sender variable.

JIRA v7.12.1 & Scriptrunner 5.5.9

My code in incoming mail handler.

// get "TO" from mail
import javax.mail.Message
def addresses = message.getRecipients(Message.RecipientType.TO) as String
// get "TO" from mail

// issue create and add attachment
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.config.util.JiraHome
import com.atlassian.jira.service.services.file.FileService
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils
import org.apache.commons.io.FileUtils

def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.getProjectManager()
def issueFactory = ComponentAccessor.getIssueFactory()
def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor)
JiraHome jiraHome = ComponentAccessor.getComponent(JiraHome)

def subject = message.getSubject() as String
def issue = ServiceUtils.findIssueObjectInString(subject)

if (issue) {
return
}

ApplicationUser user = userManager.getUserByName("jiramail")
ApplicationUser reporter = messageUserProcessor.getAuthorFromSender(message) ?: user
def project = projectManager.getProjectObjByKey("TY")
def issueObject = issueFactory.getIssue()
issueObject.setProjectObject(project)

// add "To" info
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def TYtest = customFieldManager.getCustomFieldObjectByName("TYtest1")
issueObject.setCustomFieldValue(TYtest, addresses)
// add "To" info

issueObject.setSummary(subject)
issueObject.setDescription(MailUtils.getBody(message))

issueObject.setIssueTypeId(project.issueTypes.find { it.name == "Mail" }.id)
issueObject.setReporter(reporter)

// add sender to custom field
def emailCf = customFieldManager.getCustomFieldObjectByName("E-Mail Adress")
issueObject.setCustomFieldValue(emailCf, reporter)
// add sender to custom field

issue = messageHandlerContext.createIssue(user, issueObject)

def attachments = MailUtils.getAttachments(message)

attachments.each { MailUtils.Attachment attachment ->
def destination = new File(jiraHome.home, FileService.MAIL_DIR).getCanonicalFile()
def file = FileUtils.getFile(destination, attachment.filename) as File
FileUtils.writeByteArrayToFile(file, attachment.contents)
messageHandlerContext.createAttachment(file, attachment.filename, attachment.contentType, user, issue)
}
// issue create and add attachment

 

1 answer

0 votes
David Laperle
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
August 16, 2019

What error are you getting ? 

What's the type of the E-Mail Address Field ? 

Hi David,

Custom field (E-Mail address) is Text Field (single line).

Log 1:  Sender isn't a user in jira.

2019-08-16 16:21:01,025 Caesium-1-1 ERROR anonymous teknikbilgi [c.o.scriptrunner.mail.MailHandler] Failed to execute email handler 'teknikbilgi(as provided on first page)' on message with subject 'test16'
com.atlassian.jira.exception.CreateException: com.atlassian.jira.workflow.WorkflowException: Error occurred while creating issue. This could be due to a plugin being incompatible with this version of JIRA. For more details please consult the logs, and see: http://confluence.atlassian.com/x/3McB
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:519)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssueObject(DefaultIssueManager.java:608)
at com.atlassian.jira.issue.managers.RequestCachingIssueManager.createIssueObject(RequestCachingIssueManager.java:209)
at com.atlassian.jira.service.util.handler.DefaultMessageHandlerContext.createIssueWithIssueManager(DefaultMessageHandlerContext.java:248)
at com.atlassian.jira.service.util.handler.DefaultMessageHandlerContext.createIssue(DefaultMessageHandlerContext.java:166)
at com.atlassian.jira.service.services.mail.DelegatingMessageHandlerContext.createIssue(DelegatingMessageHandlerContext.java:43)
at com.atlassian.jira.service.util.handler.MessageHandlerContext$createIssue$0.call(Unknown Source)
at Script119.run(Script119.groovy:53)
Caused by: com.atlassian.jira.workflow.WorkflowException: Error occurred while creating issue. This could be due to a plugin being incompatible with this version of JIRA. For more details please consult the logs, and see: http://confluence.atlassian.com/x/3McB
at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:766)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:510)
... 7 more
Caused by: java.lang.ClassCastException: com.atlassian.jira.user.DelegatingApplicationUser cannot be cast to java.lang.String
at com.atlassian.jira.issue.customfields.impl.GenericTextCFType.getDbValueFromObject(GenericTextCFType.java:51)
at com.atlassian.jira.issue.fields.ImmutableCustomField.createValue(ImmutableCustomField.java:693)
at com.atlassian.jira.workflow.function.issue.IssueCreateFunction.execute(IssueCreateFunction.java:81)
at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:1014)
at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1407)
at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:606)
at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:742)
... 8 more

 

Log 2:  Sender is a user in jira.

2019-08-16 16:21:01,618 Caesium-1-1 ERROR anonymous teknikbilgi [c.o.scriptrunner.mail.MailHandler] Failed to execute email handler 'teknikbilgi(as provided on first page)' on message with subject 'test 0816 16'
com.atlassian.jira.exception.CreateException: com.atlassian.jira.workflow.WorkflowException: Error occurred while creating issue. This could be due to a plugin being incompatible with this version of JIRA. For more details please consult the logs, and see: http://confluence.atlassian.com/x/3McB
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:519)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssueObject(DefaultIssueManager.java:608)
at com.atlassian.jira.issue.managers.RequestCachingIssueManager.createIssueObject(RequestCachingIssueManager.java:209)
at com.atlassian.jira.service.util.handler.DefaultMessageHandlerContext.createIssueWithIssueManager(DefaultMessageHandlerContext.java:248)
at com.atlassian.jira.service.util.handler.DefaultMessageHandlerContext.createIssue(DefaultMessageHandlerContext.java:166)
at com.atlassian.jira.service.services.mail.DelegatingMessageHandlerContext.createIssue(DelegatingMessageHandlerContext.java:43)
at com.atlassian.jira.service.util.handler.MessageHandlerContext$createIssue$0.call(Unknown Source)
at Script119.run(Script119.groovy:53)
Caused by: com.atlassian.jira.workflow.WorkflowException: Error occurred while creating issue. This could be due to a plugin being incompatible with this version of JIRA. For more details please consult the logs, and see: http://confluence.atlassian.com/x/3McB
at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:766)
at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:510)
... 7 more
Caused by: java.lang.ClassCastException: com.atlassian.jira.user.DelegatingApplicationUser cannot be cast to java.lang.String
at com.atlassian.jira.issue.customfields.impl.GenericTextCFType.getDbValueFromObject(GenericTextCFType.java:51)
at com.atlassian.jira.issue.fields.ImmutableCustomField.createValue(ImmutableCustomField.java:693)
at com.atlassian.jira.workflow.function.issue.IssueCreateFunction.execute(IssueCreateFunction.java:81)
at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:1014)
at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1407)
at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:606)
at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:742)
... 8 more
David Laperle
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
August 16, 2019

I believe your problem is located here : 

Caused by: java.lang.ClassCastException: com.atlassian.jira.user.DelegatingApplicationUser cannot be cast to java.lang.String

You're trying to cast an object to a string, maybe try to add a .toString() 

Like nihcet likes this
nihcet August 16, 2019

Thanks David.

I added in code.

"def sender = messageUserProcessor.getAuthorFromSender(message) as String"

Code worked for a user in jira. But code didn't work if sender don't user in jira.

// get "TO" from mail
import javax.mail.Message
def addresses = message.getRecipients(Message.RecipientType.TO) as String
// get "TO" from mail

// issue create and add attachment
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.config.util.JiraHome
import com.atlassian.jira.service.services.file.FileService
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils
import org.apache.commons.io.FileUtils

def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.getProjectManager()
def issueFactory = ComponentAccessor.getIssueFactory()
def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor)
JiraHome jiraHome = ComponentAccessor.getComponent(JiraHome)

def subject = message.getSubject() as String
def issue = ServiceUtils.findIssueObjectInString(subject)

if (issue) {
return
}

ApplicationUser user = userManager.getUserByName("jiramail")
ApplicationUser reporter = messageUserProcessor.getAuthorFromSender(message) ?: user
def sender = messageUserProcessor.getAuthorFromSender(message) as String
def project = projectManager.getProjectObjByKey("TY")
def issueObject = issueFactory.getIssue()
issueObject.setProjectObject(project)

// add "TO" info
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def TYtest = customFieldManager.getCustomFieldObjectByName("TYtest1")
issueObject.setCustomFieldValue(TYtest, addresses)
// add "TO" info

issueObject.setSummary(subject)
issueObject.setDescription(MailUtils.getBody(message))

issueObject.setIssueTypeId(project.issueTypes.find { it.name == "Mail" }.id)
issueObject.setReporter(reporter)

// add sender to custom field
def emailCf = customFieldManager.getCustomFieldObjectByName("E-Posta Adresiniz")
issueObject.setCustomFieldValue(emailCf, sender)
// add sender to custom field

issue = messageHandlerContext.createIssue(user, issueObject)

def attachments = MailUtils.getAttachments(message)

attachments.each { MailUtils.Attachment attachment ->
def destination = new File(jiraHome.home, FileService.MAIL_DIR).getCanonicalFile()
def file = FileUtils.getFile(destination, attachment.filename) as File
FileUtils.writeByteArrayToFile(file, attachment.contents)
messageHandlerContext.createAttachment(file, attachment.filename, attachment.contentType, user, issue)
}
// issue create and add attachment
David Laperle
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
August 16, 2019

getAuthorFromSender returns an ApplicationUser object which will be null if not a valid JIRA user. 

I would instead use something like

def sender = message.getFrom() as String

that would actually give you the E-Mail Address of the Sender (actually the From: attribute, which is a bit different, but should serve your purpose!)

Let me know if not clear.

Like nihcet likes this
nihcet August 16, 2019

Thanks David :) Works.

Only, There are problem for names.

for hotmail : [Nihat Test2 <nihattest2@hotmail.com>]

for gmail : [=?UTF-8?Q?Nihat_=C3=87etinkaya?= <nihat.cetinkaya@gmail.com>]

for company : [=?iso-8859-9?Q?Nihat_=C7etinkaya?= <nihat.cetinkaya@example.com.tr>]

David Laperle
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
August 16, 2019

If you need only the email address, you could extract the email by using regex and getting everything between < and > .

This regex would do that : (?<=\<).+?(?=\>)

I'll leave it up to you to find the proper implementation of this in JAVA :)

Like nihcet likes this
nihcet August 16, 2019

David, thank you for everything. :)

Like David Laperle likes this

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events