| 4 |  | Trac supports notification of ticket changes via email.   | 
          
            | 5 |  |  | 
          
            | 6 |  | Email notification is useful to keep users up-to-date on tickets /issues of interest, and also provides a convenient way to post all ticket changes to a dedicated mailing list. For example, this is how the [http://lists.edgewall.com/archive/trac-tickets/ Trac-tickets] mailing list is set up. | 
          
            | 7 |  |  | 
          
            | 8 |  | Disabled by default, notification can be activated and configured in [ wiki:TracIni trac.ini]. | 
          
            |  | 4 | Trac supports notification of ticket changes via email. | 
          
            |  | 5 |  | 
          
            |  | 6 | Email notification is useful to keep users up-to-date on tickets of interest, and also provides a convenient way to post all ticket changes to a dedicated mailing list. | 
          
            |  | 7 |  | 
          
            |  | 8 | Disabled by default, notification can be activated and configured in [TracIni trac.ini]. | 
        
        
          
            | 71 |  | === Customizing the e-mail subject | 
          
            | 72 |  | The e-mail subject can be customized with the `ticket_subject_template` option, which contains a [http://genshi.edgewall.org/wiki/Documentation/text-templates.html text template] snippet. The default value is: | 
          
            |  | 71 | The subscription rule name on the left side of the `=` can be anything, it has no meaning outside this configuration file. The subscriber name on the right side of the `=` must be one of the subscribers listed in the above table. | 
          
            |  | 72 |  | 
          
            |  | 73 | The following attributes of default subscriptions can be configured: | 
          
            |  | 74 | * `.distributor` (Default: `email`) | 
          
            |  | 75 | * Other values require plugins. For example `on-site` requires th:OnSiteNotificationsPlugin. | 
          
            |  | 76 | * `.priority` (Default: `100`) | 
          
            |  | 77 | * Smaller values override larger values. | 
          
            |  | 78 | * If you use `0`, then users will not be able to override this rule. | 
          
            |  | 79 | * `.adverb` (Default: `always`) | 
          
            |  | 80 | * `never` can be used to silence other subscription rules with higher values. | 
          
            |  | 81 | * `.format` (Default: `text/plain`) | 
          
            |  | 82 | * Other values require plugins. For example `text/html` requires th:TracHtmlNotificationPlugin. | 
          
            |  | 83 |  | 
          
            |  | 84 | === Example Configuration (default subscriptions) | 
          
            |  | 85 |  | 
          
            |  | 86 | This example implements the often desired | 
          
            |  | 87 | //Never Notify Updater// behavior by setting | 
          
            |  | 88 | the priority of that rule to the highest value, | 
          
            |  | 89 | thereby taking precedence over other rules. | 
          
            |  | 90 |  | 
          
            |  | 91 | {{{#!ini | 
          
            |  | 92 | [notification-subscriber] | 
          
            |  | 93 | always_notify_owner = TicketOwnerSubscriber | 
          
            |  | 94 | always_notify_owner.distributor = email | 
          
            |  | 95 | always_notify_owner.priority = 100 | 
          
            |  | 96 | always_notify_owner.adverb = always | 
          
            |  | 97 | always_notify_owner.format = text/plain | 
          
            |  | 98 |  | 
          
            |  | 99 | always_notify_previous_updater = TicketPreviousUpdatersSubscriber | 
          
            |  | 100 |  | 
          
            |  | 101 | never_notify_updater = TicketUpdaterSubscriber | 
          
            |  | 102 | never_notify_updater.adverb = never | 
          
            |  | 103 | never_notify_updater.priority = 0 | 
          
            |  | 104 |  | 
          
            |  | 105 | notify_cc_html = CarbonCopySubscriber | 
          
            |  | 106 | notify_cc_html.format = text/html | 
          
            |  | 107 | }}} | 
          
            |  | 108 |  | 
          
            |  | 109 | === Customizing the email subject | 
          
            |  | 110 | The email subject can be customized with the `ticket_subject_template` option, which contains a [https://genshi.edgewall.org/wiki/Documentation/text-templates.html Genshi text template] snippet. The default value is: | 
        
        
          
            | 82 |  | * `ticket`: The ticket model object (see [trac:source:/branches/1.4-stable/trac/ticket/model.py model.py]). Individual ticket fields can be addressed by appending the field name separated by a dot, eg `$ticket.milestone`. | 
          
            | 83 |  |  | 
          
            | 84 |  | === Customizing the e-mail content | 
          
            | 85 |  |  | 
          
            | 86 |  | The notification e-mail content is generated based on `ticket_notify_email.txt` in `trac/ticket/templates`. You can add your own version of this template by adding a `ticket_notify_email.txt` to the templates directory of your environment. The default looks like this: | 
          
            | 87 |  |  | 
          
            | 88 |  | {{{#!genshi | 
          
            | 89 |  | $ticket_body_hdr | 
          
            | 90 |  | $ticket_props | 
          
            | 91 |  | {% choose ticket.new %}\ | 
          
            | 92 |  | {%   when True %}\ | 
          
            | 93 |  | $ticket.description | 
          
            | 94 |  | {%   end %}\ | 
          
            | 95 |  | {%   otherwise %}\ | 
          
            | 96 |  | {%     if changes_body %}\ | 
          
            |  | 120 | * `ticket`: The ticket model object (see [trac:source:/branches/1.4-stable/trac/ticket/model.py model.py]). Individual ticket fields can be addressed by appending the field name separated by a dot, eg `${ticket.milestone}`. | 
          
            |  | 121 |  | 
          
            |  | 122 | === Customizing the email content #CustomizingContent | 
          
            |  | 123 |  | 
          
            |  | 124 | The notification email content is generated based on `ticket_notify_email.txt` in `trac/ticket/templates`. You can add your own version of this template by adding a `ticket_notify_email.txt` to the templates directory of your environment. The default is: | 
          
            |  | 125 |  | 
          
            |  | 126 | {{{#!jinja | 
          
            |  | 127 | ${ticket_body_hdr} | 
          
            |  | 128 | ${ticket_props} | 
          
            |  | 129 | # if ticket.new: | 
          
            |  | 130 | ${ticket.description} | 
          
            |  | 131 | # else: | 
          
            |  | 132 | #   if changes_body: | 
        
        
          
            | 149 |  | == Customizing e-mail content for MS Outlook | 
          
            | 150 |  |  | 
          
            | 151 |  | MS Outlook normally presents plain text e-mails with a variable-width font, and as a result the ticket properties table will most certainly look like a mess in MS Outlook. This can be fixed with some customization of the [#Customizingthee-mailcontent e-mail template]. | 
          
            | 152 |  |  | 
          
            | 153 |  | Replace the following second row in the template: | 
          
            | 154 |  | {{{ | 
          
            | 155 |  | $ticket_props | 
          
            | 156 |  | }}} | 
          
            | 157 |  |  | 
          
            | 158 |  | with this (requires Python 2.6 or later): | 
          
            | 159 |  | {{{ | 
          
            | 160 |  | -------------------------------------------------------------------------- | 
          
            | 161 |  | {% with | 
          
            | 162 |  |    pv = [(a[0].strip(), a[1].strip()) for a in [b.split(':') for b in | 
          
            | 163 |  |          [c.strip() for c in  | 
          
            | 164 |  |           ticket_props.replace('|', '\n').splitlines()[1:-1]] if ':' in b]]; | 
          
            | 165 |  |    sel = ['Reporter', 'Owner', 'Type', 'Status', 'Priority', 'Milestone',  | 
          
            | 166 |  |           'Component', 'Severity', 'Resolution', 'Keywords'] %}\ | 
          
            | 167 |  | ${'\n'.join('%s\t%s' % (format(p[0]+':', ' <12'), p[1]) for p in pv if p[0] in sel)} | 
          
            | 168 |  | {% end %}\ | 
          
            | 169 |  | -------------------------------------------------------------------------- | 
          
            | 170 |  | }}} | 
          
            | 171 |  |  | 
          
            | 172 |  | The table of ticket properties is replaced with a list of a selection of the properties. A tab character separates the name and value in such a way that most people should find this more pleasing than the default table when using MS Outlook. | 
          
            | 173 |  | {{{#!div style="margin: 1em 1.75em; border:1px dotted" | 
          
            | 174 |  | {{{#!html | 
          
            | 175 |  | #42: testing<br /> | 
          
            | 176 |  | --------------------------------------------------------------------------<br /> | 
          
            | 177 |  | <table cellpadding=0> | 
          
            | 178 |  | <tr><td>Reporter:</td><td>jonas@example.com</td></tr> | 
          
            | 179 |  | <tr><td>Owner:</td><td>anonymous</td></tr> | 
          
            | 180 |  | <tr><td>Type:</td><td>defect</td></tr> | 
          
            | 181 |  | <tr><td>Status:</td><td>assigned</td></tr> | 
          
            | 182 |  | <tr><td>Priority:</td><td>lowest</td></tr> | 
          
            | 183 |  | <tr><td>Milestone:</td><td>0.9</td></tr> | 
          
            | 184 |  | <tr><td>Component:</td><td>report system</td></tr> | 
          
            | 185 |  | <tr><td>Severity:</td><td>major</td></tr> | 
          
            | 186 |  | <tr><td>Resolution:</td><td> </td></tr> | 
          
            | 187 |  | <tr><td>Keywords:</td><td> </td></tr> | 
          
            | 188 |  | </table> | 
          
            | 189 |  | --------------------------------------------------------------------------<br /> | 
          
            | 190 |  | Changes:<br /> | 
          
            | 191 |  | <br /> | 
          
            | 192 |  |   * component:  changeset view => search system<br /> | 
          
            | 193 |  |   * priority:  low => highest<br /> | 
          
            | 194 |  |   * owner:  jonas => anonymous<br /> | 
          
            | 195 |  |   * cc:  daniel@example.com =><br /> | 
          
            | 196 |  |           daniel@example.com, jonas@example.com<br /> | 
          
            | 197 |  |   * status:  new => assigned<br /> | 
          
            | 198 |  | <br /> | 
          
            | 199 |  | Comment:<br /> | 
          
            | 200 |  | I'm interested too!<br /> | 
          
            | 201 |  | <br /> | 
          
            | 202 |  | --<br /> | 
          
            | 203 |  | Ticket URL: <http://example.com/trac/ticket/42><br /> | 
          
            | 204 |  | My Project <http://myproj.example.com/><br /> | 
          
            | 205 |  | }}} | 
          
            | 206 |  | }}} | 
          
            | 207 |  |  | 
          
            | 208 |  | **Important**: Only those ticket fields that are listed in `sel` are part of the HTML mail. If you have defined custom ticket fields which are to be part of the mail, then they have to be added to `sel`. Example: | 
          
            | 209 |  | {{{ | 
          
            | 210 |  |    sel = ['Reporter', ..., 'Keywords', 'Custom1', 'Custom2'] | 
          
            | 211 |  | }}} | 
          
            | 212 |  |  | 
          
            | 213 |  | However, the solution is still a workaround to an automatically HTML-formatted e-mail. | 
          
            | 214 |  |  |