An occasional annoyance with Thunderbird, especially when I travel, is that it gets constipated when the network status changes and won’t send mail. I always send messages in the background with mailnews.sendInBackground = true
so they are expected to queue in the local cache file for a bit while I continue productive work and TB does the send negotiation processes in the background without locking me out. Most of the time this works fine but occasionally it hangs and that can be problematic when mail I expected to go out never left my inbox and there’s no notification in TB that the inbox is backed up. Worse, people’s mail clients sort this delayed mail weirdly depending on their local preferences and it may effectively be lost and suddenly everyone seems to be ignoring me, more than usual.
So i wrote a wee python script that will check the Unsent Messages
file location and if the file there is larger than a specific size (1 Byte), it sends a message to the desktop using notify-send
.
Calling the script from cron
every 10 minutes or so uses just 4 msec of CPU according to time
, not much of a hit.
You need to know where your local Unsent Messages file is, which TB can tell you if you right click on the Local Folders Outbox and select properties. This path goes into the variable file_name ="..."
and you could change the max_size = int(x)
to be a larger value than 1 if that’s useful.
The code to make this work is pretty simple, just:
#!/usr/bin/env python3 import os import subprocess # environnement vars os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority') os.environ.setdefault('DISPLAY', ':0.0') ############################################################### # Enter reasonable values for the Local Folders Outbox which is # usually in ~/user/.thunderbird/id.user/Mail/Local Folders/Unsent Messages # and some test file size in bytes, e.g. 1 ############################################################### file_name = "/home/gessel/.thunderbird/idstring.gessel/Mail/Local Folders/Unsent Messages" max_size = int(1) def check_file_size(file_name, max_size): """Check if a file is larger than a specific size. Args: file_name: The name of the file to check. max_size: The maximum size of the file, in bytes. Returns: True if the file is larger than max_size, False otherwise. """ file_size = os.path.getsize(file_name) return file_size > max_size def send_notification(message): """Send a notification via notify-send. Args: message: The message to send. """ subprocess.Popen(["notify-send", message]) # Check if the file is larger than the maximum size. if check_file_size(file_name, max_size): # Send a notification. message = "Check for constipated mail, the outbox is larger than {} bytes.".format(max_size) send_notification(message)
If the test is triggered, you should get a desktop alert:
Then I created a crontab entry like:
*/10 * * * * /home/gessel/projects/checkoutbox/checkoutbox.py
That’s it. You can test it if want to make sure it will do the right thing by pointing it intentionally at a larger than 0 byte file, assuming your Unsent Messages
file is properly 0 bytes most of the time.
I hope you find this useful; please note the usual terms.
Leave a Reply
You must be logged in to post a comment.