Velocity Context in email templates
Email templates are velocity macro files. When email templates are used to render email body, the following Velocity context attributes are available.

Template Context Objects

Name
Type
Description
attachmentsManager
Manager component
baseurl
String
The base url of the Jira instance, set under General Configuration.
buildutils
customfieldManager
Support for adding custom fields to outgoing emails
dateformatter
Date format support
issue
Issue extended with support for processing in velocity templates
i18n
I18n support
jirakeyutils
jirautils
remoteUser
Current user running the action or null
rendererManager
stringUtils
String helper methods
textutils
Jira's text util methods
userutils
jetiFieldRenderer
See details here.
Support for field rendering in templates
jetiFieldFormatter
See details here.
Support for date/time formatting in templates
templateSupport
See details here.
Support for email templates, rendering, formatting
number
Support for Number formatting in templates. See the API documentation​
currentUserInfo
$!currentUserInfo.user: current user object $!currentUserInfo.roles: current user's project roles $!currentUserInfo.groups: current user's groups.
userPropertyManager
Access to Jira user properties.
Usage:
References to user properties by property name must be prefixed with "jira.meta." due to the nature of the Jira API.
E.g. If the user has a property, called "phone", the phone property may be rendered as
$!userPropertyManager.getPropertySet(<user object>).getString("jira.meta.phone")

jetiFieldRenderer

jetiFieldRenderer provides the following methods to render issue fields:
Method
Description
Usage
String renderCustomField(Issue issue, String fieldKey);
Renders a custom field value as a string value
$!jetiFieldRenderer.renderCustomField($!issue, "customfield_10011")
Object renderCustomFieldAsObject(Issue issue, String fieldKey);
Returns the value of the custom field as Raw value.
The Raw or Object value allows for further processing or access to methods, and attributes
$!jetiFieldRenderer.renderCustomFieldAsObject($!issue, "customfield_10011")
E.g. render the Display name attribute of a user selected in a user picker field
$!jetiFieldRenderer.renderCustomFieldAsObject($!issue, "customfield_10011").getDisplayName()
String renderVersions(Collection<Version> versions);
Renders the given versions as a comma-separated list of version names.
E.g. $!jetiFieldRenderer.renderVersions($!issue.getFixVersions())
String renderComponents(Collection<ProjectComponent> components);
Renders the given components as a comma-separated list of component names.
E.g. $!jetiFieldRenderer.renderComponents($!issue.getComponents())
String renderLabels(Collection<Label> labels);
Renders the given labels as a comma-separated list of label names.
E.g. $!jetiFieldRenderer.renderLabels($!issue.getLabels())
String renderSecurityLevel(GenericValue securityLevel);
Renders the name of the given Security Level object
$!jetiFieldRenderer.renderSecurityLevel($!issue.getSecurityLevel())
String renderIssueConstant(IssueConstant issueConstant);
Renders the name of an Issue type, Resolution, Priority or Status
$!jetiFieldRenderer.renderIssueConstant($!issue.getPriority())
String renderUser(User user);
Renders the DisplayName attribute of a User or Application User object safely, if null, returns empty string
$!jetiFieldRenderer.renderUser($!issue.getAssignee())
String renderDateTime(Timestamp ts);
Renders a Timestamp object using Jira's default date format, DateTimeFormat.format()
E.g.
  • $!jetiFieldRenderer.renderDateTime($!issue.getCreated())
  • render the value of a date or date time picker field: $!jetiFieldRenderer.renderDateTime($!jetiFieldRenderer.renderCustomFieldAsObject($!issue, "customfield_10011"))
String renderEstimate(TemplateIssue ti, I18nHelper i18n);
Renders the issue's Original estimate in nicely readable format, like 3d 4h 5m
$!jetiFieldRenderer.renderEstimate($!issue, $i18n)
String renderRemainingEstimate(TemplateIssue ti, I18nHelper i18n);
Renders the issue's Remaining estimate in nicely readable format, like 3d 4h 5m
$!jetiFieldRenderer.renderOriginalEstimate($!issue, $i18n)
String renderWorklog(TemplateIssue ti, I18nHelper i18n);
Renders the issue's Logged Work Time in nicely readable format, like 3d 4h 5m
$!jetiFieldRenderer.renderWorklog($!issue, $i18n)
I18nHelper getI18nBean(String locale);
Returns a I18nBean for the given locale, locale string follows java syntax​
E.g. get the language resources for French: $!jetiFieldRenderer.getI18nBean("fr")
String getLinkToCustomerPortal(Issue issue);
Returns an absolute link to the customer portal belonging to the service management project of the issue.
If the issue is not from a Service Management project, it returns null
$!jetiFieldRenderer.getLinkToCustomerPortal($!issue)
String getLinkToIssueInCustomerPortal(Issue issue);
Returns an absolute link to the issue in the customer portal belonging to the service management project of the issue.
If the issue is not from a Service Management project, it returns null
$!jetiFieldRenderer.getLinkToIssueInCustomerPortal ($!issue)

