{"id":794,"date":"2026-10-02T04:05:56","date_gmt":"2026-10-02T04:05:56","guid":{"rendered":"https:\/\/text.email\/blog\/?p=794"},"modified":"2026-10-02T06:43:00","modified_gmt":"2026-10-02T06:43:00","slug":"smtp-chunking-and-bdat","status":"publish","type":"post","link":"https:\/\/text.email\/blog\/smtp-chunking-and-bdat\/","title":{"rendered":"text.email Now Supports SMTP CHUNKING and BDAT"},"content":{"rendered":"\n<p>text.email now supports <strong>SMTP CHUNKING and the BDAT command<\/strong>, giving email servers another way to deliver messages to our email-to-text gateway.<\/p>\n\n\n\n<p>This update comes into play when an application, monitoring system, or mail server sends an alert using a format that needs chunked SMTP delivery.<\/p>\n\n\n\n<p>It also addresses a compatibility issue that can affect messages traveling through Microsoft 365: emails containing certain nonstandard line breaks can fail when the receiving server does not support BDAT.<\/p>\n\n\n\n<p><strong>There is no new account setting to enable<\/strong>. Your sending mail server can detect this capability automatically when it connects to text.email.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why an Email-to-SMS Service Like text.email Needs to Support Different Ways of Sending Email<\/h2>\n\n\n\n<p>A text.email notification starts as an email. Before we can turn it into a text message, the system sending that email has to transfer it to our server.<\/p>\n\n\n\n<p>For example, your monitoring application might generate an alert, pass it to your organization\u2019s mail server, and have that server deliver it to your text.email address.<\/p>\n\n\n\n<p>If the email transfer fails, text.email never gets a complete message to process. The phone number can be correct and the alert can be perfectly understandable to a person, but a protocol compatibility issue can still interrupt delivery.<\/p>\n\n\n\n<p>Adding BDAT support expands the ways our server can receive that email. The benefit is especially relevant to administrators connecting existing software to text.email, where the application and mail infrastructure determine how the message is transmitted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Are SMTP CHUNKING and BDAT?<\/h2>\n\n\n\n<p><strong>CHUNKING<\/strong> is an SMTP extension that lets a sending server transfer an email in one or more chunks. <strong>BDAT<\/strong> is the command used to send those chunks.<\/p>\n\n\n\n<p>Each command specifies the exact number of bytes that follows, and <code>LAST<\/code> marks the final chunk. (The extension is defined in <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc3030.html\">RFC 3030<\/a>.)<\/p>\n\n\n\n<p>Here is a simplified example. The bracketed descriptions stand in for the actual email bytes; this is an illustration, not a script to paste into a terminal.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sender: BDAT 1000\nSender: &#91;Exactly 1,000 bytes of message content]\nServer: 250 OK\n\nSender: BDAT 500 LAST\nSender: &#91;The remaining 500 bytes of message content]\nServer: &#91;Final SMTP response]<\/code><\/pre>\n\n\n\n<p>The sender can also transfer the entire email in a single chunk. In our implementation, text.email collects the chunks and passes the assembled email into its existing processing flow after the final chunk arrives. Receiving an intermediate chunk does not trigger an SMS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How is this different from the usual DATA command?<\/h3>\n\n\n\n<p>Traditional SMTP transfers use the <code>DATA<\/code> command. After the server signals that it is ready, the sender transmits the email and ends it with a line containing a single period. A process called \u201cdot-stuffing\u201d protects periods at the beginning of lines from being mistaken for that terminator. This behavior is described in the <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc5321.html#section-4.5.2\">SMTP specification<\/a>.<\/p>\n\n\n\n<p>BDAT uses byte counts to identify chunk boundaries. It does not use that period-based ending or apply DATA-style dot-stuffing. A sender learns whether it can use BDAT from the receiving server\u2019s <code>EHLO<\/code> response: the advertised capability is <code>CHUNKING<\/code>.<\/p>\n\n\n\n<p>Our SMTP server now includes <code>CHUNKING<\/code> in that response. Existing senders using <code>DATA<\/code> can continue using it, and compatible senders have the additional BDAT option.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why this matters for Microsoft 365 and bare line feed errors<\/h3>\n\n\n\n<p>One practical reason to support BDAT is a delivery problem involving <strong>bare line feeds<\/strong>.<\/p>\n\n\n\n<p>Email normally uses a carriage return followed by a line feed, written as <code>CRLF<\/code>, to end a line. A bare line feed is an <code>LF<\/code> without the preceding <code>CR<\/code>. An automatically generated email can contain these line endings even when its visible content looks ordinary.<\/p>\n\n\n\n<p>Microsoft documents an Exchange Online delivery failure with the code <code>550 5.6.11<\/code> when a message contains bare line feeds and the destination cannot accept them. SMTP CHUNKING\/BDAT support at the destination is a way to handle this transfer. (Microsoft 365 no longer removes bare line feeds like it used to, in part to better support email security standards such as DKIM. See <a href=\"https:\/\/learn.microsoft.com\/en-us\/troubleshoot\/exchange\/email-delivery\/ndr\/fix-error-code-550-5-6-11-in-exchange-online\">Microsoft\u2019s explanation of error 550 5.6.11<\/a>.)<\/p>\n\n\n\n<p>For text.email users, this makes BDAT more than an obscure protocol feature. An automated alert may pass through Microsoft 365 on its way to a phone, and the receiving gateway needs to support the transfer method that the mail system requires.<\/p>\n\n\n\n<p>If an earlier attempt to send an alert to text.email failed specifically because the destination lacked CHUNKING or BDAT support, try that notification again. Other rejection reasons still need to be investigated separately.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What We Added to text.email<\/h2>\n\n\n\n<p>Our implementation covers the complete chunked-message transaction, including the boundaries and failure cases that matter when real mail servers communicate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single-chunk and multi-chunk messages.<\/strong> The receiver handles an email sent in one transfer or divided across several BDAT commands.<\/li>\n\n\n\n<li><strong>Correct handling across chunk boundaries.<\/strong> Chunks are collected as bytes before the assembled content reaches our existing text-processing integration. A multibyte UTF-8 character split between chunks is not decoded separately on each side of the boundary.<\/li>\n\n\n\n<li><strong>Final-chunk handling.<\/strong> Processing waits for <code>LAST<\/code>, including the case where a sender finishes with an empty <code>BDAT 0 LAST<\/code> chunk.<\/li>\n\n\n\n<li><strong>Message-size enforcement across the whole transfer.<\/strong> Dividing a message into smaller chunks does not bypass the configured total message-size limit.<\/li>\n\n\n\n<li><strong>Handling of failed and interrupted transfers.<\/strong> Incomplete payloads are not delivered as complete messages. Rejected chunks with known lengths are consumed without treating their content as new SMTP commands.<\/li>\n\n\n\n<li><strong>Continued support for DATA.<\/strong> Our regression coverage includes separate DATA and BDAT transactions on the same connection.<\/li>\n<\/ul>\n\n\n\n<p>We added protocol regression coverage for these cases, including delayed network fragments, literal period-only lines inside the payload, transaction resets, and successive messages. These checks exercise the listener\u2019s protocol handling without sending real text messages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does \u201cchunking\u201d mean the recipient gets more text messages?<\/h3>\n\n\n\n<p><strong>No. SMTP chunks and SMS segments are different things.<\/strong><\/p>\n\n\n\n<p>SMTP chunking controls how an email travels from a sending server to text.email. SMS segmentation happens later, when text.email prepares the content for delivery to a phone.<\/p>\n\n\n\n<p>An email transferred in ten BDAT chunks is still one incoming email. Those ten chunks do not become ten texts. The outgoing message count depends on the content, recipients, and applicable account settings \u2014 not the number of SMTP chunks used to transport the email.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does this add BINARYMIME or new attachment support?<\/h3>\n\n\n\n<p>This release adds <code>CHUNKING<\/code> and <code>BDAT<\/code> support. Our server does <strong>not<\/strong> advertise <code>BINARYMIME<\/code>, which is a separate capability described alongside CHUNKING in <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc3030.html#section-3\">RFC 3030<\/a>.<\/p>\n\n\n\n<p>That&#8217;s because our downstream integrations process email as text. We are not claiming unrestricted binary-message handling. An email with an attachment delivered through BDAT still goes through text.email\u2019s existing <a href=\"https:\/\/text.email\/blog\/email-attachments-in-text-messages\/\" data-type=\"post\" data-id=\"609\">attachment<\/a> and message-processing features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">So&#8230; Do You Need to Take Any Action?<\/h2>\n\n\n\n<p>Mostly no, unless you&#8217;re still seeing errors.<\/p>\n\n\n\n<p>You can <strong>keep sending to your existing text.email addresses<\/strong> like you have been; there&#8217;s no toggle in the account settings for SMTP CHUNKING or BDAT. And you don&#8217;t need to send to different email addresses.<\/p>\n\n\n\n<p>This all happens behind the scenes: the SMTP conversation between your mail system and our server determines whether the email uses DATA or BDAT.<\/p>\n\n\n\n<p>If you&#8217;re the administrator of your sending system, your SMTP logs can help confirm what&#8217;s happening: look for <code>CHUNKING<\/code> in the destination\u2019s EHLO response, <code>BDAT<\/code> during the message transfer, and the final server response. Note: An acknowledgment of an intermediate chunk only confirms receipt of that chunk; it does not establish that a text has reached the recipient\u2019s phone.<\/p>\n\n\n\n<p>If you&#8217;re troubleshooting a failed notification, keep the full bounce message or SMTP error, the approximate sending time, and the sending system\u2019s name. Those details help distinguish an email-transfer problem from a later message-processing or delivery issue.<\/p>\n\n\n\n<p>To use email as a quick and easy way to get text alerts, check out <a href=\"https:\/\/text.email\/\">text.email<\/a>. If you previously ran into a BDAT-related delivery failure, this is a good time to retry your integration.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We&#8217;ve added SMTP CHUNKING and BDAT support to text.email. Learn how this improves email-to-text compatibility and why it&#8217;s important for Microsoft 365 delivery errors.<\/p>\n","protected":false},"author":1,"featured_media":805,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,8],"tags":[],"class_list":["post-794","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-email-to-sms","category-text-email-tips"],"_links":{"self":[{"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/posts\/794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/comments?post=794"}],"version-history":[{"count":4,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/posts\/794\/revisions"}],"predecessor-version":[{"id":807,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/posts\/794\/revisions\/807"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/media\/805"}],"wp:attachment":[{"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/media?parent=794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/categories?post=794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/text.email\/blog\/wp-json\/wp\/v2\/tags?post=794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}