According to Remove List-Unsubscribe Header:
The SparkPost API Transmissions endpoint allows you to mark an email as transactional with the attribute options.transactional.
Here it is in their Transmissions API Reference. Obviously this is SparkPost’s API, I’m not sure how the field appears on the actual outgoing email header.
Okay so I checked their template editor and you can send test emails marked as both Transactional or not. So I sent myself one of each. Compared the headers in Beyond Compare.
Only real differences are in DKIM-Signature, X-MSFBL, and List-Unsubscribe. (This points out that the List-Unsubscribe value is a part of the DKIM-Signature, so that explains that.)
After poking around a bit I found an online (because lazy) Base64 decoder that was robust enough to let me view X-MSFBL and List-Unsubscribe.
X-MSFBL contains the following fields:
b, customer_id, friendly_from, g, ip_pool, ip_pool_raw, message_id, r, rcpt_meta, rcpt_tags, sending_ip, subaccount_id, template_id, template_version, tenant_id, transmission_id
List-Unsubscribe contains the following fields:
customer_id, friendly_from, ip_pool, ip_pool_raw, mailfrom, message_id, rcpt_meta, rcpt_tags, rcpt_to, sending_ip, subaccount_id, template_id, template_version, tenant_id, transmission_id
Same fields have the same values between them.
Anyway the important bit, I compared both X-MSFBL and List-Unsubcribe between the transactional and non-transactional emails and found… ! Essentially nothing. The only differences are sending IPs (meaningless)
transmission_id. (Oh and
template_version… it has the name of my test template from SparkPost dashboard and version 1 happens to be transactional, version 2 non-transactional, so that bit was accurately reflected.)
The beginning of X-MSFBL and List-Unsubscribe had some short data I couldn’t base64 decode… so that’s an unknown.
But basically looks like there isn’t any sort of obvious marker in the email header itself that could maybe be used to signal SparkPost. Bummer. Obviously their API just does what was specified and has no reason to put anything in there since that would be after-the-fact… I think… brain hurting.