SpamSieve 3.0.4 is a maintenance release for my Mac e-mail spam filter.
In sending out the update notice to the SpamSieve mailing list, Amazon SES reported a huge number of bounces (almost 10x the normal percentage), primarily from EarthLink/MindSpring addresses. It’s not clear what’s going on here, but I suspect that the addresses are not all suddenly bad. Unfortunately, Sendy seems to want to permanently disable them.
Some interesting bugs were:
Sometimes SpamSieve would send an AppleScript command to Apple Mail but never receive a response. Sampling the process would show that Mail was not busy formulating a reply; it simply seemed to drop the request. I’m not exactly sure what causes this—perhaps Mail being overloaded—but I’ve made lots of changes so that SpamSieve can better handle this situation. We don’t want to just repeatedly wait for a long timeout.
There was a related issue, worked around in a previous version, where Mail could take a really long time to read or download a message, and SpamSieve would try to detect this and throttle requests. However, the workaround had a bug where, if the user put the Mac to sleep in the middle of a request, that would mess up SpamSieve’s estimate of the throughput.
A damaged database may open and fetch without error but then fail to save. SpamSieve tries to handle save errors by either recovering or (as in the case of corruption or a disk error) rolling back. The most important thing is to avoid growing an unbounded graph of objects in memory. This didn’t always work properly because I had failed to account for the fact that Core Data errors may have NSSQLiteErrorDomain
. I had expected that such errors would only occur as underlying errors inside of a CocoaError
.
Some Apple Mail operations could be unnecessarily slow or even crash because my AppleScript had a typo inside of a try/end
block. The intent was to just suppress any error (since it was in debug code). Unfortunately, the typo meant that an error was generated every time through this code path. The error was related to referencing a selected message in Mail, so if many messages were selected, AppleScript would generate an error message that included a giant string like item 1 of {long list of references to messages, each with the mailbox and account name}
even though this was never caught or displayed. This would take a long time and, I think, potentially cause a crash.
_PFBatchFaultingArray
is a leaky abstraction that will raise an exception (not catchable in Swift) if it’s accessed after the persistent store is shut down. I think I fixed the order of cleanup to prevent this and also made sure that all accesses to such arrays go through an Objective-C category that catches exceptions.
I wasn’t able to fully isolate the problem, but NSRegularExpression
sometimes raises an exception (not catchable in Swift) about an invalid range when using a range created by NSRange(swiftRange, in: swiftString)
. It works better to to avoid Swift ranges entirely and use NSRange
and the associated NSString
methods when using Swift strings with NSRegularExpression
.
Previously:
Update (2024-05-22): I found that the bounced addresses were mostly ones that were added a long time ago, and after sending test messages to a sample of them I got no replies and lots of bounces. So I think they really are invalid, though it remains a mystery why they were all reported as such now, rather than with previous messages. Thanks to Ben at Sendy for for explaining that it’s possible to remove the bounce status in Sendy by deleting the addresses and reimporting them. It’s also possible to use Amazon SES’s suppression list to tell it to try certain addresses again, though this can be risky for your account if they really are bad. SES’s SMTP server is, of course, no good for manual testing because it will silently skip sending the message to addresses that are already on its global suppression list.
Amazon SES Apple Mail AppleScript Cocoa Core Data Database Mac Mac App macOS 14 Sonoma Mailing Lists Programming Sendy Sleep Mode SpamSieve SQLite Swift Programming Language
Bare Bones Software:
“ChatGPT Worksheets” are branching out; the renamed “AI Chat Worksheet” preferences provide settings to select alternative services. Included with the application are service models for ChatGPT, Claude, and Ollama.
[…]
Added a “Decompose Unicode” transformation.
Added a setting to the “Expert” settings panel list so that it only shows values that have been changed from their factory defaults.
[…]
BBEdit will now try to automatically guess JSON, so that if you paste some into an untitled document, you won’t have to remember to manually set the language if you want to use “Reformat Document” to pretty-print it.
I guess it’s time to retire my script for that.
Previously:
Artificial Intelligence BBEdit ChatGPT JSON Mac Mac App macOS 14 Sonoma Programming Text Editor Unicode
Bruno Brito:
In Tower, you can create a Commit Template from scratch easily by clicking the “+” button and filling out the “Template name”, “Commit Subject”, and “Detailed Description” fields. If you already have a preferred Commit Template file that you would like to use, you can also easily import the file by clicking the designated “Import” button.
[…]
When writing a commit message, click the “Commit template” button located next to the character counter. This button enables you to select the commit template you’d like to use.
You can also perform this action without switching away from the keyboard. Simply type t: or / in the “Commit Subject” field to open the list of available templates.
Jonas Treub:
Love the new
@gittower
icon. Brings some much needed character to the toolbar. And there is a fun dark mode version.
Version 11.1:
Commit Templates: A new preference setting allows you to hide the templates button in the commit subject field.
Previously:
Developer Tool Git Git Tower Icons Mac Mac App macOS 14 Sonoma Programming
Bombich Software:
CCC 7 focuses on helping you build a better backup strategy. Up to now we’ve given you the tools for creating backups, and of course CCC offered some coaching suggestions in the past, but largely has left the user to deal with some logistics that could be difficult for some people. CCC 7 introduces functionality that will not only tell you how to set up your backup correctly, but will do the more complicated parts for you.
As with many other apps recently, the price has increased: from $40 to $50. The flat $25 upgrade fee remains a bargain compared with the typical subscription I see.
Mike Bombich:
With just a couple clicks, you can get your new backup disk reformatted using the best filesystem for backups. The Setup Assistant works with existing backups too.
Disk Utility is a pain these days, so the less I need to rely on it the better. The CCC assistant also identified a few older backups that I had forgotten to update to APFS. It’s described more in the release notes.
CCC 7 introduces permanent snapshots, which not only allow you to add that context to a snapshot, but also allow you to flag it for permanent retention. We also added controls that allow you to limit total snapshot disk usage and maximum age so that multiple volumes on a given disk can share space more democratically.
There’s an interesting feature called the Snapshot Thinning Simulator, which lets you see which future snapshots will be retained.
The Snapshot Browser will compare the content of each snapshot against the current state of the backup. Enter a search term in the sidebar to find specific files in any of the snapshots, then see how the file differs in each snapshot.
[…]
Want to bring backups of files and photos from your iOS devices into your CCC backup ecosystem? Now you can! The CCC Dashboard includes a new CCC Diplomat tab where you can designate a volume for your mobile device backups. The Diplomat advertises a service on your local network to iOS devices that are running the CCC Mobile companion application.
I’m pleased to see this, since I think iOS needs more backup options, but I probably won’t use it at this time. The initial release is limited in that you can only do one backup (photos or a single folder) at a time, and there are no filtering options like with the Mac app. iOS doesn’t have a root folder, so each provider or app’s data would need to be done separately, selecting a different destination folder each time (which means enabling the menu bar icon). It backs up the data that’s on the phone without downloading cloud photos or files that are not resident. (The press release notes that the Mac version can do this, though it was added in a previous version.)
But the main problems are due to iOS limitations. Backups can take a long time, but you can’t schedule them to run unattended, and you have to keep the iOS app frontmost for the duration. What I really want is to be able to back up and restore data from individual apps, but most of my iOS apps store their files outside of the shared area that CCC and other apps can access. The bulk of the files that are accessible are in iCloud Photo Library or iCloud Drive, which I can already access and back up from my Mac. Still, I could see this being useful for people with more iOS-centric workflows who can’t keep everything in the cloud. The destination can also be an external drive or server if you don’t have your Mac with you. The iOS app costs $2.99 per destination type.
CCC’s next-generation file copier retains folder inode information, so now we can detect renamed folders and simply rename those folders on your APFS-formatted destination.
[…]
If snapshot support is enabled on your source volume, CCC will now create a snapshot on the source at the scheduled run time even if the destination is absent. CCC gives you complete control over these “local backups” – you can determine if snapshots should be kept on the source, and you can fine tune exactly how long they’re kept and how much space they’re allowed to consume.
This is great since local Time Machine is not really predictable enough to depend on.
Previously:
Apple File System (APFS) Backup Carbon Copy Cloner FileVault iOS iOS 17 iOS App iOS Multitasking Mac Mac App macOS 14 Sonoma