diff --git a/anymail/backends/postmark.py b/anymail/backends/postmark.py index 60c487b..2d2eeb9 100644 --- a/anymail/backends/postmark.py +++ b/anymail/backends/postmark.py @@ -183,8 +183,8 @@ class PostmarkPayload(RequestsPayload): if len(tags) > 1: self.unsupported_feature('multiple tags (%r)' % tags) - # Postmark doesn't support click-tracking - # def set_track_clicks(self, track_clicks): + def set_track_clicks(self, track_clicks): + self.data["TrackLinks"] = 'HtmlAndText' if track_clicks else 'None' def set_track_opens(self, track_opens): self.data["TrackOpens"] = track_opens diff --git a/docs/esps/index.rst b/docs/esps/index.rst index dbb4e64..18643b6 100644 --- a/docs/esps/index.rst +++ b/docs/esps/index.rst @@ -34,7 +34,7 @@ Email Service Provider |Mailgun| |Mandrill| |Postmark| :attr:`~AnymailMessage.metadata` Yes Yes No Yes Yes :attr:`~AnymailMessage.send_at` Yes Yes No Yes Yes :attr:`~AnymailMessage.tags` Yes Yes Max 1 tag Yes Max 1 tag -:attr:`~AnymailMessage.track_clicks` Yes Yes No Yes Yes +:attr:`~AnymailMessage.track_clicks` Yes Yes Yes Yes Yes :attr:`~AnymailMessage.track_opens` Yes Yes Yes Yes Yes .. rubric:: :ref:`templates-and-merge` diff --git a/docs/esps/postmark.rst b/docs/esps/postmark.rst index 83dbf49..14f5c9a 100644 --- a/docs/esps/postmark.rst +++ b/docs/esps/postmark.rst @@ -87,9 +87,7 @@ messages.) Limitations and quirks ---------------------- -Postmark has excellent support for standard email functionality, but does -not support all the tracking and reporting additions offered by some other -ESPs. +Postmark does not support a few tracking and reporting additions offered by other ESPs. Anymail normally raises an :exc:`~anymail.exceptions.AnymailUnsupportedFeature` error when you try to send a message using features that Postmark doesn't support @@ -107,13 +105,22 @@ see :ref:`unsupported-features`. Postmark does not support attaching :attr:`~anymail.message.AnymailMessage.metadata` to messages. -**No click-tracking** - Postmark supports :attr:`~anymail.message.AnymailMessage.track_open`, - but not :attr:`~anymail.message.AnymailMessage.track_clicks`. - **No delayed sending** Postmark does not support :attr:`~anymail.message.AnymailMessage.send_at`. +**Click-tracking** + Postmark supports `several link-tracking options`_. Anymail treats + :attr:`~anymail.message.AnymailMessage.track_clicks` as Postmark's + "HtmlAndText" option when True. + + If you would prefer Postmark's "HtmlOnly" or "TextOnly" link-tracking, you could + either set that as a Postmark server-level default (and use `message.track_clicks = False` + to disable tracking for specific messages), or use something like + `message.esp_extra = {'TrackLinks': "HtmlOnly"}` to specify a particular option. + +.. _several link-tracking options: + http://developer.postmarkapp.com/developer-link-tracking.html + .. _postmark-templates: diff --git a/tests/test_postmark_backend.py b/tests/test_postmark_backend.py index 612ae34..7b2b383 100644 --- a/tests/test_postmark_backend.py +++ b/tests/test_postmark_backend.py @@ -325,8 +325,15 @@ class PostmarkBackendAnymailFeatureTests(PostmarkBackendMockAPITestCase): def test_track_clicks(self): self.message.track_clicks = True - with self.assertRaisesMessage(AnymailUnsupportedFeature, 'track_clicks'): - self.message.send() + self.message.send() + data = self.get_api_call_json() + self.assertEqual(data['TrackLinks'], 'HtmlAndText') + + # Also explicit "None" for False (to override server default) + self.message.track_clicks = False + self.message.send() + data = self.get_api_call_json() + self.assertEqual(data['TrackLinks'], 'None') def test_template(self): self.message.template_id = 1234567 @@ -369,6 +376,7 @@ class PostmarkBackendAnymailFeatureTests(PostmarkBackendMockAPITestCase): self.assertNotIn('TemplateId', data) self.assertNotIn('TemplateModel', data) self.assertNotIn('TrackOpens', data) + self.assertNotIn('TrackLinks', data) def test_esp_extra(self): self.message.esp_extra = { diff --git a/tests/test_postmark_integration.py b/tests/test_postmark_integration.py index 871b566..05114bb 100644 --- a/tests/test_postmark_integration.py +++ b/tests/test_postmark_integration.py @@ -53,6 +53,7 @@ class PostmarkBackendIntegrationTests(SimpleTestCase, AnymailTestMixin): # no metadata, send_at, track_clicks support tags=["tag 1"], # max one tag track_opens=True, + track_clicks=True, ) message.attach("attachment1.txt", "Here is some\ntext for you", "text/plain") message.attach("attachment2.csv", "ID,Name\n1,Amy Lina", "text/csv")