jetiFieldFormatter

jetiFieldFormatter is an object in the template context that may be used to format date or date time values.
It provides the following methods:
Method
Description
Usage
DateTimeFormatter getJiraDateTimeFormatter()
Returns a native Jira DateTimeFormatter object
#set ($formatter = $jetiFieldFormatter.getJiraDateTimeFormatter())
DateTimeFormatter getJiraDateTimeFormatter(String style)
Returns a native Jira DateTimeFormatter object configured with DateTimeStyle provided
#set ($formatter = $jetiFieldFormatter.getJiraDateTimeFormatter("COMPLETE"))
DateFormat getJavaDateFormat()
Returns a Java DateFormat object for date formatting
#set ($formatter = $jetiFieldFormatter.getJavaDateFormat())
DateFormat getJavaDateFormat(int style)
Returns a Java DateFormat object configured with the value of the style constants (see java documentation)
​
DateFormat getJavaDateFormat(int style, String locale)
Returns a Java DateFormat object configured with the value of the style constants (see java documentation) and a locale.
Example for locales: en, en_US, fr, de, see more examples in the documentation​
DateFormat getJavaDateTimeFormat()
Returns a Java DateFormat object for date time formatting
​
DateFormat getJavaDateTimeFormat(int dateStyle, int timeStyle)
Returns a Java DateFormat object for date time formatting configured with the value of the style constants (see java documentation)
​
DateFormat getJavaDateTimeFormat(int dateStyle, int timeStyle, String locale)
Returns a Java DateFormat object for date time formatting configured with the value of the style constants (see java documentation) and a locale.
​
DateFormat getJavaDateTimeFormat(String pattern)
Returns a Java SimpleDateFormat object for date time formatting configured with a pattern
#set($formatter = $jetiFieldFormatter.getJavaDateTimeFormat("dd/MM/yyyy HH:mm"))
String formatSafely(DateFormat formatter, Date value)
Formats a date value using the formatter created using either of the above methods
$!jetiFieldFormatter.formatSafely($!formatter, $issue.updated)
or
$!jetiFieldFormatter.formatSafely($!formatter, $issue.getCustomFieldValue("customfield_12345"))
TimeZone getTimeZone(String tzID)
Returns the TimeZone matching the id. TimeZone can be set in the Java date time formatters created above
$!formatter.setTimeZone($jetiFieldFormatter.getTimeZone("America/Los_Angeles"))
TimeZone getDefaultTimeZone()
Returns the default TimeZone in Jira.
​
String[] getAvailableTimeZoneIDs()
Returns all time zone IDs available in Jira.
​

templateSupport

Method
Description
Usage
String encodeUrl(String url);
Calls URLEncoder.encode(url) to encode rendered URLs in email templates using UTF-8 encoding
$!templateSupport.encodeUrl($urlVariable)
String encodeUrl(String url, String encoding);
Calls URLEncoder.encode(url, encoding) to encode rendered URLs in email templates using the encoding specified
$!templateSupport.encodeUrl($urlVariable, <desired encoding>)
boolean issueMatchesJQL(String jqlQuery, Issue issue);
Checks if the given issue matches the JQL query
#if($!templateSupport.issueMatchesJQL("mycustomfield = somevalue AND component=ImportantComponent", $!issue)
## do something...
#end
I18nHelper getI18nHelper(String localeName);
Create an I18nHelper object for the locale
Local name is composed of language code and country code.
e.g. "fr" is for french language, while "fr_FR" is the french spoken in France.
#set($i18nFrench = $!templateSupport.getI18nHelper("fr_FR")
I18nHelper getI18nHelper(Locale locale);
Create an I18nHelper object for the locale
Local name is composed of language code and country code.
e.g. "fr" is for french language, while "fr_FR" is the french spoken in France.
#set($frenchLocale = $!templateSupport.getLocale("fr_FR")
#set($i18nFrench = $!templateSupport.getI18nHelper($frenchLocale)
Locale getLocale(String localeName);
Creates a Java Locale object to be used in date / number formatting or language support.
Local name is composed of language code and country code.
e.g. "fr" is for the French language, while "fr_FR" is the French spoken in France.
#set($frenchLocale = $!templateSupport.getLocale("fr_FR")
boolean isAgent(ApplicationUser applicationUser, Project project);
Determines if the given use is an Service Management Agent in the given project.
#if($!templateSupport.isAgent($!issue.reporter, $!issue.projectObject)
...
#end
boolean isInternalComment(Comment comment);
Determines if the give comment is an Service Management Internal comment in the current issue.
#if($!templateSupport.isInternalComment($!comment))
...
#end
TemplateIssueSearchResults searchForIssuesByJQL(String jql);
Returns a list of issues matching the given JQL query.
#set($searchResults = $!templateSupport.searchForIssuesByJQL("project=IT AND resolution=Unresolved", 10))
#foreach($result in $searchResults.getResults())
$velocityCount - $!result.key (comments: $!result.comments.size())
#end
String getCustomerVisibleStatus(Issue issue);
Returns the Customer Visible Status name of the issue in a Service Management project.
#set($!customerVisibleStatus = $!templateSupport.getCustomerVisibleStatus($!issue)
Issue firstIssueMatchingJQL(String jql);
Returns the first issue that matches the given JQL query.
#set($firtstIssue = $!templateSupport.firstIssueMatchingJQL("project = $issue.projectObject.key AND assignee=$!currentUser.name AND priority = Highest"))
$!firstIssue.summary
String getParentValueFromCascadingSelectFieldValue(Map cascadeSelectFieldValue); String getChildValueFromCascadingSelectFieldValue(Map cascadeSelectFieldValue);
Returns the parent or child value of a Cascade Select custom field.
#set($parentValue = $!templateSupport.getParentValueFromCascadingSelectFieldValue($!issue.getCustomFieldValue("customfield_12345"))
#set($childValue = $!templateSupport.getChildValueFromCascadingSelectFieldValue($!issue.getCustomFieldValue("customfield_12345"))
customfield_12345 is the key of a cascade select field
String getCurrentUsersTimeZoneId()
Returns the time zone id set in the current user’s profile.
The issue was updated at #renderDateTime($!issue.updated "yyyy-MM-dd'T'HH:mmZ'['z']'" $!templateSupport.currentUsersTimeZoneId) Please note that the capital letter T in the above code is just a placeholder, an example to mark that after the date, the time value comes next.
TemplateIssueSearchResults searchForIssuesByJQL(String jql, int maxresults);
Same as above, but limits the results to the given number of issues.
​

