Template Defaults and Variables

The Email Scout Report templates are written using the Jinja templating language. If you are unfamiliar with this, we recommend that you begin by copying and editing an existing template - see ESR Templates

Default/Recommended ESR Templates

The following default templates are available from Reporting > Email Scout Report template, in the Recommended Templates tab:

  • column
  • row

Column template

Column based templates provide the Email Scout Report output in a similar format as results viewed in the Log Search.

Here is an example of a column based template:

This format is recommended when the user will be viewing the Email Scout Report on a desktop as this format can be difficult to read on mobile. See the below example outputs on both Desktop and Mobile:

Column based on Desktop

Column based on Mobile

Row template

Row based templates provide the Email Scout Report output in a different format, but provide the same level of information. This may be a preferred format for anyone who struggles with smaller font sizes.

Here is an example of a row based template:

This format is recommended when the user will be viewing the Email Scout Report on a mobile as Column based can be difficult to read on the smaller mobile screen, however does display well on a desktop. See the below example outputs on both Desktop and Mobile:

Row based on Desktop

Row based on Mobile

Template Variables

The following variables can be added to the Email Scout Report templates. When the template is applied to a report, the variable content is added.

  • {{ columns }} - Use this variable to choose from the following columns:
  • Column Variable name   Column Variable name
    Message ID exim_id   Error class error_class
    Domain domain   From fromh
    Filtering host host   To toh
    Timestamp date   CC cch
    Sender sender   Subject subjecth
    Recipient recipient   Original Message ID message_id_header
    Sender hostname sender_host   Status status
    Sender IP sender_ip   Delivery date delivery_date
    Sender location sender_location   Delivery IP delivery_ip
    Bytes received incoming_size   Delivery hostname delivery_fqdn
    Bytes sent: outgoing_size   Delivery port delivery_port
    Main class main_class   Delivery data delivery_data
    Sub class sub_class   Delivery interface delivery_interface
    Extra class extra_class   In archive archive_id
  • {{ objects }} - Log search results list
  • {{ brand }} - Brand name for the domain
  • {{ now }} - Current date and time
  • {{ name }} - Name of the report
  • {{ destination }} - Email address of the report recipient
  • {{ view }} - Generates a link to view message and optionally perform specific actions
  • {{ decode_idna() }} - Converts an IDNA encoded domain to a Unicode representation.
  • {{ country_name() }} - Converts a two-character country code to the country name
  • {{ unsubscribe_link() }} - Generates a link to unsubscribe from the Email Scout Report
  • {{ format_datetime(datetime or date[, format]) }} - Converts a date or datetime (timestamp) to a user-readable string
  • {{ format_date(datetime or date[, format]) }} - Converts a date or datetime (timestamp) to a user-readable string
  • {{ format_time(datetime[, format]) }} - Converts a datetime (timestamp) to a user-readable string
  • {{ format_timedelta(timediff) }} - Converts a date/time difference to a user-readable string
  • {{ brand_color }} - Adds the brand colour to the report
  • {{ logo_url }} - Adds the Branding logo specified in the Branding Management page to the report.

Look at the existing templates (above) to see how the variables have been applied using Jinja.

Example Email Scout Report (ESR) Template Content

<html>
    <head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

	<!---- Add some basic styling --->
	<style>
	    table {
	    border-collapse: collapse;
	    }
			
	    td, th {
	    border: 1px solid grey;
	    padding: 5px;
	    }

	    tr:nth-child(even) {
	    background-color: ivory;
	    }

	    tr:nth-child(odd) {
	    background-color: azure;
	    }
	</style>
    </head>

    <body>
    <!-- Set the column labels, names and formats -->
	{% set column_order = [
	    ("Datetime", "datetime", "date_format"),
	    ("Filtering server", "filtering_host", "decoded"),
	    ("Message ID", "message_id", None),
	    ("Sender IP", "sender_ip", None),
	    ("Sender hostname", "sender_host", "decoded"),
	    ("Sender", "sender", "decoded"),
	    ("Recipient", "recipient", "escaped"),
	    ("From", "from_header", "escaped"),
	    ("To", "to_header", "escaped"),
	    ("CC", "cc_header", "escaped"),
	    ("Subject", "subject_header", None),
	    ("Incoming size", "incoming_size", "size"),
	    ("Outgoing size", "outgoing_size", "size"),
	    ("Delivery date", "delivery_date", "date_format"),
	    ("Destination IP", "destination_ip", None),
	    ("Destination host", "destination_host", "decoded"),
	    ("Destination port", "destination_port", None),
	    ("Status", "status", "status"),
	    ("Classification", "main_class", None),
	]
	%}

