Skip to content

Commit 7248c34

Browse files
committed
Postmark: add track_clicks support
Closes #38
1 parent 60dc115 commit 7248c34

File tree

5 files changed

+28
-12
lines changed

5 files changed

+28
-12
lines changed

anymail/backends/postmark.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ def set_tags(self, tags):
183183
if len(tags) > 1:
184184
self.unsupported_feature('multiple tags (%r)' % tags)
185185

186-
# Postmark doesn't support click-tracking
187-
# def set_track_clicks(self, track_clicks):
186+
def set_track_clicks(self, track_clicks):
187+
self.data["TrackLinks"] = 'HtmlAndText' if track_clicks else 'None'
188188

189189
def set_track_opens(self, track_opens):
190190
self.data["TrackOpens"] = track_opens

docs/esps/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Email Service Provider |Mailgun| |Mandrill| |Postmark|
3434
:attr:`~AnymailMessage.metadata` Yes Yes No Yes Yes
3535
:attr:`~AnymailMessage.send_at` Yes Yes No Yes Yes
3636
:attr:`~AnymailMessage.tags` Yes Yes Max 1 tag Yes Max 1 tag
37-
:attr:`~AnymailMessage.track_clicks` Yes Yes No Yes Yes
37+
:attr:`~AnymailMessage.track_clicks` Yes Yes Yes Yes Yes
3838
:attr:`~AnymailMessage.track_opens` Yes Yes Yes Yes Yes
3939

4040
.. rubric:: :ref:`templates-and-merge`

docs/esps/postmark.rst

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ messages.)
8787
Limitations and quirks
8888
----------------------
8989

90-
Postmark has excellent support for standard email functionality, but does
91-
not support all the tracking and reporting additions offered by some other
92-
ESPs.
90+
Postmark does not support a few tracking and reporting additions offered by other ESPs.
9391

9492
Anymail normally raises an :exc:`~anymail.exceptions.AnymailUnsupportedFeature`
9593
error when you try to send a message using features that Postmark doesn't support
@@ -107,13 +105,22 @@ see :ref:`unsupported-features`.
107105
Postmark does not support attaching :attr:`~anymail.message.AnymailMessage.metadata`
108106
to messages.
109107

110-
**No click-tracking**
111-
Postmark supports :attr:`~anymail.message.AnymailMessage.track_open`,
112-
but not :attr:`~anymail.message.AnymailMessage.track_clicks`.
113-
114108
**No delayed sending**
115109
Postmark does not support :attr:`~anymail.message.AnymailMessage.send_at`.
116110

111+
**Click-tracking**
112+
Postmark supports `several link-tracking options`_. Anymail treats
113+
:attr:`~anymail.message.AnymailMessage.track_clicks` as Postmark's
114+
"HtmlAndText" option when True.
115+
116+
If you would prefer Postmark's "HtmlOnly" or "TextOnly" link-tracking, you could
117+
either set that as a Postmark server-level default (and use `message.track_clicks = False`
118+
to disable tracking for specific messages), or use something like
119+
`message.esp_extra = {'TrackLinks': "HtmlOnly"}` to specify a particular option.
120+
121+
.. _several link-tracking options:
122+
http://developer.postmarkapp.com/developer-link-tracking.html
123+
117124

118125
.. _postmark-templates:
119126

tests/test_postmark_backend.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,15 @@ def test_track_opens(self):
325325

326326
def test_track_clicks(self):
327327
self.message.track_clicks = True
328-
with self.assertRaisesMessage(AnymailUnsupportedFeature, 'track_clicks'):
329-
self.message.send()
328+
self.message.send()
329+
data = self.get_api_call_json()
330+
self.assertEqual(data['TrackLinks'], 'HtmlAndText')
331+
332+
# Also explicit "None" for False (to override server default)
333+
self.message.track_clicks = False
334+
self.message.send()
335+
data = self.get_api_call_json()
336+
self.assertEqual(data['TrackLinks'], 'None')
330337

331338
def test_template(self):
332339
self.message.template_id = 1234567
@@ -369,6 +376,7 @@ def test_default_omits_options(self):
369376
self.assertNotIn('TemplateId', data)
370377
self.assertNotIn('TemplateModel', data)
371378
self.assertNotIn('TrackOpens', data)
379+
self.assertNotIn('TrackLinks', data)
372380

373381
def test_esp_extra(self):
374382
self.message.esp_extra = {

tests/test_postmark_integration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def test_all_options(self):
5353
# no metadata, send_at, track_clicks support
5454
tags=["tag 1"], # max one tag
5555
track_opens=True,
56+
track_clicks=True,
5657
)
5758
message.attach("attachment1.txt", "Here is some\ntext for you", "text/plain")
5859
message.attach("attachment2.csv", "ID,Name\n1,Amy Lina", "text/csv")

0 commit comments

Comments
 (0)