<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Blog &#8211; Word to the Wise</title>
	<atom:link href="https://wordtothewise.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://wordtothewise.com</link>
	<description>We make email better.</description>
	<lastBuildDate>Wed, 02 Apr 2025 10:27:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://wordtothewise.com/wp-content/uploads/2023/10/cropped-wttw-w-512-1-32x32.png</url>
	<title>Blog &#8211; Word to the Wise</title>
	<link>https://wordtothewise.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">68728417</site>	<item>
		<title>Deliverability Summit Amsterdam</title>
		<link>https://wordtothewise.com/2025/04/deliverability-summit-amsterdam/</link>
					<comments>https://wordtothewise.com/2025/04/deliverability-summit-amsterdam/#respond</comments>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 02 Apr 2025 10:27:09 +0000</pubDate>
				<category><![CDATA[Industry]]></category>
		<category><![CDATA[amsterdam]]></category>
		<category><![CDATA[deliverability summit]]></category>
		<category><![CDATA[events]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17152</guid>

					<description><![CDATA[We&#8217;ll be speaking at the Deliverability Summit in Amsterdam on April 24th and 25th. If you have your tickets, come say hi! If you don&#8217;t have tickets yet there are still a few in-person tickets available, as well as on-line access.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="450" height="137" src="https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-450x137.png" alt="" class="wp-image-17153" srcset="https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-450x137.png 450w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-300x91.png 300w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-150x46.png 150w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-768x234.png 768w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-720x219.png 720w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-580x177.png 580w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1-320x98.png 320w, https://wordtothewise.com/wp-content/uploads/2025/04/LOGO-DS-e1665544286633-1-1.png 1050w" sizes="(max-width: 450px) 100vw, 450px" /></figure>



<p>We&#8217;ll be speaking at the <a href="https://deliverabilitysummit.com" data-type="link" data-id="https://deliverabilitysummit.com">Deliverability Summit in Amsterdam</a> on April 24th and 25th.</p>



<p>If you have your tickets, come say hi!</p>



<p>If you don&#8217;t have tickets yet there are still a few in-person tickets available, as well as on-line access.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/04/deliverability-summit-amsterdam/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17152</post-id>	</item>
		<item>
		<title>Google and Alignment Update</title>
		<link>https://wordtothewise.com/2025/03/google-and-alignment-update/</link>
					<comments>https://wordtothewise.com/2025/03/google-and-alignment-update/#respond</comments>
		
		<dc:creator><![CDATA[laura]]></dc:creator>
		<pubDate>Fri, 28 Mar 2025 15:30:43 +0000</pubDate>
				<category><![CDATA[Industry]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[dmarc]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[headers]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17148</guid>

					<description><![CDATA[Earlier this month, I published a post about some changes with how Google is displaying information related to authentication in their &#8220;View Original&#8221; page. There&#8217;s one condition I apparently didn&#8217;t report and it brought up a question earlier today. If a message has alignment between DKIM and the 5322.from address but there is no DMARC [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Earlier this month, I published a post about some changes with how G<a href="https://wordtothewise.com/2025/03/google-alignment-and-dmarc/" data-type="post" data-id="17124">oogle is displaying information related to authentication</a> in their &#8220;View Original&#8221; page. There&#8217;s one condition I apparently didn&#8217;t report and it brought up a question earlier today.</p>



<p>If a message has alignment between DKIM and the 5322.from address but there is no DMARC record for that domain published in DNS, Google gives a warning that the domain doesn&#8217;t align.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1668" height="334" src="https://wordtothewise.com/wp-content/uploads/2025/03/image-4.png" alt="A screenshot from &quot;Show Original&quot; at google that says:

SPF: Pass with IP 2a00:1098:88:f6:0:0:0:1

DKIM: 'Pass: with domain blighty.com

Alignment: The From header Laura Atkins <laura@blighty.com&gt; does not match the DKIM domain blighty.com. Be careful with this message as the sender may be spoofing the From header identity. " class="wp-image-17149" srcset="https://wordtothewise.com/wp-content/uploads/2025/03/image-4.png 1668w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-300x60.png 300w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-450x90.png 450w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-150x30.png 150w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-768x154.png 768w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-1536x308.png 1536w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-720x144.png 720w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-580x116.png 580w, https://wordtothewise.com/wp-content/uploads/2025/03/image-4-320x64.png 320w" sizes="(max-width: 1668px) 100vw, 1668px" /></figure>



<p>Clearly the domains do match and the message is aligned. However, there is no DMARC record published for blighty.com. </p>



<p>My speculation is that the alignment message is generated from the Authentication-Results header.  When you pull up &#8220;show original&#8221; google grovels through the &#8220;Authentication-Results&#8221; header to populate all of the special fields. If there is a DMARC=pass stamped in that header field Google reports &#8220;Pass&#8221;.  If there&#8217;s not a DMARC=pass in the header field, Google looks for the DKIM d= value and the From header and puts those tokens into the Alignment message. </p>



<p>What appears to be happening here is that Google only reports alignment in the Authentication-Results header if there is DMARC record published in DNS. If there is no record, they don&#8217;t report DMARC=Pass and therefore the default Alignment message shows up with the domain names. </p>



<p>We can look at the raw headers and see all of this happening in the messages &#8211; ones with the incorrect Alignment message don&#8217;t have a DMARC=pass stamped in the headers. </p>



<p>I kinda want to talk about how Google isn&#8217;t using SPF here but every time I start that paragraph my science brain kicks in and goes &#8220;but you need to test that first&#8221;. Right now we can say that our tests show that a SPF pass with DKIM unaligned (but passing) is enough to get &#8220;Alignment=Pass&#8221; if you have a DMARC record but not if you don&#8217;t.  I can&#8217;t help wondering if you get a DMARC=pass with DKIM but not SPF if you still get a warning. I don&#8217;t easily have a way to send mail that fails SPF but passes DKIM so I can&#8217;t do the tests I want, nor am I sure if I could that it would give us more insight into Google&#8217;s inner workings.</p>



<p>I can say I&#8217;m extremely pleased that our brand new mailserver in IPv6 space is successfully sending mail to Google and reaching the inbox even after just a few messages. It&#8217;s nice to know small mailservers can still work for small senders without a penalty from the big mailbox providers. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/03/google-and-alignment-update/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17148</post-id>	</item>
		<item>
		<title>What Spamtraps Tell Us</title>
		<link>https://wordtothewise.com/2025/03/what-spamtraps-tell-us/</link>
					<comments>https://wordtothewise.com/2025/03/what-spamtraps-tell-us/#respond</comments>
		
		<dc:creator><![CDATA[laura]]></dc:creator>
		<pubDate>Fri, 14 Mar 2025 16:42:40 +0000</pubDate>
				<category><![CDATA[Industry]]></category>
		<category><![CDATA[blocklists]]></category>
		<category><![CDATA[data hygiene]]></category>
		<category><![CDATA[inboxing]]></category>
		<category><![CDATA[spamtraps]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17142</guid>

					<description><![CDATA[Many blocklists use spamtraps to detect poor sending practices and will cite spamtrap hits as the reason for the blocks. Senders legitimately fear spamtraps showing up on their lists because of this. If spamtraps weren&#8217;t used by blocklists no one would really care about them. They&#8217;re just another kind of bad address. Yesterday I answered [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Many blocklists use spamtraps to detect poor sending practices and will cite spamtrap hits as the reason for the blocks. Senders legitimately fear spamtraps showing up on their lists because of this. If spamtraps weren&#8217;t used by blocklists no one would really care about them. They&#8217;re just another kind of bad address. </p>



<p>Yesterday I answered a question about whether or not <a href="https://wordtothewise.com/2025/03/do-spamtraps-exist/" data-type="post" data-id="17118">spamtraps existed</a>. My answer was that they do exist in the sense that they&#8217;re real email addresses but that they don&#8217;t exist in that they&#8217;re not used by individual people. </p>



<p>Overall, they&#8217;re real email addresses that are not read like normal mail. They&#8217;re simply used as an indicator of whether or not a sender is really sending permission based mail. The interesting thing about spamtraps is the type of trap can tell the trap owner a lot about what poor mailing practices. They can also tell the sender about where the problems in their data collection process lie. </p>



<h2 class="wp-block-heading">Different Kinds of Spamtraps</h2>



<p>In 2011, I wrote a post called &#8220;<a href="https://wordtothewise.com/2011/08/a-brief-guide-to-spamtraps/?utm_source=wttw" data-type="post" data-id="3252">A Brief Guide to Spamtraps</a>&#8221; where I talked about a bunch of categories of spamtraps. In the time since I wrote that, a few other terms and types of spamtraps have entered into the public lexicon. I&#8217;m talking, of course, of Pristine, Recycled and Typo traps. </p>



<h3 class="wp-block-heading">Pristine Traps</h3>



<p>Pristine traps are addresses that have never existed. Usually they&#8217;re at domains that have never existed for email either. We have a couple domains here that we don&#8217;t use for mail, but if we were to start accepting mail to those domains, they&#8217;d be pristine traps. </p>



<p>These traps generally only get on lists because addresses are being created by someone. They simply are not addresses anyone would use. One example is the &#8220;cold-outreach&#8221; sender who sends to laura-atkins@. That&#8217;s a pristine trap, the spam was the first message that address ever received. Now, did the spammer make it up? I actually think so because it gets no other spam, but these addresses can also be purchased.</p>



<p>Pristine traps tell the trap owner that the sender is making up addresses or buying them from a list seller that is making up the addresses. Overall, pristine traps are a sign that the sender is not building their list through opt-in processes. </p>



<h3 class="wp-block-heading">Recycled Traps</h3>



<p>Recycled traps are domains or email addresses that received legitimate mail at one point, but were decommissioned, allowed to bounce for a minimum of 12 months and then reopened. </p>



<p>Mails to these traps most likely indicates that the sender is either not properly bounce handling or they found an old list and started mailing to it. Recycled traps can also show up in purchased lists. Overall, though, we treat recycled traps as a sign of poor list hygiene. </p>



<h3 class="wp-block-heading">Typo Traps</h3>



<p>Typos happen whenever someone inputs what they intend to be their own email address but mess it up somehow and typo the address. Most of the time when we&#8217;re talking about typo traps, we&#8217;re talking about typos on the domain side of the email address. Over the years security and anti-spam organizations have bought some of these domains and turned them into spamtraps. </p>



<p>The term typo trap is a descriptor many of us use to indicate that we think, for the most part, a particular sender is only collecting email addresses through opt in forms. The problem is, the sender is trying to be opt-in, but they&#8217;re not taking care to verify the data is correct. </p>



<h2 class="wp-block-heading">Spamtraps Are a Signal</h2>



<p>Over the past 20 some odd years I&#8217;ve dealt with a lot of folks who come to me wanting help fixing their spamtrap problem. Just to be clear, spamtraps are NOT the problem; they&#8217;re a signal. Spamtraps tell us that there are problems with something about our data. No one really cares if email addresses that don&#8217;t belong to people get mail. But what they do care about is the fact that if your list processes allow spamtraps on the list, it&#8217;s likely you&#8217;re also sending mail to actual people who don&#8217;t want it. </p>



<p>Now that we know what spamtraps tell us, let&#8217;s talk about how to deal with them, particularly when they&#8217;re resulting in problems with your email sending.</p>



<h2 class="wp-block-heading">Dealing with Spamtraps</h2>



<p>In my line of work, so many clients come to me and part of their opening brief is &#8220;we want to remove spamtraps from our list.&#8221; I reframe that as &#8220;removing non-opt-in addresses off the list&#8221; and make sure that we&#8217;re clear I don&#8217;t have a list of spamtrap domains to simply remove. What I&#8217;m doing here is actually working out why there are non-opt-in addresses on a list and fixing that so that they&#8217;re no longer on the list, whether they&#8217;re spamtraps or not.</p>



<p>Here&#8217;s an abbreviated summary of my process.</p>



<ul class="wp-block-list">
<li>Identify what type of bad addresses are on the list. 
<ul class="wp-block-list">
<li>I use a variety of means to do this. We have some internal tools, some ESPs and clients have access to public spamtrap data, and often Spamhaus will give me information about the type of trap involved. </li>



<li>Pristine traps suggest a purchased list</li>



<li>Recycled traps suggest a reactivation of old addresses</li>



<li>Typo traps suggest a problem with data entry on a website</li>
</ul>
</li>



<li>Implement changes to address that problem
<ul class="wp-block-list">
<li>Purchased addresses &#8211; 
<ul class="wp-block-list">
<li>Does anyone know when they were purchased? If not, are there indications in data patterns that indicate when the purchase was added to the list? </li>



<li>If we can identify when the purchase happened, the simplest thing to do is just remove the purchased addresses. For some clients, they&#8217;re unwilling to give up data, so we see how we can address those concerns. For instance, we can treat a purchase as an implicit opt-in and keep those addresses. Or we can send a confirmation emails to some or all of the purchased emails. In any case, the goal here is to remove addresses of people who never asked for and who don&#8217;t want mail from the client. </li>



<li>The next step is to look at who at the company decided to buy a list and work out how to stop this from happening in the future. </li>
</ul>
</li>



<li>Reactivate old addresses 
<ul class="wp-block-list">
<li>Why were the addresses reactivated? Who authorized this? Who did the work internally to do this? Can we deactivate those addresses and remove them from future sends? Did someone actively decide this was a good idea or was there an oops with the database?</li>



<li>Once we&#8217;ve identified the how and why, I work with the client to find ways to stop this from happening in the future. This should never happen accidentally, so what technical changes will stop that from occurring again? If it was an internal decision, what was the thought process? Does there need to be additional training or some approval process to ensure this doesn&#8217;t happen for the wrong reasons. And, yes, there are good reasons to reactivate addresses (not many, but a few) and so that should be documented and it should be a responsibility belonging to someone at the client. </li>
</ul>
</li>



<li>Data entry on the website. 
<ul class="wp-block-list">
<li>Identify if the addresses are accidentally being subscribed, through some sort of Non-Human Interaction (NHI) or if people are giving bad data during the signup process. </li>



<li>There&#8217;s no one way to mitigate NHI or bots on the website. Al Iverson wrote a good blog post on this recently and I suggest checking out his post <a href="https://www.spamresource.com/2025/03/signup-best-practices-banning-bots-and.html">Signup Best Practices: Banning Bots and NHI</a> recently and it covers the steps in more detail than I can on this post which is already too long.</li>



<li>If the issue is people deliberately giving fake or false addresses, then we start to ask why? What makes users distrust the sender so much?  The next set of questions is what can we do to mitigate the bad data. The good news these days is most users are used to &#8220;check your email for a code&#8221; or other 2FA style </li>
</ul>
</li>
</ul>
</li>
</ul>



<p>What doesn&#8217;t work to remove spamtraps is to use a data hygiene service. They might remove some of the commercial sensor networks but none of the data hygiene services have reliably identified spamtraps that cause your mail to be blocked.</p>



<h2 class="wp-block-heading">Avoiding Spamtraps</h2>



<p>It&#8217;s always better to keep spamtraps off your list in the first place. That means: </p>



<ul class="wp-block-list">
<li>Don&#8217;t buy lists. This includes avoiding buying B2B addresses. </li>



<li>Don&#8217;t send to old addresses you find in the back of a desk drawer or in an old restore of your database. </li>



<li>Take some step to verify addresses that are entered into forms on your website. You don&#8217;t have to go full COI to verify data entered into forms, but you do need to implement something that means you know there is a connection between the person who owns the address and the person who gave you the address.</li>
</ul>



<h2 class="wp-block-heading">More Info on Spamtraps </h2>



<p>I&#8217;ve written in the past about different kinds of traps for almost as long as the blog has been around. I&#8217;m listing a few of the posts here. One of the interesting things is seeing how we write about spamtraps has both changed and not changed over the years. I think that reflects both how our understanding has changed and how spamtraps are used for filtering. </p>



<ul class="wp-block-list">
<li>2010: <a href="https://wordtothewise.com/2010/05/spamtraps/" data-type="post" data-id="1529">Spamtraps</a></li>



<li> 2011: <a href="https://wordtothewise.com/2011/08/a-brief-guide-to-spamtraps/">A brief guide to spamtraps</a></li>



<li>2011: <a href="https://wordtothewise.com/2011/11/spamtraps-should-you-care/" data-type="post" data-id="3575">Spamtraps: should you care?</a></li>



<li>2012: <a href="https://wordtothewise.com/2012/06/spamtraps-are-not-the-problem/" data-type="post" data-id="4146">Spamtraps are not the problem</a></li>



<li>2012: <a href="https://wordtothewise.com/2012/04/spamtraps-mean-your-list-is-bad/" data-type="post" data-id="3952">Spamtraps mean your list is bad</a></li>



<li>2012: <a href="https://wordtothewise.com/2012/09/equivocating-about-spamtraps/">Equivocating about spamtraps</a></li>



<li>2015: <a href="https://wordtothewise.com/2015/05/only-spamtraps-matter-or-do-they/" data-type="post" data-id="8351">Only spamtraps matter, or do they?</a></li>



<li>2019: <a href="https://wordtothewise.com/2019/01/recycled-addresses-spamtraps-and-sensors/" data-type="post" data-id="15193">Recycled addresses, spamtraps and sensors</a></li>



<li>2019: <a href="https://wordtothewise.com/2019/01/spamtraps-on-the-brain/" data-type="post" data-id="15215">Spamtraps on the brain</a></li>



<li>2019: <a href="https://wordtothewise.com/2019/04/spamtraps-are-overblown-by-senders/" data-type="post" data-id="15418">Spamtraps are overblown… by senders</a></li>



<li>2019: <a href="https://wordtothewise.com/2019/10/purging-to-prevent-spamtraps/" data-type="post" data-id="15784">Purging to prevent spamtraps</a></li>



<li>2019: <a href="https://wordtothewise.com/2019/11/myths-about-spamtraps/" data-type="post" data-id="15819">Myths about spamtraps</a></li>
</ul>



<p>Overall, spamtraps are a tool used by filtering companies and anti-spam organizations to tell them who has bad email practices and what those bad practices are. Those who end up on lists, or who have access to commercial sensor network data, can also use the trap information to understand what the underlying problems with their data are. These insights indicate what needs to be fixed. </p>



<p>Using spamtrap information to improve data collection and hygiene means a healthier email program and better overall delivery. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/03/what-spamtraps-tell-us/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17142</post-id>	</item>
		<item>
		<title>Do spamtraps exist?</title>
		<link>https://wordtothewise.com/2025/03/do-spamtraps-exist/</link>
					<comments>https://wordtothewise.com/2025/03/do-spamtraps-exist/#comments</comments>
		
		<dc:creator><![CDATA[laura]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 11:52:36 +0000</pubDate>
				<category><![CDATA[Industry]]></category>
		<category><![CDATA[ask laura]]></category>
		<category><![CDATA[Blocking]]></category>
		<category><![CDATA[spamtraps]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17118</guid>

					<description><![CDATA[One of the folks on the Email Geeks slack asked me a question last week that I thought was really insightful and has a somewhat nuanced answer. Do spamtraps really exist? Like, in the sense of being a real mailbox? They actually exist just like any other mailbox, yes? Otherwise they can&#8217;t be monitored and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>One of the folks on the Email Geeks slack asked me a question last week that I thought was really insightful and has a somewhat nuanced answer. </p>


<div class="wp-block-image is-style-rounded">
<figure class="aligncenter size-medium"><img decoding="async" width="300" height="225" src="https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-300x225.png" alt="An @ sign in a mousetrap. " class="wp-image-17139" srcset="https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-300x225.png 300w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-450x338.png 450w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-150x113.png 150w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-768x576.png 768w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-1536x1152.png 1536w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-2048x1536.png 2048w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-1920x1440.png 1920w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-720x540.png 720w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-580x435.png 580w, https://wordtothewise.com/wp-content/uploads/2025/03/SpamtrapImage2-320x240.png 320w" sizes="(max-width: 300px) 100vw, 300px" /></figure></div>


<p class="has-text-align-left"><em>Do spamtraps really exist? Like, in the sense of being a real mailbox? They actually exist just like any other mailbox, yes? Otherwise they can&#8217;t be monitored and reported on. This includes typo spamtraps, correct?</em> </p>



<h2 class="wp-block-heading">Do spamtraps exist?</h2>



<p>A spam trap exists in the sense that it is a legitimate RFC5322 email address and has a valid MX record (or A record). It&#8217;s a real email address. Most spamtraps accept mail for delivery, although there are a few that reject after the full SMTP transaction. In those cases the mail doesn&#8217;t &#8220;deliver&#8221; but the data is still captured by the trap owner.  </p>



<p>What most of us mean when we say &#8220;spamtraps don&#8217;t exist&#8221; is that there is not a human that actually uses that address for email. The domain owner has not assigned that address to any individual for use. This means that no one sending mail to that address has permission to send mail from the user of the email address. There&#8217;s simply no person to give that permission to the sender. In that sense, the address &#8220;doesn&#8217;t exist.&#8221;  </p>



<h2 class="wp-block-heading">Are they read like any other mailbox?</h2>



<p>In terms of existing like &#8220;any other mailbox,&#8221; again we&#8217;re in nuanced territory. For normal email delivery, the MX accepts the mail and then hands it off to a local delivery agent. Here, we have <a href="https://www.postfix.org">postfix</a> as our MTA server and <a href="https://www.dovecot.org">dovecot</a> as our IMAP server . All of our mail clients (phone, desktop, tablets) then connect IMAP so we can read, respond to, forward and save mail. </p>



<p>But that&#8217;s not the only way we accept mail here. We have a system for clients where ever client gets a subdomain and can send mail to it. That mail never goes anywhere near a IMAP server, it&#8217;s dropped into a database and displayed on a website. I can read mail, but I can&#8217;t reply to it or forward it or anything. We also have <a href="http://aboutmy.email" data-type="link" data-id="aboutmy.email">aboutmy.email</a>, which also drops mail into a database and displays it on a website but there&#8217;s no way to &#8220;read&#8221; mail if you don&#8217;t have the specific link for the message or do anything more with it.</p>



<p>The way our internal tools and aboutmy.email handle mail are much closer to how large spamtrap feeds handle mail. They accept the message (or just read through data and reject the mail), extract the data they need into a database and query it later. For large feeds, they physically can&#8217;t read the mail, it just arrives too fast. Some trap feeds are dozens or hundreds of messages a second. It&#8217;s also so much data they don&#8217;t keep it for long. They record important things in their database (IPs, domains, dates, headers) and delete the message after a few hours to conserve storage space.</p>



<p>So the feeds themselves are mostly mechanically &#8216;read&#8217;. The data is put into a database and dealt with as &#8216;big data&#8217; with tools and reports. They usually don&#8217;t have any way to connect a mail client with them and individual messages aren&#8217;t read in any way that normal people read mail. </p>



<h2 class="wp-block-heading">Do spamtraps interact with mail like real recipients?</h2>



<p>For a long time many folks, including myself, reassured clients and the general public that spamtrap addresses were unlikely to show opens or clicks in email. And, statistically, we were correct. The folks running traps didn&#8217;t open or read or click on the vast majority of mail coming into their traps. However, there was always a chance that a spamtrap would open or click on a mail. Statistically it was unlikely. but I was always aware that we could be missing spamtrap focusing on engagement. Over time I got a little more refined in my recommendations to address these concerns. </p>



<p>More recently, I don&#8217;t spend a lot of time on opens or clicks as a filtering criteria to identify real addresses. The details depend the particular client, but I focus more on metrics that are actually the result of a human getting a message and taking an action. Opens and clicks are not interactions that indicate a human is reading a message and we cannot treat them as reliable human signals. </p>



<p>Overall, the answer to the original question is that spamtraps are real email addresses but they&#8217;re not addresses used by real people to sign up for mail. If they weren&#8217;t used as part of spam filtering and spam blocking systems, we wouldn&#8217;t care about spam traps. But they are used as a data source and too many spamtraps on a list can be a sign that there are issues with the sender. </p>



<p>Tomorrow I&#8217;ll be posting some more detailed information about spamtraps and what you can do about them. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/03/do-spamtraps-exist/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17118</post-id>	</item>
		<item>
		<title>Google, Alignment and DMARC</title>
		<link>https://wordtothewise.com/2025/03/google-alignment-and-dmarc/</link>
					<comments>https://wordtothewise.com/2025/03/google-alignment-and-dmarc/#comments</comments>
		
		<dc:creator><![CDATA[laura]]></dc:creator>
		<pubDate>Tue, 11 Mar 2025 12:02:35 +0000</pubDate>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[DKIM]]></category>
		<category><![CDATA[dmarc]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[spf]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17124</guid>

					<description><![CDATA[Google has been making a number of changes to their systems over the last few weeks. Folks are seeing a lot of changes in Google postmaster tools and they&#8217;re seeing changes in how Google is displaying headers in the &#8220;show original&#8221; tab. One thing that some folks were seeing is a message that says: This [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Google has been making a number of changes to their systems over the last few weeks. Folks are seeing a lot of changes in Google postmaster tools and they&#8217;re seeing changes in how Google is displaying headers in the &#8220;show original&#8221; tab.</p>



<p>One thing that some folks were seeing is a message that says:  </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1660" height="310" src="https://wordtothewise.com/wp-content/uploads/2025/03/image-1.png" alt="A screenshot from &quot;Show Original&quot; at google that says:

SPF: Pass with IP 104.224.223.158
DKIM: 'Pass: with domain wordtothewise.com
Alignment: The From header Laura Atkins <laura@carrotcafe.com&gt; does not match the DKIM domain wordtothewise.com. Be careful with this message as the sender may be spoofing the From header identity. " class="wp-image-17126" srcset="https://wordtothewise.com/wp-content/uploads/2025/03/image-1.png 1660w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-300x56.png 300w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-450x84.png 450w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-150x28.png 150w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-768x143.png 768w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-1536x287.png 1536w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-720x134.png 720w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-580x108.png 580w, https://wordtothewise.com/wp-content/uploads/2025/03/image-1-320x60.png 320w" sizes="auto, (max-width: 1660px) 100vw, 1660px" /></figure>



<p>This &#8220;Alignment&#8221; description replaced the DMARC verdict in the header. The interesting thing here is that while DKIM doesn&#8217;t align, SPF does pass and so the message technically passed DMARC. </p>



<p>Mike J. on the emailgeeks slack channel mentioned that he noticed that this only seemed to happen when there wasn&#8217;t a DMARC policy published for the domain. Well, I can test that! I have multiple domains that do align with SPF, don&#8217;t align with DKIM and don&#8217;t have current DMARC policies. </p>



<p>We published a DMARC p=none policy for carrotcafe.com and I repeated the test send. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1686" height="262" src="https://wordtothewise.com/wp-content/uploads/2025/03/image-3.png" alt="A screenshot from &quot;Show Original&quot; at google that says:

SPF: Pass with IP 104.224.223.158
DKIM: 'Pass: with domain wordtothewise.com
DMARC: 'Pass'" class="wp-image-17129" srcset="https://wordtothewise.com/wp-content/uploads/2025/03/image-3.png 1686w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-300x47.png 300w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-450x70.png 450w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-150x23.png 150w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-768x119.png 768w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-1536x239.png 1536w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-720x112.png 720w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-580x90.png 580w, https://wordtothewise.com/wp-content/uploads/2025/03/image-3-320x50.png 320w" sizes="auto, (max-width: 1686px) 100vw, 1686px" /></figure>



<p>So, yeah, that&#8217;s pretty definitive. The &#8220;alignment&#8221; warning pops up when DKIM doesn&#8217;t align and when there is no DMARC record published in DNS. If there is a DMARC record published in DNS, then the DMARC results take precedence. </p>



<p>Of course, as a scientist I would be remiss if I didn&#8217;t point out what I didn&#8217;t test. The conditions I don&#8217;t have the ability to test right now are DKIM aligned and passing with no DMARC record. My hypothesis / gut feel is that it would say DMARC pass, but without running the test I can&#8217;t say that&#8217;s what is happening. </p>



<p>Word of caution, though. These displays and reports do seem to be a bit buggy. Another email geek posted a screenshot that showed DKIM passing and aligned but also with the Alignment warning. In this case the alignment warning said &#8220;The From header of @email.example.com does not match DKIM domain email.example.com.&#8221; Which is clearly wrong. That message was double DKIM signed, by the customer and by the ESP domain, so it&#8217;s possible that there is a bug that needs to be fixed by the developers. </p>



<p>Overall, I think Google is testing how they&#8217;re displaying things specifically to the email deliverability space. Most folks don&#8217;t look at the &#8220;original display&#8221; for their emails. I&#8217;d even wager the vast majority of folks who do look at this are in deliverability, email, security or some other technology adjacent field. This is something they&#8217;re working out how best to show information.</p>



<p>One important thing to remember: the actual headers of these messages show the messages are correctly authenticated. Also, there seem to be no deliverability consequences (yet!) to the lack of alignment. Currently this is a display issue only. I think it does indicate that Google are serious about expecting folks to have DMARC records, even if they&#8217;re p=none. I also think it&#8217;s telling that they are putting much more value on DKIM passing and they&#8217;re ignoring SPF passing in the instance of no DMARC record. </p>



<p>I&#8217;ve been saying for more than a year that deliverability is in an era of upheaval and change and I think this is another example of it. We&#8217;re not sure what Google is doing, nor what it means. We just need to be a bit patient and keep our eyes open for what&#8217;s going on. I do expect it&#8217;s going to be a little longer before things settle down. But that&#8217;s OK, we&#8217;ve done this before, we can do it again.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/03/google-alignment-and-dmarc/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17124</post-id>	</item>
		<item>
		<title>Setting up a smarthost</title>
		<link>https://wordtothewise.com/2025/02/setting-up-a-smarthost/</link>
					<comments>https://wordtothewise.com/2025/02/setting-up-a-smarthost/#comments</comments>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 15:43:36 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[DKIM]]></category>
		<category><![CDATA[milter]]></category>
		<category><![CDATA[opendkim]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[smarthost]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17109</guid>

					<description><![CDATA[Deploying a new smarthost using Postfix and other open source components. And why you probably shouldn't do that.]]></description>
										<content:encoded><![CDATA[
<p>We run most of our own network services &#8211; inbound and outbound email, DNS and web presence. We run separate services for inbound and outbound email to give us more flexibility in how we set things up.</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="450" height="290" src="https://wordtothewise.com/wp-content/uploads/2025/02/sausage-450x290.png" alt="A book titled &quot;Mastering the Craft of Making Sausage&quot;" class="wp-image-17114" srcset="https://wordtothewise.com/wp-content/uploads/2025/02/sausage-450x290.png 450w, https://wordtothewise.com/wp-content/uploads/2025/02/sausage-300x194.png 300w, https://wordtothewise.com/wp-content/uploads/2025/02/sausage-150x97.png 150w, https://wordtothewise.com/wp-content/uploads/2025/02/sausage-580x374.png 580w, https://wordtothewise.com/wp-content/uploads/2025/02/sausage-320x206.png 320w, https://wordtothewise.com/wp-content/uploads/2025/02/sausage.png 600w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>



<p>Our current smarthost was configured in 2018 and hasn&#8217;t really been touched much since. We&#8217;re moving it to a different hosting location, in the EU rather than the US, mostly so we can make stronger privacy statements about all customer data being handled on EU located servers.</p>



<p>So we&#8217;re starting from scratch. I thought I&#8217;d document the process.</p>



<h3 class="wp-block-heading">Basics</h3>



<p>It&#8217;s a nice little VPS from <a href="https://www.mythic-beasts.com" data-type="link" data-id="https://www.mythic-beasts.com">Mythic Beasts</a>. It&#8217;s just being used for outbound email, so I don&#8217;t need much storage. It&#8217;ll only have a few users &#8211; some human, some apps &#8211; so it&#8217;s not going to need much CPU either. It&#8217;s mostly just going to be running <a href="https://www.postfix.org">postfix</a> and some helper services.</p>



<p>I paid the extra <span style="white-space: normal; caret-color: rgb(33, 37, 41); color: rgb(33, 37, 41); font-family: &quot;Open Sans&quot;, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Liberation Sans&quot;, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;">£</span>20 to get an IPv4 address as well as the default IPv6 range. Email is not ready for IPv6-only yet.</p>



<p>Mythic Beasts have an excellent reputation for not tolerating bad actors on their network. That&#8217;s part of the reason I chose them for this &#8211; IP reputation isn&#8217;t as important for delivery as it used to be, but you still don&#8217;t want to be on a network provider known as a source of spam. They actually had a member of staff manually review the order before spinning up the new VPS, which is a level of due diligence I&#8217;ve not seen in <em>years</em>.</p>



<p>The normal new server setup path: sudo, ssh keys. I add it to our <a href="https://tailscale.com" data-type="link" data-id="https://tailscale.com">tailscale</a> VPN and set up ssh to only listen on the VPN. Then I do the <a href="https://github.com/tailscale/tailscale/issues/11504" data-type="link" data-id="https://github.com/tailscale/tailscale/issues/11504">tailscale-wait-for-ip dance</a> that&#8217;s needed to make services that bind to addresses at startup happy. If I&#8217;d done that in a different order I wouldn&#8217;t have locked myself out and had to use a virtual serial console to get back in. Oops. Lock down the packet filters so only port 587 can come in from the public Internet.</p>



<p>The hostname is preconfigured to be mail.turscar.ie &#8211; that&#8217;s what it will HELO as, and what it&#8217;ll stamp into trace headers, so it&#8217;s important to get right. Mythic beasts set up reverse DNS for both its IPv4 and IPv6 addresses when the VM was created, and I&#8217;ve added A and AAAA records for it to the turscar.ie nameserver.</p>



<h3 class="wp-block-heading">TLS Certificates</h3>



<p>We&#8217;re going to be submitting mail over the ESMTP SUBMIT port, 587. That requires authentication, so we need to support STARTTLS. That means that we need to acquire a TLS certificate, and it&#8217;s 2025 so we want a real, publicly trusted certificate, not a self-signed one.</p>



<p>There are several certificate authorities that&#8217;ll issue free, domain authenticated certificates using ACME clients, but I&#8217;m going to stick with <a href="https://letsencrypt.org">Lets Encrypt</a>.</p>



<p>Lets Encrypt certificates are only valid for a few months, so need to be renewed every couple of months, which means that requesting and deploying them needs to be automated. The most commonly used infrastructure for that automation is aimed at certificates for web servers, and requires a webserver to be running at the hostname that a certificate is requested for.</p>



<p>We don&#8217;t have a webserver for mail.turscar.ie. Fortunately the ACME protocol supports domain validation in other ways. The client I use, <a href="https://go-acme.github.io/lego/">LEGO</a>, has great support for authentication via DNS, supporting the APIs of a 150 or so different providers. I could use it&#8217;s native PowerDNS API support, but that would mean setting up and exposing that API on my primary DNS server, and handling all the authentication for that. Instead I use <a href="https://tools.wordtothewise.com/rfc2136" data-type="link" data-id="https://tools.wordtothewise.com/rfc2136">RFC2136</a> dynamic DNS updates. These are handled over DNS, and just require a shared secret between the DNS server and the ACME client.</p>



<p>(DNS is core to a lot of security, so if someone were to get hold of that shared secret it would be bad if they could use it to modify the DNS for my zones. So I create a subdomain _acme-challenge.mail.turscar.ie and allow only that subdomain to be updated via dnsupdate, and only from the IP address of the new server. The shared secret can&#8217;t be used to modify anything other than ACME challenge records, and it can&#8217;t be accessed from anywhere else. That&#8217;s an annoying amount of work to do by hand, but I wrote the script to do it once and now it&#8217;s a single command.)</p>



<p>There are a lot of certificate authorities out there, and not all of them are as careful about issuing certificates as they should be. We can mitigate that by publishing CAA records in DNS.</p>



<p>A CAA record contains the name of a certificate authority. Any certificate authority that&#8217;s about to issue a certificate is required to look up the CAA records for the domain. If it finds any CAA records, and it doesn&#8217;t find one with the CA&#8217;s name in it, it mustn&#8217;t issue the certificate.</p>



<p>We&#8217;ve already published <a href="https://tools.wordtothewise.com/dns/caa/turscar.ie" data-type="link" data-id="https://tools.wordtothewise.com/dns/caa/turscar.ie">CAA records for turscar.ie</a>, so we&#8217;re good to go.</p>



<p>LEGO lets you run a script once it&#8217;s acquired a certificate and a private key. I mostly use that to write the certificate and private key to the normal places they live (/etc/ssl/certs and /etc/ssl/private) and reload any services that use them. Since I last set up postfix they&#8217;ve moved to recommending that the private key and certificate are stored in a single file, rather than separate ones, so I modify the hook script to concatenate the key and certificate and put that chain file where postfix (and only postfix) can read it.</p>



<p>I run LEGO once by hand, to get my certificate, then add it to root&#8217;s crontab to run nightly. When it runs it&#8217;ll check the expiry date of all the certificates it manages, and renew any that are close to expiring. That&#8217;ll keep running forever, and I&#8217;ll never need to look at it again.</p>



<p>A TLS certificate is part of a chain of certificates. The one you&#8217;re issued is authenticated by a certificate owned by the certificate authority. That one may be authenticated by an intermediate certificate and then that one is authenticated by a trusted root certificate. The list of trusted root certificates is compiled manually, and distributed with your operating system or embedded into your web browser. It&#8217;s good to know what certificates are in that chain, and make them all available to your server to offer to clients. If, say, you don&#8217;t offer an intermediate certificate then your certificate might not be accepted by a client. Or it might, depending on what certificates the client trusts. And if I wanted to publish <a href="https://tools.wordtothewise.com/rfc6698">TLSA</a> records in DNS to  strengthen trust in the certificate I&#8217;d need to serve the whole chain back to the root certificate</p>



<p>Running <code>openssl storeutl -noout -text -certs mail.turscar.ie.crt</code> prints out the chain of certificates in that file:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-number">0</span>: Certificate
Certificate:
    Data:
        Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=US, O=Let<span class="hljs-string">'s Encrypt, CN=E5
        Subject: CN=mail.turscar.ie
1: Certificate
Certificate:
    Data:
        Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1
        Subject: C=US, O=Let'</span>s Encrypt, CN=E5</code></span></pre>


<p>I&#8217;ve trimmed out a whole lot of information, leaving just the bits I want to talk about. You can see there are two certificates in this chain. The first one is the one I was just issued. The Subject: field is who it belongs to, mail.turscar.ie<sup data-fn="1c34f49a-2ea6-4af4-a6ed-5b8c04450437" class="fn"><a href="#1c34f49a-2ea6-4af4-a6ed-5b8c04450437" id="1c34f49a-2ea6-4af4-a6ed-5b8c04450437-link">1</a></sup>. The Issuer is the entity that vouched for this certificate, Let&#8217;s Encrypt&#8217;s E5 certificate.</p>



<p>The second certificate belongs to Let&#8217;s Encrypt, it&#8217;s <a href="https://letsencrypt.org/certificates/">their intermediate E5 certificate</a> that they use for issuing many of their ECDSA certificates. The issuer is the ISRG Root X1 certificate.</p>



<p>And the ISRG X1 Root is widely recognised, so this certificate chain is good enough, at least until I want to publish TLSA records.</p>



<p>The Signature Algorithm: field shows that this is an ECDSA (elliptic curve) certificate rather than the older RSA type. Client support for ECDSA certificates isn&#8217;t universal, so the postfix documentation suggests offering RSA alongside ECDSA. If this were a public smarthost I&#8217;d do that, but we&#8217;ve been using ECDSA only on our existing smarthost and haven&#8217;t seen any problems, so I&#8217;m not going to bother.</p>



<h3 class="wp-block-heading">Postfix</h3>



<p>I&#8217;ve been using postfix for decades. It&#8217;s stable, fairly feature-rich, well supported and well suited for a small business mailserver, inbound or outbound. If I were building something bigger, or more suited to bulk mail usage I&#8217;d probably consider <a href="https://kumomta.com">KumoMTA</a> instead, but for this setup Postfix is fine. And I&#8217;m familiar with how it&#8217;s configured and how all the pieces go together.</p>



<p>The most recent release of Postfix is 3.10.0. The Debian repo gives me Postfix 3.7.11. I&#8217;d like some of the new features and security mitigations that have been added since then, but I&#8217;d like a clean, easily upgradeable install on Debian stable more.</p>



<p><code>apt install postfix</code> asks me what sort of installation I want. I tell it I want a normal mailserver and it installs and configures postfix, and sets it running via systemd.</p>



<p>Time to configure things.</p>



<p>In <code>/etc/postfix/main.cf</code> I setup TLS</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment"># TLS parameters</span>
smtpd_tls_chain_files = /etc/postfix/ecdsa.pem
smtpd_tls_security_level=may
smtpd_tls_auth_only = yes</code></span></pre>


<p>The default setup is for a mailserver that listens on port 25. We don&#8217;t want that, we want just a submission server on port 587, so off to <code>/etc/postfix/master.cf</code> we go. The default settings are fine, so I just comment out the <code>smtp</code> service and uncomment <code>submission</code>. Restart the service and we&#8217;re listening on port 587.</p>



<h3 class="wp-block-heading">Client Authentication &#8211; SASL</h3>



<p>We need to be able to authenticate clients, but we don&#8217;t need anything sophisticated. Simple username and password will be fine.</p>



<p>So we&#8217;ll use Cyrus SASL (simple authentication and security layer) with a PAM provider. Postfix will talk SASL to Cyrus, then Cyrus will use PAM to validate usernames and passwords against the operating systems usernames and passwords. This wouldn&#8217;t scale well, but for a few users it&#8217;s fine (particularly if those users are also going to want to log in to check the mail delivery logs occasionally).</p>


<pre class="wp-block-code"><span><code class="hljs">sudo apt install libsasl2-modules sasl2-bin</code></span></pre>


<p>This installs <code>saslauthd</code> and friends. The default setup is almost what we need, but not quite. Postfix communicates with saslauthd via a unix socket, but postfix is configured to run in a chroot, so can&#8217;t access the default socket location. The needed change is well documented in comments in the <code>/etc/default/saslauthd</code> configuration file.</p>



<p>Skipping over a <em>lot</em> of debugging here. Some days I hate being a sysadmin.</p>



<p>Unfortunately, the Debian 12 packaging of saslauthd just doesn&#8217;t work. There&#8217;s a bad interaction with SysV startup scripts and systemd meaning that it just silently fails, whatever you do. There are a smattering of open bug reports about it, and it&#8217;s supposedly fixed in what will become Debian 13. So I create a proper systemd service file for &#8220;saslauthd2&#8221; and that runs fine.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">/usr/sbin/testsaslauthd -f /<span class="hljs-keyword">var</span>/spool/postfix/<span class="hljs-keyword">var</span>/run/saslauthd/mux \
 -u steve -p &lt;password&gt;</code></span></pre>


<p>This gives me a nice <code>OK "Success."</code> response for  a valid password and <code>NO "authentication failed"</code> for an invalid one.</p>



<h3 class="wp-block-heading">Client Authentication &#8211; postfix</h3>



<p>Now we tell postfix to use it by creating <code>/etc/postfix/sasl/smtpd.conf</code></p>


<pre class="wp-block-code"><span><code class="hljs language-http"><span class="hljs-attribute">pwcheck_method</span>: saslauthd
<span class="hljs-attribute">mech_list</span>: PLAIN LOGIN</code></span></pre>


<p>PLAIN and LOGIN are the two plain text authentication styles, which we need to be able to support them with this setup. They&#8217;re tunneled over TLS, so that&#8217;s fine.</p>



<p>The submission service in master.cf already has <code>smtpd_sasl_auth_enable=yes</code> and main.cf has <code>smtpd_recipient_restrictions=permit_sasl_authenticated,reject</code> so after reloading the postfix service we should be good to go.</p>



<h3 class="wp-block-heading">Testing with SWAKS, finally</h3>



<p>Time for a smoke test, using <a href="https://wordtothewise.com/2024/06/swaks-test-your-smtp/">swaks</a>.</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">swaks</span> <span class="hljs-selector-tag">--to</span> <span class="hljs-selector-tag">steve</span><span class="hljs-keyword">@blighty</span>.com --server mail.turscar.ie \
  --protocol ESMTPS -p <span class="hljs-number">587</span> --auth-user steve --auth-password mypwd</code></span></pre>


<p>The SMTP transaction scrolls by, swaks uses <code>STARTTLS</code> to switch to using TLS, then sends <code>AUTH LOGIN</code> to authenticate. The mail is accepted, then sent on to the final destination.</p>



<p>Where it ends up in my spam folder. Nothing&#8217;s authenticated yet (and we have no Message-ID, because SWAKS, and it&#8217;s 5321.From and 5322.From domains don&#8217;t have an MX, because SWAKS), so no great surprise. We&#8217;ll do a more realistic test once authentication is set up.</p>



<h2 class="wp-block-heading">SMTP Authentication &#8211; DKIM</h2>



<p>A common way &#8211; for postfix and sendmail, at least &#8211; to plug most sorts of processing into a mailserver is to use a <em>milter</em>. That&#8217;s a portmanteau for <em>mail filter</em>, and it&#8217;s an API that allows postfix to pass an email to an external process. It&#8217;s been around for a couple of decades or more, so it&#8217;s pretty stable.</p>



<p>That external process, the milter, can make decisions about how the mail should be routed, and it can modify the header or content. </p>



<p>The commonly used DKIM milter is <a href="http://www.opendkim.org">OpenDKIM</a>. It can both verify inbound mail and sign outbound mail, and can be convinced to sign mail from different senders with different domains and keys, making it possible to have dkim authentication align with the 822.From header.</p>



<p>But OpenDKIM has some open bugs &#8211; nothing serious, but some unexpected behaviour in grubby corners. Its last production release dates from 2015. Debian seem to be distributing the most recent beta release from 2018. Don&#8217;t get me wrong, it&#8217;s good enough to use in production, but it&#8217;s not a codebase I&#8217;m particularly comfortable diagnosing or modifying. So what else is available?</p>



<p>The usual code I use for authentication is <a href="https://github.com/emersion/go-msgauth">go-msgauth</a>. It&#8217;s solid, understandable code and it does include a milter implementation. But it&#8217;s very basic, and can only sign with a single domain, configured as a commandline flag.</p>



<p>Rspamd&#8217;s dkim_signing module might be another option, but that&#8217;s a huge &#8220;intended for inbound mail filtering&#8221; dependency to pull in for a smarthost. And there&#8217;s a few pieces of <a href="https://github.com/stalwartlabs/mail-auth">very nice</a> <a href="https://crates.io/crates/viadkim">rust code</a> for authentication, and a <a href="https://crates.io/crates/dkim-milter">milter</a> based on one, but I&#8217;d need to build and package those myself.</p>



<p>I guess I&#8217;m using OpenDKIM for now.</p>



<h3 class="wp-block-heading">OpenDKIM</h3>


<pre class="wp-block-code"><span><code class="hljs">sudo apt install opendkim opendkim-tools</code></span></pre>


<p>This installs a basic configuration file in <code>/etc/opendkim.conf</code>. Just like saslauthd it communicates with postfix via a unix socket, so again I need to configure it to create that socket inside the directory postfix is chrooted to.</p>



<p>I&#8217;m using opendkim because I want to have aligned dkim signatures, and that means I need to sign with different keys<sup data-fn="480c029a-6f52-4d9f-b30d-399260a51221" class="fn"><a href="#480c029a-6f52-4d9f-b30d-399260a51221" id="480c029a-6f52-4d9f-b30d-399260a51221-link">2</a></sup> depending on the domain in the From: address. That&#8217;s configured using a SigningTable and a KeyTable, so I add a couple of lines to /etc/opendkim.conf:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">KeyTable                /etc/opendkim/KeyTable
SigningTable            refile:<span class="hljs-regexp">/etc/</span>opendkim/SigningTable</code></span></pre>


<p>KeyTable is just a text file with one record per line &#8211; starting with an arbitrary name (I&#8217;m using the full hostname where the TXT record will be published, because it&#8217;s easy to remember) followed by the DKIM selector, the DKIM SDID (&#8220;d=&#8221;) and the private key to sign with, all separated by colons:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">blueberry._domainkey.wordtothewise.com wordtothewise.com:blueberry:<span class="hljs-regexp">/etc/</span>opendkim/keys/wordtothewise.com/blueberry.private</code></span></pre>


<p>SigningTable is an &#8220;refile&#8221;, which is used to map the value in the From: header to one of the entries in the KeyTable. &#8220;refile&#8221; stands for &#8220;regular expression file&#8221;. Despite that, it does not contain regular expressions, just simple wildcards using an asterisk. Again, it has one record per line, starting with a wildcard match for the From: header, followed by the arbitrary name for the key data from the KeyTable.</p>


<pre class="wp-block-code"><span><code class="hljs language-css">*<span class="hljs-keyword">@wordtothewise</span>.com blueberry._domainkey.wordtothewise.com</code></span></pre>


<p>Next up, signing keys.</p>



<p>First we create somewhere secure to store them, as root:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment"># mkdir -p /etc/opendkim/keys/wordtothewise.com</span>
<span class="hljs-comment"># chown -R opendkim:opendkim /etc/opendkim/keys</span>
<span class="hljs-comment"># chmod go-rwx /etc/opendkim/keys</span></code></span></pre>


<p>Then we create a key pair, a private key for signing outbound mail and a public key to publish in DNS. We have a few choices to make &#8211; what selector to use, how strong a key we want, whether the key should be explicitly only used for email:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment"># opendkim-genkey --append-domain \</span>
  --bits=<span class="hljs-number">2048</span> \
  --directory=/etc/opendkim/keys/wordtothewise.com \
  --domain=wordtothewise.com \
  --restrict \
  --selector=blueberry
<span class="hljs-comment"># chown -R opendkim:opendkim /etc/opendkim/keys</span></code></span></pre>


<p>That creates two files for us. One is <code>blueberry.private</code> &#8211; the signing key, generated in the place we&#8217;ve already told opendkim to find it. The other is <code>blueberry.txt</code> &#8211; the public key, in bind format ready to add to our nameserver:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">blueberry._domainkey.wordtothewise.com.	IN	TXT	( <span class="hljs-string">"v=DKIM1; h=sha256; k=rsa; s=email; "</span>
	  <span class="hljs-string">"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0FOof0FrJBTMxNm/3KbLSnUgBwX5jVkRILFEJJltBbaH0ZqduoUau/NcjioYgDSO8ktF6f4YnUem7VjARTzkl7mnQA9qlhF0Ix0W72oL5cDd6EptuoNn88ws9nBRvDBkeSjFNo/ftvrr6wEMet93EC0mxXKZXT9jgPTAii+cXl1Jg7QkO64DySFUDAodmaBMN9mVtr8P6drO0P"</span>
	  <span class="hljs-string">"sG8RxH9KfvEtLS4L1a42TB7CtydMeIGQJKW51C55cIRhLVXzZ8emdTpZ067tdYNdeHFX7WsSEa5XBIJoDE8LI8RHrYSIdUbtGqkWncy9U0yYjVPJj369Q7yBgWZiwGrjbUQBr3XQIDAQAB"</span> )  ; ----- DKIM key blueberry <span class="hljs-keyword">for</span> wordtothewise.com</code></span></pre>


<p>I add that to our main nameservers, and we&#8217;ve <a href="https://tools.wordtothewise.com/dkim/check/wordtothewise.com/blueberry">published our DKIM public key</a>.</p>



<p>There are tools for testing a milter directly, but let&#8217;s hope we can skip that and just send some email.</p>



<p>Plugging opendkim-milter in to postfix is just a few lines in /etc/postfix/main.cf:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">smtpd_milters = unix:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept</code></span></pre>


<p>I add postfix to the opendkim group, so they can both access the socket inside postfix&#8217; chroot, make sure the directory /var/spool/postfix/opendkim is owned by opendkim and has reasonable permissions, then restart both postfix and opendkim.</p>



<h3 class="wp-block-heading">Testing with SWAKS, again</h3>



<p>This time we have to provide an email address for the From: header, to trigger the DKIM signing.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">swaks --to steve@blighty.com --<span class="hljs-keyword">from</span> steve@wordtothewise.com \
  --server mail.turscar.ie --protocol ESMTPS -p <span class="hljs-number">587</span> \
  --auth-user steve --auth-password mypwd</code></span></pre>


<p>The first attempt is deferred by the smarthost. Checking the opendkim logs the ownership of the private key file is wrong, so it can&#8217;t sign the mail. Fixing that, the second attempt delivers successfully, but DKIM fails because it can&#8217;t find the public key in DNS&#8230;</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Authentication-Results: mx.turscar.ie;
	dkim=fail reason=<span class="hljs-string">"key not found in DNS"</span> header.d=blueberry header.i=@blueberry header.a=rsa-sha256 header.s=wordtothewise.com header.b=umSfgt6s;
	dkim-atps=neutral
</code></span></pre>


<p>header.s = wordtothewise.com, header.d=blueberry? I got the two columns in KeyTable the wrong way around. Easy fix. (I&#8217;ve fixed it in this post too, as I really don&#8217;t want to leave bad configuration where someone might copy and paste it).</p>



<p>Now it works.</p>


<pre class="wp-block-code"><span><code class="hljs">Authentication-Results: mx.turscar.ie;
	dkim=pass (2048-bit key; secure) header.d=wordtothewise.com header.i=@wordtothewise.com header.a=rsa-sha256 header.s=blueberry header.b=AJgmgJCN;
	dkim-atps=neutral
</code></span></pre>


<p>Final test, send an email to <a href="https://aboutmy.email/">aboutmy.email</a> &#8211; the results <a href="https://aboutmy.email/6f3e8d8">look good</a>.</p>



<p>SPF and DKIM are aligned, DMARC passes. Mail is being sent via TLS 1.3, over an IPv6 connection. Round trip reverse DNS looks good.</p>



<h3 class="wp-block-heading">What&#8217;s next?</h3>



<p>I need to add the other domains we use for email to the signing tables, and update their SPF records to acknowledge the new server.</p>



<p>I need to do something about key rotation. There&#8217;s not really a great way to automate that around opendkim. It would be possible, but would require generating new keys, pushing them in to the DNS, updating the opendkim signing tables (either by editing the files or, more likely, by moving to use database backed tables). I&#8217;m going to think about that, and see if anyone has written anything to help with it.</p>



<h3 class="wp-block-heading">Conclusions</h3>



<p>You can configure a perfectly solid, best practices compliant smarthost using off-the-shelf open source components.</p>



<p>But documentation is sparse, contradictory or wrong. Packaging, at least in the Debian world, is a wreck. The default configuration isn&#8217;t going to provide best practices, and the bits of configuration you need to do so aren&#8217;t on the simple path.</p>



<p>You should strongly consider having someone else run it for you, or using a commercial (supported, good practices by default) smarthost.</p>



<p>And next time I&#8217;m going to try <a href="https://kumomta.com">KumoMTA</a> instead, even for a small business smarthost.</p>


<ol class="wp-block-footnotes"><li id="1c34f49a-2ea6-4af4-a6ed-5b8c04450437">This is a huge oversimplification of what&#8217;s in a TLS certificate &#8211; you should really be looking at the X509v3 Subject Alternative Name &#8211; but it&#8217;s good enough for this. <a href="#1c34f49a-2ea6-4af4-a6ed-5b8c04450437-link" aria-label="Jump to footnote reference 1"><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></li><li id="480c029a-6f52-4d9f-b30d-399260a51221">Technically I could sign with the same private key, publish the single public key under multiple domains and still use a d= that matches the domain in the From: header. <a href="#480c029a-6f52-4d9f-b30d-399260a51221-link" aria-label="Jump to footnote reference 2"><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/02/setting-up-a-smarthost/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17109</post-id>	</item>
		<item>
		<title>How to choose an ESP based on deliverability</title>
		<link>https://wordtothewise.com/2025/02/how-to-choose-an-esp-based-on-deliverability/</link>
					<comments>https://wordtothewise.com/2025/02/how-to-choose-an-esp-based-on-deliverability/#comments</comments>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Mon, 10 Feb 2025 11:22:33 +0000</pubDate>
				<category><![CDATA[Delivery Improvement]]></category>
		<category><![CDATA[compliance]]></category>
		<category><![CDATA[Deliverability]]></category>
		<category><![CDATA[ESPs]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17095</guid>

					<description><![CDATA[Despite what a lot of SEO slop will try and tell you there&#8217;s no way to measure deliverability performance across multiple ESPs in any way that&#8217;s meaningful. (The SEO slop tends to do things like sign up for free accounts at a bunch of ESPs, send three emails to probe accounts and see how many [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Despite what a lot of SEO slop will try and tell you there&#8217;s no way to measure deliverability performance across multiple ESPs in any way that&#8217;s meaningful.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="450" height="399" src="https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-450x399.jpg" alt="An @ sign with a checklist." class="wp-image-17097" srcset="https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-450x399.jpg 450w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-300x266.jpg 300w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-150x133.jpg 150w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-768x682.jpg 768w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-1536x1363.jpg 1536w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-1920x1704.jpg 1920w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-720x639.jpg 720w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-580x515.jpg 580w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L-320x284.jpg 320w, https://wordtothewise.com/wp-content/uploads/2025/02/Depositphotos_32770335_L.jpg 2000w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>



<p>(The SEO slop tends to do things like sign up for free accounts at a bunch of ESPs, send three emails to probe accounts and see how many reach the inbox at mailbox providers served by the probe account service. If you&#8217;re a reader of this blog you can probably already see why that&#8217;s meaningless, but I could write several thousand words just on Why These People Are Wrong and Why Their SEO Slop Is Bad.)</p>



<p>Could we do the same sort of testing but &#8230; <em>better?</em> Not really. You&#8217;d need to be sending real content to a real audience &#8211; not probe accounts &#8211; consistently from each ESP  long enough for metrics to stabilise to get a fair rough measure. And moving that audience to another ESP would change things enough that you couldn&#8217;t really compare with the first one, let alone by the tenth ESP. And even if you did all that it would, at best, give a vague comparison that&#8217;d be valid for folks sending the same sort of content to the same sort of audience.</p>



<p>So, what can you do? And how much does your ESP affect your deliverability?</p>



<h3 class="wp-block-heading">If you have dedicated everything</h3>



<p>First, is your reputation going to be isolated from their other customers?</p>



<p>If you&#8217;re going to be sending from a dedicated IP address, and all your reverse DNS, SPF and DKIM is using your domain rather than one owned by the ESP then your sending infrastructure is pretty well isolated. If you&#8217;re using your own domain in link tracking and image loading URLs, and your own domain in any CDNs used for images, rather than one owned by the ESP then your content is pretty well isolated too.</p>



<p>If everything you&#8217;re doing is white-labeled to your domain then you are going to get the deliverability your content and practices deserve. The direct impact of your ESP choice is going to be minimal.</p>



<h3 class="wp-block-heading">If you have shared anything</h3>



<p>If any of the identifiers mail filters use to detect bad actors &#8211; spam, malware, phishing &#8211; are shared between your mail and mail from other customers of the ESP then things get a little trickier.</p>



<p>At it&#8217;s simplest, if one customer is sending bad mail from an IP address, all mail from that IP address will be treated as suspicious (and, fairly commonly, all blocked at some mailbox providers). If there&#8217;s a lot of unwanted mail being sent with using a particular hostname in links in the message then any other mail using those same links will be viewed with suspicion.</p>



<p>Sending from a shared IP pool is the most obvious shared identifier, but sharing SPF and DKIM identifiers are also important. And an often overlooked aspect of sharing is the URLs in the content of the message &#8211; the ESP will wrap links for click tracking, add hosted images for &#8220;open&#8221; tracking and host images on a CDN.</p>



<p>In this setup you are sharing to some extent the reputation of all the other ESP customers using the same identifiers.</p>



<p>Sometimes the result of that can be catastrophic &#8211; if another customer on the same shared pool you&#8217;re using is sending bad content, or if other customers consistently send bad content, then a mailbox provider may outright block the IP address of that shared pool. Suddenly none of the mail from that shared pool is delivered to that mailbox provider, including yours.</p>



<p>Sometimes it can be less obvious. If a significant fraction of mail being sent using the ESPs shared click tracking domain is unwanted, then use of that click tracking domain will be recognised as a sign of unwanted email. Real spam filtering is usually more complex than a SpamAssassin score, but if you think of it as &#8220;sends from this ESP&#8221; adding three to your emails SpamAssassin score that leaves you a lot less slack to avoid hitting a score of five and ending up in the spam folder.</p>



<p>Most of this filtering tracks behaviour over time. A single bad send, or even a single bad customer is unlikely to be enough to impact delivery for other ESP customers (though it could cause IP blocking of the shared pool in some cases, at some providers). But an ongoing pattern of low quality mail from an ESP will affect delivery of all their shared customers.</p>



<p>Most large consumer mailbox providers are pretty good at separating mail streams from shared IP pools, so that even if you&#8217;re using shared IPs and shared domains they can mostly distinguish your email stream from those of your ESPs other customers. If you&#8217;re a B2C sender this isn&#8217;t really something you need to care about at the Gmails, the Yahoos and the Microsofts. It&#8217;s something you&#8217;re more likely to see issues with at smaller providers, or with enterprise filters.</p>



<h3 class="wp-block-heading">So what should I be looking for?</h3>



<p>Some folks may, at this point, say &#8220;Well, obviously I should be demanding a dedicated IP!&#8221;.</p>



<p>Dedicated IPs are expensive resources. If you&#8217;re sending huge volumes of mail then you need one, for network engineering reasons. But if you&#8217;re sending less&#8230;</p>



<p>There&#8217;s <em>probably</em> no real threshold of volume below which you absolutely shouldn&#8217;t be using a dedicated IP, but if you&#8217;re sending small amounts of mail &#8211; less than a million a week, perhaps? &#8211; building initial good deliverability on a dedicated IP may be harder.</p>



<p>Also, shared reputation across customers isn&#8217;t always a bad thing. If you&#8217;re one of a hundred customers in a pool and you do a bad thing, like sending to your suppression list, then the impact of that will be mitigated by the other customers using the shared identifiers. As long as they&#8217;re all good customers, mostly sending good email they&#8217;ll be supporting each other.</p>



<p> If you&#8217;re a smaller sender, you&#8217;re probably happy on your ESPs shared pools and &#8211; <em>as long as most of your ESPs customers are good senders</em> &#8211; will be able to build and maintain excellent deliverability. </p>



<p>You might still want to use your own domains for authentication and click tracking. That&#8217;ll isolate your reputation somewhat from other customers using the pool, and it&#8217;ll make it easier to move the good reputation you&#8217;ve built to another ESP. So if the ESP offers white label DKIM and SPF authentication that&#8217;s good. White label click tracking is nice to have too. </p>



<h3 class="wp-block-heading">Are my ESPs other customers good?</h3>



<p>This is an important thing to find out, but it&#8217;s really hard to measure directly. Spam filter operators will have a fairly shrewd idea, but that&#8217;s not data they&#8217;ll share (and it&#8217;ll change over time). You could check some of their IP addresses or domains on one of the multi-blacklist lookup sites &#8211; but most of the lists they check aren&#8217;t at all useful, and even for the few that are they only provide a snapshot of whether the ESP is listed <em>now</em> &#8211; and even some of the best ESPs may occasionally get listed.</p>



<p>But we can get some hints as to whether they allow customers to send spam from their network. Check their webpage. Is there a link to their acceptable use policy or terms of service? Does it forbid users from spamming? That might be phrased as requiring evidence of consent, requiring permission, an explicit ban on purchased lists, banning sending unsolicited messages, or banning use of third-party lists.</p>



<p>If you can easily find their AUP, and it forbids their customers from sending spam that&#8217;s a good sign that they don&#8217;t encourage spammers on their network. We maintain a <a href="https://wordtothewise.com/2015/05/purchased-lists-and-esps/">list of ESPs that require good practices</a> if you&#8217;d like somewhere to start. If you can&#8217;t find it, or it allows spam then that&#8217;s a bad sign.</p>



<p>Clearly stated policies are a good start, but whether they&#8217;re enforced matters too. That&#8217;s hard to measure, but a critical part of policy enforcement is having staff to do the work, and the infrastructure needed to do it.</p>



<p>If you&#8217;re a potential customer you might send an email to abuse@your-new-esp.com explaining that you&#8217;re evaluating them, and can they send you a link to their acceptable use policy.</p>



<p>If the email bounces, the ESP doesn&#8217;t have a functional abuse desk. If it returns an autoresponse saying the mail has not been read, they don&#8217;t have a functional abuse desk. If it requires you to fill out a web form, they don&#8217;t have a functional abuse desk.</p>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow">
<p>550-5.7.1&nbsp;Please do not reply to this email. If you wish to reply, please click<br>&nbsp;&nbsp;&nbsp;550-5.7.1 on this &lt;link&gt; to update your<br>550-5.7.1 ticket, track the status, or close your ticket directly via the<br>550 5.7.1 console. &#8211; gcdp 5614622812f47-3f3af4a1d55si1924262b6e.281</p>
<cite>This is really not a good sign</cite></blockquote>



<p>If it just vanishes and you never hear back, or you get an automatic response and nothing more that&#8217;s not a great sign, but it might just mean their abuse desk is overwhelmed and doesn&#8217;t have the capacity to reply to email, or is forbidden by policy from doing so. And sometimes it means that they accept and discard all mail sent to their abuse alias (yes, I&#8217;ve been told by abuse staff at very large providers whose name you&#8217;d recognise that they do this). It&#8217;s hard to distinguish between those cases, unfortunately. </p>



<p>If you get a response with useful information, whether it be boilerplate or from a human being that suggests there&#8217;s a functional abuse desk there, with the resources and policies to do <em>something</em>. And that&#8217;s a really, <em>really</em> good sign that their customers are probably, on average, over time sending mostly wanted email. And that&#8217;s what you want your co-customers on an ESP to be doing.</p>



<h3 class="wp-block-heading">Indirect ESP effects on deliverability</h3>



<p>If we&#8217;re concerned about deliverabilty there are some things we&#8217;d really like an ESP to do for us that aren&#8217;t directly connected to their ability to deliver our email to the inbox.</p>



<p>Most of the time the reason we&#8217;re having problems delivering email is because of something we&#8217;re doing. Identifying why, and fixing it, requires some resources from the ESP.</p>



<p>Do they have in-house delivery expertise to help? This is expensive to offer, and likely not available to small customers but can be extremely valuable.</p>



<p>Do they provide access to any third party delivery monitoring services, such as probe accounts? The value of these is arguable, but if there&#8217;s easy access to that additional data that&#8217;s good to know.</p>



<p>Does their reporting of delivery data provide what you need to diagnose a problem? Does it let you track metrics over time? Does it let you break down metrics by recipient mailbox provider (even at the level of gmail / google apps vs office 365 vs yahoo vs everyone else)? Does it let you get the <a href="https://wordtothewise.com/2025/01/diagnosing-hard-bounces/">actual rejection messages</a> for bounced email?</p>



<h3 class="wp-block-heading">It&#8217;s not all about deliverability</h3>



<p>While deliverability is a critical aspect for an email campaign &#8211; if the mail doesn&#8217;t make it to the recipients inbox then every other aspect you worked on is wasted &#8211; it&#8217;s definitely not the most important measure for an ESP. Not least because deliverability is mostly driven by your behaviour, not the ESPs.</p>



<p>Ease of use, decent automation, segmentation, responsive customer support, great templating, A/B testing, reporting, integration with other tools you use and just &#8220;are they going to be a pleasant company to work with&#8221; are all at least as important.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/02/how-to-choose-an-esp-based-on-deliverability/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17095</post-id>	</item>
		<item>
		<title>Don&#8217;t add your domain to the Public Suffix List</title>
		<link>https://wordtothewise.com/2025/02/dont-add-your-domain-to-the-public-suffix-list/</link>
					<comments>https://wordtothewise.com/2025/02/dont-add-your-domain-to-the-public-suffix-list/#comments</comments>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Wed, 05 Feb 2025 16:14:14 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[dmarc]]></category>
		<category><![CDATA[domains]]></category>
		<category><![CDATA[public suffix list]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17091</guid>

					<description><![CDATA[Adding your domain to the public suffix list might break all your email.]]></description>
										<content:encoded><![CDATA[
<p>(At least, not if you ever intend to use it for email. It might break the domain for email, maybe forever.)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="450" height="300" src="https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-450x300.jpg" alt="" class="wp-image-17092" srcset="https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-450x300.jpg 450w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-300x200.jpg 300w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-150x100.jpg 150w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-768x512.jpg 768w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-1536x1024.jpg 1536w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-2048x1365.jpg 2048w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-1920x1280.jpg 1920w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-720x480.jpg 720w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-580x387.jpg 580w, https://wordtothewise.com/wp-content/uploads/2025/02/chuttersnap-cGXdjyP6-NU-unsplash-320x213.jpg 320w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>



<p>The <a href="https://publicsuffix.org">Public Suffix List</a> is a manually maintained list of domains that&#8217;s mostly used to help web browsers prevent data stored by one web site being seen or modified by another. As most websites use cookies to secure user logins that&#8217;s critically important.</p>



<p>Loosely, the Public Suffix List allows a browser to know that login.blighty.com<sup data-fn="f62f13a0-ce88-416c-8a94-2ef5deca7cff" class="fn"><a href="#f62f13a0-ce88-416c-8a94-2ef5deca7cff" id="f62f13a0-ce88-416c-8a94-2ef5deca7cff-link">1</a></sup> and images.blighty.com are operated by the same owner, and should potentially have access to cookies set by the other. And, conversely, that login.example.com and login.example.org shouldn&#8217;t have access to each others cookies.</p>



<p>As well as traditional &#8220;top level domains&#8221; like .com or .ac.uk the public suffix list also accepts submissions from domain owners who want browsers to enforce this sort of segregation between their subdomains. A common example is a service where customer maintained web content is available at customer specific subdomains, perhaps for personal blogs where &#8220;https://steves-blog.example.com/&#8221; is a more saleable service than &#8220;https://example.com/~steves-blog&#8221;.</p>



<p>If you&#8217;re offering this sort of service you should think about registering the domain you host your customer content under with the public suffix list. It adds significant security between your users.</p>



<h3 class="wp-block-heading">But</h3>



<p><strong>But</strong>. If you add your domain you might make it unusable for use in email. Perhaps forever.</p>



<p>How so? <a href="https://wordtothewise.com/2017/12/organizational-domain/">DMARC uses the public suffix list</a> as part of its algorithm to decide whether two hostnames (such as the one in the From: headers and the d= in the DKIM signature) are aligned. If they&#8217;re not aligned, DMARC will fail.</p>



<p>And if you add example.com to the public suffix list, example.com will not be considered aligned with anything. And immediate subdomains, such as a.example.com and b.example.com won&#8217;t be considered aligned with each other.</p>



<p>That means there&#8217;s no way to get SPF alignment if you have &#8220;From: &lt;hello@example.com>&#8221; as your from address. Normally you&#8217;d use a subdomain (e.g. bounces.example.com) in your return path, allowing your ESP to handle bounces and still get DMARC alignment. But that won&#8217;t work now. Oops.</p>



<p>DKIM is only going to be considered aligned if the d= domain is identical to the domain in the From: header, so use of d= subdomains to identify different mail streams is right out. And, depending on how the recipients&#8217; DMARC checker is implemented, even mail with identical From and d= domains might not be treated as aligned.</p>



<p>As DMARC moves towards a required part of email this gets worse.</p>



<h3 class="wp-block-heading">Forever?</h3>



<p>You can remove a domain from the public suffix list &#8211; but it&#8217;s not a list that&#8217;s queried in real time. Rather it&#8217;s downloaded once by a software developer, compiled into an efficiently searchable data structure. That&#8217;s then compiled in to a piece of software and sent to users.</p>



<p>Maybe the developer will update the copy of the PSL they use for each release. Maybe they won&#8217;t. They&#8217;re probably using an upstream library rather than implementing it themselves, and due to dependency management even if the upstream library is updated the application using it may still use the older version of it. Perhaps for years, perhaps forever.</p>



<p>And even if the application is updated, that doesn&#8217;t mean it&#8217;ll be updated on ISPs machines immediately.</p>



<p>This isn&#8217;t theoretical. I&#8217;m seeing DMARC failures at Gmail that I can&#8217;t explain any other way for a domain that was removed from the public suffix list nearly a year ago.</p>



<h3 class="wp-block-heading">This seems bad</h3>



<p>It does. Piggybacking email authentication onto a browser cookie security infrastructure may not have been the best idea.</p>



<p>There is <a href="https://datatracker.ietf.org/doc/rfc9091/">work being done</a> to move DMARC away from using the PSL, rather using records added to DNS. It&#8217;s not clear when, or if, it&#8217;ll be universally supported but it&#8217;s likely to be used by large mailbox providers, at least, eventually.</p>



<p>The nice folks at the public suffix list use git to track changes to the list, so if you ever need to check whether a domain has ever been on the public suffix list you can do this to see all the changes:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ git <span class="hljs-keyword">clone</span> https:<span class="hljs-comment">//github.com/publicsuffix/list.git</span>
$ cd <span class="hljs-keyword">list</span>
$ git log --follow -p -- public_suffix_list.dat | less</code></span></pre>

<ol class="wp-block-footnotes"><li id="f62f13a0-ce88-416c-8a94-2ef5deca7cff">I use blighty.com as an example domain a lot, as it&#8217;s a domain I own and it&#8217;s a bit more interesting than using <a href="https://tools.wordtothewise.com/rfc6761">example.com</a> everywhere. Maybe I should let friends volunteer their domains for <a href="https://en.wikipedia.org/wiki/Tuckerization">tuckerization</a>? <a href="#f62f13a0-ce88-416c-8a94-2ef5deca7cff-link" aria-label="Jump to footnote reference 1"><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/02/dont-add-your-domain-to-the-public-suffix-list/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17091</post-id>	</item>
		<item>
		<title>Are Complaints Weighted?</title>
		<link>https://wordtothewise.com/2025/01/are-complaints-weighted/</link>
					<comments>https://wordtothewise.com/2025/01/are-complaints-weighted/#respond</comments>
		
		<dc:creator><![CDATA[laura]]></dc:creator>
		<pubDate>Fri, 31 Jan 2025 11:47:37 +0000</pubDate>
				<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Industry]]></category>
		<category><![CDATA[complaint]]></category>
		<category><![CDATA[complaint rates]]></category>
		<category><![CDATA[FBLs]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17085</guid>

					<description><![CDATA[I&#8217;ve been doing a lot of my question answering over on the Email Geeks slack and have decided to bring some of the answers over here. Today&#8217;s question: My ESP provides a dashboard of spam complaints. How should I be looking at the data? Are some complaints more important than others? The spam complaint dashboard [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve been doing a lot of my question answering over on the Email Geeks slack and have decided to bring some of the answers over here. Today&#8217;s question: </p>



<p><em>My ESP provides a dashboard of spam complaints. How should I be looking at the data? Are some complaints more important than others? </em></p>



<p>The spam complaint dashboard is a record of the feed back loop messages (FBLs) that an ESP has received about a message. Those messages are sent by the ISP when the recipient marks the message as spam in the user interface of that provider.</p>



<p>Complaints should be viewed as a percentage of the messages that were delivered to the inbox at that provider. So if you send 50,000 emails in total and 1000 go to&nbsp;<a href="http://libero.it/" target="_blank" rel="noreferrer noopener">libero.it</a>, and you get 5 complaints from&nbsp;<a href="http://libero.it/" target="_blank" rel="noreferrer noopener">libero.it</a>, then your complaint rate is 0.5% not 0.01%, assuming 100% inbox delivery. </p>



<p>Complaints are a part of the filtering and reputation system used by the recipient ISP to filter mail and determine how future mail will be delivered. The ISPs only care about complaints for the mail they see, they don&#8217;t care about complaints from any other provider.</p>



<p>You should have almost zero <a href="http://gmail.com/" target="_blank" rel="noreferrer noopener">gmail.com</a> complaints, because gmail doesn&#8217;t send complaints back to anyone. Sometimes you will occasionally see <a href="http://gmail.com/" target="_blank" rel="noreferrer noopener">gmail.com</a> complaints from Yahoo when mail is forwarded due to the ways Yahoo manages their complaint feedback loop. The only complaint data Gmail provides is the percentage of complaints and, sometimes, a identifier string in the Google Postmaster Tool interface. </p>



<p>ESPs use complaints to determine if their customers are violating their AUP and if they need to have action taken against them. In that respect, the &#8220;weighting&#8221; depends on the different policies of the ESPs (and they&#8217;re often not public).</p>



<p>It&#8217;s generally accepted that complaint rates over 0.3% are bad and that complaint rates below 0.1% are acceptable. </p>



<p>A couple things to note about complaints: </p>



<ul class="wp-block-list">
<li>Not all ISPs provide feedback loop emails to senders including some of the major broadband providers outside the US, Apple Mail and Gmail. </li>



<li>FBLs are solely for mail to consumer domains. Microsoft has a full FBL infrastructure built into O365 and their consumer but only send FBLs for mail to their consumer domains. </li>



<li>Not all &#8220;this is spam&#8221; buttons are tied to a FBL. Apple mail users, for instance, have a &#8220;junk&#8221; button but it only affects filters for that user and does not trigger a FBL complaint to go back to the ESP. </li>



<li>Not all ESPs pay Validity the exorbitant amount they&#8217;re charging for <a href="https://wordtothewise.com/2023/09/validity-charging-for-feedback-loop-emails/" data-type="post" data-id="16547">FBL feeds</a>. </li>



<li>Complaint rates as viewed by the ISPs are different than the complaint rates as viewed by the ESPs. ISPs will always have a more accurate view of complaints.</li>



<li>Users are not permitted to report mail in the bulk folder, so a lack of reports for senders may mean there are already delivery problems. </li>



<li>Complaints are very noisy for small senders as users can sometimes report spam by mistake or incorrectly use the spam button instead of delete or trash. </li>
</ul>



<p>Overall, complaints are a great way to monitor what your recipients think about the email you&#8217;re sending them. For ESPs and compliance desks they&#8217;re a good way to monitor which customers may have issues that need to be addressed before their mail is spam foldered or blocked at the ISPs. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/01/are-complaints-weighted/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17085</post-id>	</item>
		<item>
		<title>Diagnosing Hard Bounces</title>
		<link>https://wordtothewise.com/2025/01/diagnosing-hard-bounces/</link>
					<comments>https://wordtothewise.com/2025/01/diagnosing-hard-bounces/#respond</comments>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 10:43:46 +0000</pubDate>
				<category><![CDATA[Delivery Improvement]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[bounce]]></category>
		<category><![CDATA[bounce handling]]></category>
		<guid isPermaLink="false">https://wordtothewise.com/?p=17082</guid>

					<description><![CDATA[A very short post about diagnosing hard bounces, because I&#8217;ve had to give the same advice to a dozen folks over the past few months. When you&#8217;re diagnosing and mitigating hard bounce rates the first thing you&#8217;ll see is your ESPs dashboard or reporting. It&#8217;ll tell you how many emails you sent bounced, and how [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>A very short post about diagnosing hard bounces, because I&#8217;ve had to give the same advice to a dozen folks over the past few months.</p>



<p>When you&#8217;re diagnosing and mitigating hard bounce rates the first thing you&#8217;ll see is your ESPs dashboard or reporting. It&#8217;ll tell you how many emails you sent bounced, and how that number has changed over time. A useful start.</p>



<p>But a hard bounce can be caused by <a href="https://wordtothewise.com/2019/11/theres-something-about-bounces/">any of a dozen or more reasons</a>, and they&#8217;ll imply different causes for the issue, and very different approaches to mitigation.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="450" height="405" src="https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-450x405.png" alt="A Venn diagram based on bounce handling classification rules from 3 individual ESPs. The diagram shows overlapping sets of &quot;hard bounce&quot; &quot;soft bounce&quot; and &quot;spam bounce&quot; along with a frustrated stick figure trying to make sense of the confusion." class="wp-image-15838" srcset="https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-450x405.png 450w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-150x135.png 150w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-300x270.png 300w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-768x691.png 768w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-343x309.png 343w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-227x204.png 227w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1-178x160.png 178w, https://wordtothewise.com/wp-content/uploads/2019/11/BouncesFrustrationBlog-1.png 1126w" sizes="auto, (max-width: 450px) 100vw, 450px" /><figcaption class="wp-element-caption">It&#8217;s worse than this now. </figcaption></figure>



<p>The first thing you want to do is to find out details of what&#8217;s causing your bounces, by getting hold of the actual rejection messages the recipient ISP returned. They might be available somewhere in your ESP reporting, or you might need to reach out to your support contacts to get them. But an ESP will have access to them (if they don&#8217;t &#8230; think about looking for a better ESP).</p>



<p>They&#8217;re easy to recognise &#8211; they&#8217;ll start with a three digit number, typically starting with a 5 (or maybe a 4). After that will be some human readable text, and maybe a link to a web page.</p>



<p>The human readable text will describe why the email was rejected. If there&#8217;s a link that page will give you more information about the recipient ISPs expectations, and what needs to be improved.</p>



<p>That might be enough for you to understand what&#8217;s going on, and if it&#8217;s not then those rejection messages are what any expert you ask for help is going to want to see.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://wordtothewise.com/2025/01/diagnosing-hard-bounces/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17082</post-id>	</item>
	</channel>
</rss>