<!---  Here is your header content -->
	<div id="header">
	!-- An example of using a data URI to encode images  -->
	    <img src="data:image/jpeg;base64,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 />
	    <p>
	    <h1>Email Scout Report</h1>
		This is the email scout report for {{ destination }}, sent at {{ format_time( now ) }}.
	</div>

<!--  Here is the report content --->
	<p>
	<div id="content">
	<!-- Create a table to hold the content.  Use the column_order array to get the headings for the colums -->

	    <table>
	    <thead>
		<!--- A for-loop to iterate through the column_order array and get the column label and format for the columns that have been included in the report. -->
		{% for label,column,column_format in column_order if column in columns %}
		<!--- Use the label from the array as the column heading --->
		<th> {{ label }} </th>
		{% endfor %}
		<!-- Add a column heading for the view message column   -->
		<th>View message</th>
	    </thead>
	    <tbody>
		<!-- Fill in the table contents by iterating through the objects list -->
		{% for object in objects %}
		<!--- Create a new row for each object -->
		<tr>
		    <!-- Get the list of column labels and formats from the colum_order array --->
		    {% for label,column,column_format in column_order if column in columns %}
		    <!--- Create a new table item for each column -->
		    <td>
			<!-- Insert a blank for null items  --->
			{% if not object[column] %}
			{{ "" }}
			<!--- For each column, apply the appopriate format from the column_order array -->
			{% elif column_format == "date_format" %}
			    {{ format_date(object[column]) }} {{ format_time(object[column]) }}
			{% elif column_format == "escaped" %}
			    {{ object.get(column, "")|replace(".", "<span>.</span>"|safe) }}
			{% elif column_format == "decoded" %}
			    {{ decode_idna(object.get(column, ""))|replace(".", "<span>.</span>"|safe) }}
			{% elif column_format == "size" %}
			    {{ object.get(column)|filesizeformat }}
			{% elif column_format == "status" %}
			    {{ object[column]|replace("-", " ")|title }}
			{% else %}
			    {{ object.get(column) }}
			{% endif %}
		    </td>
		    {% endfor %}

		    <td>
			<!--- If the object is quarantined or queued, add a link to allow actions on the object -->
			{% if object.get("status", "") == "quarantined" %}
			    <a href="{{ view(object, ['release', 'release and train', 'remove', 'blacklist sender', 'whitelist sender', 'lock identity']) }}">View quarantined message</a>
			{% elif object.get("status", "") == "queued" %}
			    <a href="{{ view(object, ['cancel delivery', 'add recipient', 'cancel delivery and generate bounce', 'show next delivery attempt', 'retry' ]) }}">View queued message</a>
			{% endif %}
		    </td>
	 	</tr>
		{% endfor %}
	    </tbody>
	    </table>
	</div>

<!---  Footer content goes here --->   
	<div id="footer"><p>
	    This report was created by the <strong>{{ brand }}</strong> mail protection system.
	    <!-- Include an unsubscribe link for any automatically generated ESRs -->
	    {% if unsubscribe_link %}
	    <p>Click here to unsubscribe: <a href='{{ unsubscribe_link() }}'>Unsubscribe</a>
	    {% endif %}
	</div>
    </body>
</html>