Interpret dates and naive datetimes as Django's
current_timezone (rather than UTC like Djrill did).
This should be more likely to behave as expected
when running with a non-UTC TIME_ZONE setting.
(Prep for installing backends as package extras)
* Extract AnymailRequestsBackend and RequestsPayload
to base_requests.py
* Don't define/require requests exceptions when requests
not available
For MANDRILL_API_KEY (e.g.,), look for these settings:
* ANYMAIL = { 'MANDRILL_API_KEY': '...' }
* ANYMAIL_MANDRILL_API_KEY = "..."
* MANDRILL_API_KEY = "..."
(the "bare" third version is used only for settings that
might be reasonably shared with other apps, like api keys)
Webhook tests define a local signal receiver function,
so connect it using the `weak=False` option to set
a good example.
(This isn't technically needed in the tests: the test receivers
are only connected while their definitions are still in scope,
so they couldn't possibly be garbage collected. But it doesn't
hurt, and it's good practice in case the test code gets copied.)
Also update the webhook docs to have a direct link to
Django's "listening to signals" info.
2.0.0-dev0 --> 2.0.0.dev0 (or just 2.0.dev0)
We still practice semver in the major.minor.patch
versions; we just don't use semver's "-" for
pre-release versions. (Because, PEP 0440.)
https://www.python.org/dev/peps/pep-0440/
* Break apart massive _send call
* Try to facilitate subclassing
* Centralize fail_silently handling during _send
* Include original EmailMessage as exception attr
* Add common base DjrillException
* Simplify backend by moving logic
to describe errors into base DjrillException
* Add NotSerializableForMandrillError
for JSON serialization errors
Raise new MandrillRecipientsRefused exception
when Mandrill returns 'reject' or 'invalid' status
for *all* recipients of a message.
(Similar to Django's SMTP email backend raising
SMTPRecipientsRefused.)
Add setting MANDRILL_IGNORE_RECIPIENT_STATUS
to override the new exception.
Trap JSON parsing errors in Mandrill API response,
and raise MandrillAPIError for them. (Helps with #93.)
Closes#80.
Closes#81.