{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/how-to-get-emails-delivered/","result":{"data":{"site":{"siteMetadata":{"title":"The Official MailPace Blog","author":"Paul, founder of MailPace"}},"mdx":{"id":"c2cfa8a4-d2f8-55c8-87a3-61cd16b4f296","excerpt":"As a transactional email provider, deliverability is our number one priority. As such we employ a whole bunch of approaches to help ensure our customer's emails…","body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"How to get emails delivered\",\n  \"date\": \"2021-10-07T08:00:03.284Z\",\n  \"description\": \"What we do to ensure our email deliverability remains high\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"As a transactional email provider, deliverability is our number one priority. As such we employ a whole bunch of approaches to help ensure our customer\\u2019s emails get delivered.\"), mdx(\"p\", null, \"If you\\u2019re self hosting your own email, or looking to set up an email provider, this list may come in handy.\"), mdx(\"h2\", null, \"1. Don\\u2019t send spam\"), mdx(\"p\", null, \"It seems obvious, but anyone can sign up to an account at MailPace, and even legitimate senders can be victims of spammers. We\\u2019ve seen spam coming through contact forms, private message notifications and more. Anything that originates from your IP will be accredited to you, so \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"if there\\u2019s anywhere your users can input text, spammers will try to exploit it\"), \". And if your reputation starts to drop, so will your delivery rates.\"), mdx(\"p\", null, \"Here\\u2019s what we do to help stop this:\"), mdx(\"h3\", null, \"Spam filter on all outgoing emails\"), mdx(\"p\", null, \"We use \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://rspamd.com/\"\n  }, \"Rspamd\"), \" to filter every email sent through MailPace. Our filters are aggressive and we use the built in Neural network module to learn from spam we see in the wild. \"), mdx(\"p\", null, \"Rspamd can be confusing to configure, if you\\u2019re struggling, we\\u2019ve previously written about \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://blog.mailpace.com/blog/how-to-catch-spam-with-rspamd/\"\n  }, \"how to set up Rspamd\"), \".\"), mdx(\"h3\", null, \"Whitelisted file extension attachments\"), mdx(\"p\", null, \"We support attachments, but we only support a subset of file extensions (\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.mailpace.com/reference/send/#attachments\"\n  }, \"details in our docs\"), \"), and virus scan them before sending. While not perfect this significantly reduces the risk of dangerous files being sent through our service.\"), mdx(\"h3\", null, \"Proof of domain ownership\"), mdx(\"p\", null, \"Every domain must be verified using \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://blog.mailpace.com/blog/whats-a-DKIM-record/\"\n  }, \"DKIM\"), \". This is both to prove ownership of a domain, but also because most email servers will check DKIM signatures before delivery regardless.\"), mdx(\"h3\", null, \"No free plan\"), mdx(\"p\", null, \"Beware of email providers with free plans. Spammers still bring fraudulent credit cards to the table, but it\\u2019s much less common.\"), mdx(\"h3\", null, \"Manual review\"), mdx(\"p\", null, \"We manually review all new accounts, and actively disable any we think could be potential spam accounts. When someone signs up with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"support@onmicrosoft.com\"), \", you know something\\u2019s up. We will only reenable these accounts after discussing directly with the customer.\"), mdx(\"h2\", null, \"2. Be a good citizen\"), mdx(\"p\", null, \"Spammers rarely do all the things that \\u201Creal\\u201D senders do. There are a bunch of things your email server needs to do to fit in with the crowd. Not following these written and unwritten rules will hurt your delivery:\"), mdx(\"h3\", null, \"React to responses correctly\"), mdx(\"p\", null, \"How you react to SMTP responses is important. We parse each response and categorize them, taking action as appropriate. Sometimes this means manual intervention, in other situations we automate the expected behaviour.\"), mdx(\"p\", null, \"Generally the two main categories are:\"), mdx(\"h4\", null, \"A 4xx error, usually means try again later\"), mdx(\"p\", null, \"Email was designed to work in a world where devices were offline more often than online, so a 4xx error can happen for a whole bunch of transient reasons.\"), mdx(\"p\", null, \"From a deliverability perspective, the most common (especially for low volume senders) is a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Greylisting response\"), \". The server is asking you to wait and resend again in a few seconds or minutes. You must back-off and send again, ideally with an increasing time between each resend. Spammers usually don\\u2019t follow this kind of instruction, you must.\"), mdx(\"p\", null, \"This is a common reason why emails can be delayed by a few minutes, which can be very frustrating for end users.\"), mdx(\"h4\", null, \"A 5xx error == don\\u2019t send to me!\"), mdx(\"p\", null, \"You should not keep trying to send to these hard-bounced addresses. This can happen for a variety of reasons, but in theory it\\u2019s a permanent error.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"For any hard bounces we automatically add them to a block list and do not send any future emails to this address. Our users can remove emails from this list manually if they are confident the issue has been resolved.\")), mdx(\"h3\", null, \"Handle bounce reports\"), mdx(\"p\", null, \"Sometimes an email will be accepted, but the server will later find out it cannot deliver it. The server will then send a bounce response via email to the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ReplyTo\"), \" address. You need to ensure you\\u2019re able to pick up these bounce reports, parse them and take appropriate action on behalf of your users. \"), mdx(\"p\", null, \"These get mixed up with out of office auto-replies, which can be a real pain to work with.\"), mdx(\"h3\", null, \"Ramp up slow & steady\"), mdx(\"p\", null, \"Don\\u2019t procure a new IP address and start sending en masse. We rotate IPs into our test pool and warm them up very gradually, before making them available to our customers.\"), mdx(\"h3\", null, \"DKIM\"), mdx(\"p\", null, \"As mentioned above, enable this! All servers will check this.\"), mdx(\"h3\", null, \"SPF & DMARC\"), mdx(\"p\", null, \"You need to enable \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://blog.mailpace.com/blog/whats-an-spf-record/\"\n  }, \"Sender Policy Framework (SPF)\"), \", and it\\u2019s also helpful to enable \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://en.wikipedia.org/wiki/DMARC\"\n  }, \"DMARC\"), \" if your provider supports it.\"), mdx(\"h3\", null, \"TLS\"), mdx(\"p\", null, \"Support at least TLS 1.2+. TLS 1.1 and below are deprecated, if you want to work with all email servers ever, you can enable them - but at some point we all need to stop this.\"), mdx(\"h3\", null, \"Feedback Loops (FBLs)\"), mdx(\"p\", null, \"Feedback Loops are a mechanism to give email providers and large senders a notification \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://blog.mailpace.com/blog/what-happens-when-you-send-an-email-to-spam/\"\n  }, \"when a message is marked as spam\"), \" by end users. You need to register for them, and then handle any reports or complaints that you receive through the FBL.\"), mdx(\"h3\", null, \"No dedicated IPs\"), mdx(\"p\", null, \"Unless you\\u2019re sending 250k+ emails/month, from one domain, in a consistent pattern, having a dedicated IP address will hurt your deliverability. This is because your volume will be too low to build a good reputation.\"), mdx(\"p\", null, \"Most email providers will offer dedicated IPs at a very high price - it\\u2019s rarely worth it.\"), mdx(\"h3\", null, \"Help your users\"), mdx(\"p\", null, \"There are a bunch of things our users can do to help with their specific emails, things like link shorteners, html emails with only images, blocklisted domains in the email content etc. can trip spam filters. We actively review our outgoing spam scores and contact our users if we can help them improve.\"), mdx(\"h2\", null, \"3. Monitor everything\"), mdx(\"p\", null, \"We run monitoring and anomaly detection on our systems, automatically searching for things like:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Outgoing email spikes from specific domains\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"High spam detection rates or increasing Rspamd scores\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"High 4xx and 5xx SMTP responses\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Blocklist SMTP responses\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Long \\u201Ctime to inbox\\u201D times for 3x main providers (published on our \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://mailpace.com/\"\n  }, \"landing page\"), \")\")), mdx(\"p\", null, \"Additionally we manually review accounts regularly and monitor external blocklists and deliverability ratings for our IPs and domains. There are even some whitelists out there to get your IP on, which can help.\"), mdx(\"h2\", null, \"Wrap up\"), mdx(\"p\", null, \"As you can see there\\u2019s quite a lot here, and this is by no means an exhaustive list of all the techniques required to get emails delivered.\"), mdx(\"p\", null, \"If you\\u2019d like to take advantage of all the above for your Transactionl Email, without having to do anything yourself, sign up for an account with us: \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://mailpace.com/\"\n  }, \"mailpace.com\")), mdx(\"style\", {\n    \"className\": \"grvsc-styles\"\n  }, \"\\n  .grvsc-container {\\n    overflow: auto;\\n    -webkit-overflow-scrolling: touch;\\n    padding-top: 1rem;\\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\\n    padding-bottom: 1rem;\\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\\n    border-radius: 8px;\\n    border-radius: var(--grvsc-border-radius, 8px);\\n    font-feature-settings: normal;\\n  }\\n  \\n  .grvsc-code {\\n    display: inline-block;\\n    min-width: 100%;\\n  }\\n  \\n  .grvsc-line {\\n    display: inline-block;\\n    box-sizing: border-box;\\n    width: 100%;\\n    padding-left: 1.5rem;\\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\\n    padding-right: 1.5rem;\\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\\n  }\\n  \\n  .grvsc-line-highlighted {\\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\\n  }\\n  \\n\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"How to get emails delivered","date":"October 07, 2021","description":"What we do to ensure our email deliverability remains high"}}},"pageContext":{"slug":"/how-to-get-emails-delivered/","previous":{"fields":{"slug":"/what-is-reverse-dns-rdns/"},"frontmatter":{"title":"What is Reverse DNS (rDNS) and how does it work?"}},"next":{"fields":{"slug":"/why-I-use-tailwindcss/"},"frontmatter":{"title":"How I learned to stop worrying and love TailwindCSS"}}}},"staticQueryHashes":["1956864136","63159454"]}