Skip to content

Releases: caronc/apprise

Apprise Release v0.8.8

02 Sep 12:00
Compare
Choose a tag to compare

Details

📣 New Notification Services:

  • n/a

💡 Features

  • ⭐ Message notifications are now asynchronous for Python 3 users! (#273) 🚀
    • CLI user can set --disable-async or -Da on the command line to disable this and go back to the legacy synchronous method which much slower when dealing with more then one notification.
    • Developers can set AppriseAsset(async_mode=False) before passing the asset into the Apprise() object to disable this.
  • ⭐ Configuration files can now contain the keyword include allowing further (Apprise) configuration files to be parsed. (#226) 🚀
    • text base example:
      include http://localhost/path/to/more/configuration/entries
      # No limit to the number of includes you specify
      include file:///path/to/another/configuration/file/on/your/system
    • yaml base example:
      include:
          - http://localhost/path/to/more/configuration/entries
            # No limit to the number of includes you specify
          - file:///path/to/another/configuration/file/on/your/system
    • The following restrictions apply to the new include value:
      1. Developers: By default include entries are disabled unless the developer sets recursion to a value greater than it's default of zero (0) when initializing a AppriseConfig() object. e.g: AppriseConfig(recursion=1). A value of 1 allows 1 level of includes to work. However, if the configuration include also contains an include statement, it would be ignored. You can increase the level of recursion to whatever you wish.
      2. CLI: The apprise tool by default has a recursion of one (1) allowing one level of include statements to be executed. This can be altered by setting the --recursion-depth=<value> (-R <value>) switch.
      3. include statements have restrictions on the content being included. For example, a file:// can include another file://. But a http:// can not include a file://. A file:// can however include a http://. All of this has been put in place for security reasons. A server hosting Apprise through a website by default will never allow a user to include local files into the configuration. Developers can disable this feature by setting insecure_includes to True when initializing a AppriseConfig() object. e.g: AppriseConfig(recursion=1, insecure_includes=True).
  • Advance Email Parsing added (#276)! All notification services that take email addresses as input can now support the (additional) formats:
    • Full Name user@domain.com
    • Full Name: user@domain.com
    • Full Name <user@domain.com>
    • Full Name : <user@domain.com>

      Services that can utilize the Full Name will make it part of the To or Cc delivery if specified (accompanied with the email it's associated with).
  • Added a /bin directory to repository which just contains a few test tools that make it easier to test the code in development.
    • ⚙️ apprise: a way of executing the code straight after pulling down the source code. This really helps in testing new features being developed right within the very branch you're working in.
    • ⚙️ test.sh: a simple script you can use to run the unit tests and/or even a very specific one (or set of them).
    • ⚙️ checkdone.sh: a simple script that runs a few checks against the entire code checked out to verify if there are any errors (instead of waiting for the Travis-Ci to inevitably catch them)
  • Lametric Time now supports an icon= URL argument so that you can over-ride the default icon assigned and instead choose from any of the ones provided on their website here.

❤️ Life-Cycle Support

  • Removed deprecated code along with their paired notices that have been all lingering for more than a year now (#283)

🐛 Bugfixes

  • Reverse URL broke in previous release (v0.8.7); this bug was fixed restoring the correct functionality of Apprise.url() (#275)

Installation Instructions

Apprise is available on PyPI through pip:

# Install Apprise v0.8.8 from PyPI
pip install apprise==0.8.8

Release v1.7.2

27 Jan 21:01
Compare
Choose a tag to compare

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 features split and truncate (#1035 & #1038)

❤️ Life-Cycle Support

  • Python 3.12 Support (#1031)
  • Removed Spontit (upstream no longer in service) (#1034)

🐛 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

28 Dec 19:43
Compare
Choose a tag to compare

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

28 Dec 01:49
Compare
Choose a tag to compare

Details

📣 New Notification Services:

💡 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:
      1. 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"
      2. 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 the emojis=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.
  • 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}/
  • Discord (discord://) support for user and role 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

❤️ Life-Cycle Support

🐛 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

15 Oct 20:11
Compare
Choose a tag to compare

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 with username2. 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 both tag1, tag2, and tag4:

      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 to tweet:// and twitter:// 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

27 Aug 17:21
Compare
Choose a tag to compare

Details

📣 New Notification Services:

💡 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 the embed part of the API and turn your title into a hyperlink to the specified location. You can also use url= (as an alias to href=) (#927)
  • All notifications now no longer require a body if at least 1 attachment was provided. This expands the use of Apprise to not constrict you to always include a body 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
    • consistency (#919)
    • attachment_support variable added (#916)
  • 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

🐛 Bugfixes

  • Reddit RateLimit variables should be unique per instance (d7a5a60)
  • &nbsp; 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 an apprise 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

Release v1.4.5

07 Jul 00:35
Compare
Choose a tag to compare

Details

📣 New Notification Services:

💡 Features

  • Custom sound effects now supported by Pushover (pover://) (#843)
  • Ntfy plugin (ntfy://) now correctly displays attached images inline (#892)
  • Telegram attachments can now optionally be displayed before or after the provided text/body.

❤️ Life-Cycle Support

  • Use UTC Aware Timezones throughout code to eliminate (Naive Time Based) deprecation warnings for Python v3.12

🐛 Bugfixes

  • Matrix (matrix://) bugfix with the internal URL generation when a port is not provided. (#900)
  • Telegram (tgram://) correctly places attachments in thread when specified (#893)

Installation Instructions

Apprise is available on PyPI through pip:

# Install Apprise v1.4.5 from PyPI
pip install apprise==1.4.5

Release v1.4.0

15 May 20:53
Compare
Choose a tag to compare

Details

💡 Features

  • Apprise API apprise:// attachment support added! 🚀 . (#873 and #877)
    • That's right, if you have an Apprise API instance running, you can now post attachments to it and it will store them and relay them along to the endpoints that support it.
      apprise -vv -b "Test" "apprise://localhost/config_id" \
         --attach=/path/to/something.jpeg
  • Support custom field mappings for JSON, FORM and XML Services (#842)
    • Up until now you could leverage :value=key and add data into the payload of the custom supported Apprise endpoints (JSON, FORM and XML). But now you can change the mapping of the fixed ones that were always present. Hence :message=body would cause the payload to no longer put the message passed by apprise in the hard-coded message field. In this example, the payload would appear under a new tag called body.

      You can also set the values to be empty if you want to strip them from the payload. For example :version= would eliminate the version (previously hard-coded) payload element from the response.
  • Apprise CLI Global Configuration Added (#875)
    -/etc/apprise among other paths added to the default search for configuration files when the apprise CLI tool is used.
  • Telegram tgram:// Topic ID Support Added (#854)
  • Better slack:// Channel Support (#856)
    • Supports <!channel|desc> & <!channel>

❤️ Life-Cycle Support

  • Return target count from len(Service) calls #874
    • This under-the-hood fix is just good for developers who wish to see how many targets (or endpoints) have been associated with one Apprise URL.
  • More async re-factoring improvements; the overhead of creating a thread-pool is now bypassed if it is detected that only one (1) notification is required to be sent. (#846)

🐛 Bugfixes

  • Windows notifications: Correct WM_DESTROY return value (#863)
  • Custom Plugins (.py files hand-written) handling improvements. No longer is every file found interpreted. It must be a .py file (#853)

Installation Instructions

Apprise is available on PyPI through pip:

# Install Apprise v1.4.0 from PyPI
pip install apprise==1.4.0

Release v1.3.0

22 Feb 22:44
Compare
Choose a tag to compare

Details

📣 New Notification Services:

💡 Features

  • ntfy:// added support for Icons now.
    • In addition to this, one can specify avatar_url= keyword argument to point to their own custom one (#822)
  • ntfy:// support for Authentication Tokens (in addition to user/pass) (#830)
  • form// has a new parameter called attach-as which allows you to over-ride the meta field id (such as file01, file02, etc) assigned to files (attachments) in the payload. (#827)
    • Some servers expect the post to come as meta01, or document, etc. Setting this value does not have any impact until 1 or more attachments are also part of the payload.
    • Simply set this ?attach-as=document, or ?attach-as=meta*. the * allows for support of multiple files. Apprise will spit out a warning if you don't provide a * when over-riding this AND you send more then 1 attachment up.

❤️ Life-Cycle Support

  • License change to BSD 3 Clause. (#813)
    • ☝️ Know that Apprise will always remain open source!
  • Matrix messages soft limit increased from 1000 to 65000 as identified in spec (58f9e64)
  • Massive re-factoring of the async section of the Apprise code. (#817) - Thank you @YoRyan 🚀
    • This could show up as a breaking change for some people who leveraged async_notify() in the past. Please read below.
  • Pushover soft limit increased to 1024 characters (#820)
  • Cisco webex:// updated to support the new API servers used by them (#815)

The async Re-factoring

The async_notify() handling was completely re-factored in this release. The changes properly implement the function as how it was intended to work. Previously the design was arranged in such a way to remain backwards compatible with Python v2.

After this release the following works for those who want to leverage it:

from apprise import Apprise

async my_async_function():

    # Now you can use the async_notify() call
    await apobj.async_notify(
        body='what a great notification service!',
        title='my notification title',
    )

Note: There is no breaking change to those using the notify() call however the the asynchronous handling was changed beneath it.

🐛 Bugfixes

  • mqtt:// unsigned certificates can skip their verification if the user chooses to verify=No to behave like other services (#825)
  • Added missing dependency python3-certifi to Apprise RPM (093cc27)
  • form:// now no longer throws an exception when an attachment is provided (#826)

Installation Instructions

Apprise is available on PyPI through pip:

# Install Apprise v1.3.0 from PyPI
pip install apprise==1.3.0

Release v1.2.1

28 Dec 14:59
Compare
Choose a tag to compare

Details

This release just includes some minor enhancements and bug-fixes to bundle that accumulated since v1.2.0.

📣 New Notification Services:

n/a

💡 Features

  • macosx:// added support for click= keyword argument to support hyperlinks (#789)
    • this is a wrapper to -open in the terminal-notifier underlining tool
  • mailto:// better handling of emails that contain a + in their username (#779)

❤️ Life-Cycle Support

  • mailto:// re-factored bulk email transfers to re-use already open connection ( #774) - thanks @amotl
  • GitHub Workflow and Environment/Testing improvements (#728, #771, #783) - thanks @amotl
  • Complete rewrite of D7 Networks (d7sms:// ) to support its new API (not backwards compatible with previous) (#791)

🐛 Bugfixes

  • slack:// correctly returns success message when applicable (#777)
  • TEXT Configuration parsing improved for better tag/URL distinction (#768)

Installation Instructions

Apprise is available on PyPI through pip:

# Install Apprise v1.2.1 from PyPI
pip install apprise==1.2.1