It happened after a recent upgrade to 5.27+, using Drupal 8.
I notice this: https://github.com/civicrm/civicrm-core/pull/17312 added some nice new callbacks, but since it didn't actually remove the old ones, I suspect this is only affecting Drupal 8 installs that don't have the extern/ directory working.
The key is that these emails are going out with the following at the end of the html:
<img src="https://blackflysolutions.ca/libraries/civicrm/core/extern/open.php?q=12345" width='1' height='1' alt='' border='0'>
In other words - the new callback is not being used when generating the civimail.
After more digging, I found this:
Conclusion: update your flexmailer to "master" until there's a new release.
Also: upgrading civicrm to 5.29.1 also fixes it - that release pulls in a new flexmailer.