Template macros

Macro signature
Parameters
Description
Example
#escapeHtml($value)
  • $value: the value with HTML that should be escaped
Escapes the HTML in a given value, therefore it will be displayed as text.
#escapeHtml("<p>Sample html</p>")
#renderVersions($versions)
  • $versions: the list of versions to render
Renders the versions.
#renderVersions($!issue.fixVersions)
#renderComments($issue)
  • $issue: the issue whose comments are to be rendered
Renders the public comments of the issue.
#renderComments($!issue)
#renderCommentsInReverseOrder($issue)
  • $comments: the issue whose comments are to be rendered
Renders the public comments os the issue in reverse order.
#renderCommentsInReverseOrder($!issue)
#renderCurrentCommentIfPublic()
Renders the current comment if it is public.
#renderCurrentCommentIfPublic()
#renderServiceDeskPublicComments($issue)
  • $issue: the issue whose comments are to be rendered
Renders the public comments of the issue.
#renderServiceDeskPublicComments($!issue)
#renderServiceDeskInternalComments($issue)
  • $issue: the issue whose comments are to be rendered
Renders the internal comments of the issue.
#renderServiceDeskInternalComments($!issue)
#renderAllComments($issue)
  • $issue: the issue whose comments are to be rendered
Renders both public and internal comments of the issue.
#renderAllComments($!issue)
#renderLastComment($issue)
  • $issue: the issue whose last comment is to be rendered
Renders the last comment of the issue.
#renderLastComment($!issue)
#renderCurrentComment()
Renders the current comment.
#renderCurrentComment()
#renderComment()
Renders the current comment.
#renderComment()
#renderComponents($issue)
  • $issue: the issue whose components are to be rendered
Renders the components of the issue.
#renderComponents($!issue)
#renderDateTime($dateTimeValue $pattern $timezoneId)
  • $dateTimeValue: the value to be formatted
  • $pattern: the pattern describing the date and time format. You can find description about formatting and patterns here​
  • $timezoneId: the time zone used for formatting. You can find a list in the Supported Time Zones Appendix
Formats a date-time field based on the pattern and the timezone.
#renderDateTime($!issue.created "dd MMM yyyy hh:mm a" "Australia/West")
#renderDate($dateValue $pattern $timezoneId)
  • $dateValue: the value to be formatted
  • $pattern: the pattern describing the date format. You can find description about formatting and patterns here​
  • $timezoneId: the time zone used for formatting. You can find a list in the Supported Time Zones Appendix
Formats a date field based on the pattern and the timezone.
#renderDate($!issue.created "dd MMM yyyy" "Australia/West")
#renderLabels($issue)
  • $issue: the issue whose labels are to be rendered
Renders the labels of the issue.
#renderLabels($!issue)
#renderList($listitems)
  • $listitems: the list of items to be rendered
Renders the items into a bullet list.
#renderList($!issue.affectedVersions)
#renderFlatList($listitems)
  • $listitems: the list of items to be rendered
Renders the items into a comma-separated list.
#renderFlatList($!issue.affectedVersions)
#renderProject($issue)
  • $issue: the issue whose project name is to be rendered
Renders the project name of the issue.
#renderProject($!issue)
#renderDescription($issue)
  • $issue: the issue whose description is to be rendered
Renders the description of the issue.
#renderDescription($!issue)