Releases: caronc/apprise
Release v1.8.0
Details
☝️ Attention Developers: there is a potential Breaking Change in this release. CLI users will not be impacted.
🛠️ Potential Breaking Change
PR #1119 involved the refactoring of all the internal file/module structure of the Apprise library. The hope is I didn't break anything in your source code 🙏 . The change was required in order to remain compatible with Python v3.11+ in conjunction with library importing and how it works under the hood. More details on the specific issue can be found here demonstrating it. The Python Issue I opened in reguards to this made it clear I needed to adapt the fix on my side and conform to a better file based structure.
The side effect of this massive change developers may see (if any at all) is just the way your import
calls are made. If you always followed the examples provided on this GitHub project, you'll have no issues at all. However, if you got clever and leveraged some of the under-the-hood compontents Apprise is built upon, then you may have an issue. The good news is the ONLY thing impacted is the way you imported your libraries (they just slightly moved around). An example of this is someone who may have had:
# For example:
from apprise.plugins.NotifyEmail import NotifyEmail
# This has changed to :
from apprise.plugins.email import NotifyEmail
# All other object functionality has not changed at all
Documented imports still work perfectly (both before and after this major refactor) such as:
from apprise import Apprise
from apprise import AppriseAsset
# etc...
📣 New Notification Services:
n/a
💡 Features
- Custom Plugin Attachment Support Enforced + Added Testing in #1115
- Do not sanitize
http://
attachment URLs (#1122)- This allows the successful fetching of very complicated http based Attachment URL's where the case sensitivity of the keys matter.
- The side effect of this change, is built in switches like
cache=
become case sensitive too (e.gCache=
will no longer be parsed).
❤️ Life-Cycle Support
- Enhancement: Refactor Test Code for Efficiency and Quality by @freddiewanah in #1100
- 💣 Python Module Naming & Namespacing Harmonization by in #1119
- This was a major change that eliminated
ClassName.py
to not include aclass ClassName
inside. Python has issues withimport
andunittest
references when this is done.unittests
break completely in Python v3.11 using this method making this massive refactoring essential.
- This was a major change that eliminated
🐛 Bugfixes
- Added JSON Content-Type header to freemobile:// in #1109
- Fix mailto://ip.addr support in #1114
clicksend://
authentication bugfix in #1121- Update Apprise API (
apprise//
) token length by @isometimescode in #1120
Installation
Apprise is available on PyPI through pip:
# Install Apprise v1.8.0 rom PyPI
pip install apprise==1.8.0
New Contributors
- @freddiewanah made their first contribution in #1100
- @isometimescode made their first contribution in #1120
Release v1.7.6
Details
📣 New Notification Services:
💡 Features
❤️ Life-Cycle Support
- Fixed deprication warnings for Markdown extensions in #1108
- Default locale logical compatibility with Python 3.12 by @liushuyu in #1054
- Retired faast.io - It is no longer responding in #1096
- ntfy loaded topic count bugfix in #1094
🐛 Bugfixes
- freemobile:// msg moved from GET parameters and into payload in #1106
- Honor overflow=truncate when sending attachments by @pomeloy in #1097
host
parsed from user login (if present) for Emails in #1095
Installation
Apprise is available on PyPI through pip:
# Install Apprise v1.7.6 from PyPI
pip install apprise==1.7.6
New Contributors
Release v1.7.5
Details
📣 New Notification Services:
- Free-Mobile Support added in #1090
💡 Features
- Improved markdown to html conversions in #1089
❤️ Life-Cycle Support
- Added test case to strengthen YAML configuration validation in #1043
🐛 Bugfixes
- Improved async/threading attachment support in #1086
- Improved variable parsing in YAML files in #1088
Installation
Apprise is available on PyPI through pip:
# Install Apprise v1.7.5 from PyPI
pip install apprise==1.7.5
Release v1.7.4
Details
📣 New Notification Services:
💡 Features
.conf
configuration file support added to CLI. This PR also resolved some documentation ambiguity in #1080
❤️ Life-Cycle Support
- n/a
🐛 Bugfixes
- Custom module deadlock import fix in #1077
- This was primary reason for this (Apprise) release; to resolve this bug introduced in #1071 (in Apprise v1.7.3).
Apprise is available on PyPI through pip:
# Install Apprise v1.7.4 from PyPI
pip install apprise==1.7.4
Release v1.7.3
Details
Another minor release to push some outstanding bug-fixes that have accumulated and patched over the past month
📣 New Notification Services:
💡 Features
mailto://
comcast.net email template added (#1059)mailto://
improved custom email server handling (5ae212f)to=
andfrom_addr=
are no longer required in most circumstances and can be automatically determined based on basic information provided.
ntfy://
markdown support added (#1056)- just add
?format=markdown
to format the content accordingly
- just add
❤️ Life-Cycle Support
paho-mqtt
v2.0 was released and it's documentation for v1.6.1 was completely incompatible with it. For the stability of themqtt://
plugin,paho-mqtt
has been pinned to the stable v1.x release (#1065)
🐛 Bugfixes
- Fixed documents with respect to the use of
yaml
files (#1069) - Thank you @samueltardieu- Updated CLI so that it can read both
.yml
and.yaml
files by default (#1073)
- Updated CLI so that it can read both
macosx://
- Update terminal-notifier notify_paths (#1052) - Thank you @joergschultzelutter- Asynchronous Dynamic Module Loading Support (#1071)
- This was a bug introduced with Dynamic Module Loading (in Apprise v1.7.0) preventing threading/async support
Apprise is available on PyPI through pip:
# Install Apprise v1.7.3 from PyPI
pip install apprise==1.7.3
Release v1.7.2
Details
This was just a second small release add some improvements and bug fixes
See the release notes for Apprise v1.7.0 to see all of the bells and whistles now available!
💡 Features
- Slack Integration Support thread_timestamp (#1033)
- Massive refactoring of
overflow
featuressplit
andtruncate
(#1035 & #1038)
❤️ Life-Cycle Support
🐛 Bugfixes
- Resolved TypeError logging exception with Custom plugin loading (#1042)
- Update README.md (form:// and forms:// examples) (#1045) - thank you @dgtlmoon
Installation Instructions
Apprise is available on PyPI through pip:
# Install Apprise v1.7.2 from PyPI
pip install apprise==1.7.2
Release v1.7.1
Details
This was just a small release to patch a small bug (#1032) preventing Apprise v1.7.0 from being compatible with the Apprise API.
See the release notes for Apprise v1.7.0 to see all of the bells and whistles now available!
🐛 Bugfixes
- Resolved ConfigMemory AttributeError Exception (#1032)
Installation Instructions
Apprise is available on PyPI through pip:
# Install Apprise v1.7.1 from PyPI
pip install apprise==1.7.1
Release v1.7.0
Details
📣 New Notification Services:
- Threema Gateway Support added. (#993)
- Synology Chat Support added. (#944)
- APRS (Automated Packet Reporting System) Ham Radio Support added. (#1005); thanks @joergschultzelutter
- WeCom Bot Support added. (#1016)
- httpSMS Support added. (#1017)
- SMS Manager Support added. (#1018)
- BulkVS Support added. (#1014)
💡 Features
- Massive Refactoring of Dynamic Module Loading (now on demand) (#1020)
- YAML (Configuration) Tag Group Support enhancement (#998)
- Emoji support added 🚀 (#1011)
- You can now provide
:slightly_smiling_face:
(as an example) in your apprise message body and have it swap to 🙂 - All supported emoji's were based on @ikatyang's Emoji Cheat Sheet
- The emoji engine is not active by default but can be turned on in several ways:
-
In your Apprise URL, simply add the parameter
emojis=yes
and they will be ran against that service only:# The below would run the title and body through the emoji engine to produce their unicode # emoji equivalent.. # :rocket: would become 🚀 and :+1: would become 👍 apprise --title=":+1: Great work everyone!" \ --body="So proud of you all! :rocket:." \ "myschema://credentials?emojis=yes"
You can also ensure that the emoji engine is always turned on via the CLI using the switch
--interpret-emojis
or it's synonymous equivalent-j
# again ... :rocket: would become 🚀 and :+1: would become 👍 apprise --title=":+1: Great work everyone!" \ --body="So proud of you all! :rocket:." \ --interpret-emojis "myschema://credentials"
-
In your Apprise Asset object, just set
emojis=True
. This becomes a bit more of a global switch and turns on the emoji support for all notifications regardless if theemojis=yes
is set on the URL.import apprise # if set to True: # Emoji Engine is enabled by default (but can be over-ridden on a per-url base ?emojis=no # if set to False: # Emoji Engine is never enabled (regardless of URL definition) # if set to None (Default): # Emoji Engine is enabled on demand (per URL definition only) asset = apprise.AppriseAsset(emojis=True) apobj = apprise.Apprise(asset=asset) # The below will be passed through the emoji engine because the asset enabled it # by default apobj.add("myschema://credentials") # The below will never use the emoji engine, regardless if it is enabled or not: apobj.add("myschema://credentials?emojis=no")
-
- This is documented here as well on the wiki
- Note that if the emoji engine is enabled, but the URL specifically says
?emojis=no
, then the engine will never be applied against it.
- You can now provide
- Telegram (
tgram://
) supports topics inline per target specified (#1028)- Previously Supported:
tgram://{bot_token}/
tgram://{bot_token}/{chat_id}/
tgram://{bot_token}/{chat_id1}/{chat_id2}/{chat_id3}/
- Newly Supported (in addition to the above):
tgram://{bot_token}/{chat_id}:{topic}/
tgram://{bot_token}/{chat_id1}:topic1}/{chat_id2}:{topic2}/{chat_id3}:{topic3}/
- You are not required to provide a topic as it is purely optional:
tgram://{bot_token}/{chat_id1}/{chat_id2}:{topic2}/{chat_id3}/
- Previously Supported:
- Discord (
discord://
) support foruser
androle
ping support (#1004).- The discord message body can contain content such as the following to trigger the appropriate pings
- user:
<@123>
- role:
<@&456>
- tag:
@everyone
- user:
- The discord message body can contain content such as the following to trigger the appropriate pings
❤️ Life-Cycle Support
- Removal of left-over Python 2 code (#1012); thanks @a-detiste
🐛 Bugfixes
- n/a
Installation Instructions
Apprise is available on PyPI through pip:
# Install Apprise v1.7.0 from PyPI
pip install apprise==1.7.0
Release v1.6.0
Details
📣 New Notification Services:
💡 Features
-
mqtt://
added log entry on successful transmission for both consistency and to align with other plugins (#946) -
Refactored URLBase() object to prepare for API Webhook support in the Apprise API (#973)
-
A global change to handles
user=
directive a better and auto-solves ambiguous situations where the URL looks like this:schema://username@hostname?user=username2
(#947).In the past the
username
would get lost and be trumped withusername2
. This is fine, but to may Apprise more versatile, Now in these circumstances Apprise will interpret it as:schema://password@hostname?user=username
. This change does not disrupt other common formatting such as:schema://username:password@hostname
schema://username@hostname
schema://hostname?user=username&password=password
-
Default Attachment maximum attachment size changed from 5MB to 1GB (be3baed). This just makes it easier to use the API and CLI without issues. It lets the upstream service complain if the attachment is too large instead of Apprise restricting you.
-
xml://
custom URL parsing better handles customized XML elements (inserted, renamed and deleted); (#945). -
Configuration now supports Groups. You can now assign pre-defined tags to groups and trigger your notifications off of them. (#967)
-
Groups are processed at the end, so there is no requirement to define it at the front or end of your configuration files.
-
Group definitions stack as well (so defining the same group again with append any entries to what was already assigned.
-
You can assign more groups to groups
-
You can assign multiple groups in one single declaration
-
Here is a simple TEXT example:
# assign "tag1" and "tag2" to the group "group" group = tag1, tag2 # Group assigned to a group plus another tag groupA = group, tag3 # Support multi-assignments (also stackable) # both groupB and groupC would acquire tag1 and tag4 groupB, groupC = tag1, tag4 # Append another tag into a group already defined group = tag4 # Just some URLs defined as examples tag1 = mailto://credentials tag2 = mailto://credentials tag3 = mailto://credentials tag4 = mailto://credentials
If you were to send your notification to the tag
group
it would in fact trigger bothtag1
,tag2
, andtag4
:apprise -g 'group' -b "Test Message!"
-
Here is a simple YAML example:
# You must define a groups section groups: group: tag1, tag2 groupA: group, tag3 group: tag4 # Support multi assignments: groupB, groupC: tag1, tag4 # Another way you can define your groups: groupD: - tagX: Place an optional comment here; this is ignored and only tagX is retrieved - tagY: Another spot to place an optional comment # You can also just list them: groupG: - tag1 - tag3 - group # Define your tags as usual here: urls: - json://localhost: - tag: tag1 - form://localhost: - tag: tag2 - mailto://credentials: - tag: tag3 - mailto://credentials: - tag: tag4
-
❤️ Life-Cycle Support
- MSG91 Rewrite due to massive upstream changes to their API. (#966)
- It's basically a completely new plugin with zero backwards compatibility with it's previous design. Functionality restored in this release.
- Twitter plugin supports
x://
in addition totweet://
andtwitter://
to align with re-branding (#971) - Matrix updated to handle API v3. Attachment support not there, but works for v2. Simply add
?v=2
to your Apprise URL to use the older API for now. (#970) - Downgraded License to BSDv2 (BSDv3 is too strict) (#976)
🐛 Bugfixes
- n/a
Installation Instructions
Apprise is available on PyPI through pip:
# Install Apprise v1.6.0 from PyPI
pip install apprise==1.6.0
Release v1.5.0
Details
📣 New Notification Services:
- Pushy Support added. (#902)
- PushDeer Support added. (#904)
- PushMe Support added. (#928)
- RSyslog Support added. (#930)
rsyslog://
split from the originalsyslog://
Service
💡 Features
- Matrix Attachment support! 📚 🚀
- Discord:
- Rate Limiting (429 Error code) handling/support (#901)
- basically retry our post once our limit timer has elapsed
- Added
href=
variable that can be set on the Apprise URL which allows you to leverage theembed
part of the API and turn yourtitle
into a hyperlink to the specified location. You can also useurl=
(as an alias tohref=
) (#927)
- Rate Limiting (429 Error code) handling/support (#901)
- All notifications now no longer require a
body
if at least 1attachment
was provided. This expands the use of Apprise to not constrict you to always include abody
when the only intent you had was to post an attachment.-
# For the CLI you are still required to set the `--body` to "", but this no longer # generates an error apprise --attach="/path/to/attachment.zip --body ""
-
Apprise.details()
improvements- Added Matrix Attachment Support (#921)
- Support for Serialization via Pickle Library added. (#929)
# as an example ... import apprise import pickle # Instantiate our object apobj = apprise.Apprise() # Add our URLs apobj.add("json://localhost") apobj.add("xml://localhost") apobj.add("form://localhost") apobj.add("mailto://user:pass@localhost") # Now serialize our object for any purpose serialized = pickle.dumps(apobj) # do what you will; write this to disk, send it to a remote # server, etc. # We can re-load our serialized content and turn it back into # and object like so: apobj_n2 = pickle.loads(serialized)
❤️ Life-Cycle Support
- Python 3.11
getdefaultlocale()
deprecation warnings now handled (#754) - Gitter support removed as it is now leveraging Matrix which Apprise already supports. (#924)
🐛 Bugfixes
- Reddit RateLimit variables should be unique per instance (d7a5a60)
placed in the Title/Subject of some notifications; this has now been fixed. (#914)gettext()
no longer installs_
into the global namespace, but instead keeps the_
at anapprise
module scope. (#821)
Installation Instructions
Apprise is available on PyPI through pip:
# Install Apprise v1.5.0 from PyPI
pip install apprise==1.5.0