RFC 2046 says the parts of a multipart/alternative message are ordered from less preferred to more preferred, with the preferred format last (RFC 2046). That gives a useful structural check, but it does not prove that a test inbox received readable text. For acceptance, verify the generated MIME content, inspect the message actually received, and confirm that its plain-text version preserves the HTML email’s key meaning and action. A successful local preview alone is not enough.
This guide is for developers generating HTML email for their own products, QA engineers adding actual-receipt evidence to template acceptance, and independent developers maintaining registration, notification, or transactional messages.
The acceptance boundary: generation versus receipt
Treat acceptance as evidence about a specific message in a specific test run. A result from a template preview, a send function, or an application log proves only what that component observed. It does not show that the delivered message contained usable plain text.
| Evidence layer | What it can establish | What it cannot establish by itself |
|---|---|---|
| Application generation | The application created a message or invoked its sending code | That the outgoing message contained the intended MIME parts |
| MIME structure | The inspected message has a text/plain part and the expected alternative structure |
That a recipient actually received or could read it |
| Send result or log | The sending component returned a result or recorded an event | That the message reached the test inbox |
| Actual test receipt | The received message was visible and its plain-text content could be checked | That other clients or recipient environments will behave the same way |
Keep the scope narrow: test your own product or an environment you are authorized to use. Use synthetic content rather than real customer or coworker details. A test message can contain a fake account name and a safe, non-sensitive action URL. Avoid copying personal data into logs or screenshots. For a broader look at handling data in a temporary inbox, see PostTmp’s privacy information.
The practical distinction is important. A template renderer can show that a text string exists in code. A sent message may still be assembled differently, encoded incorrectly, or rejected before it reaches the test address. Conversely, a message can arrive and appear readable while its raw MIME structure remains unverified. Record which layer each check covers.
Before sending: define the claim
Write down the result the test needs to prove before triggering a message. “The email works” is too broad to be a useful acceptance criterion. A better claim is: “For this registration email in this test run, the received message includes readable plain text, and the text communicates the same purpose and next action as the HTML version.”
Also identify the message type and the route that will trigger it. For example, a QA engineer testing a password-reset notification should use the product’s own reset flow in an authorized test environment. The test should not create accounts or send messages through unrelated third-party services.
A short test record should contain:
- The message type and the application environment.
- A run identifier or other non-sensitive way to associate the received message with the trigger.
- The evidence available: application output, raw MIME, received content, or some combination.
- Any unverified boundary, such as an unavailable raw-message view.
Do not place secrets, live reset tokens, or personal information in the record. If the message includes a one-time link, use a controlled test account and redact the token in saved screenshots or logs. The goal is to preserve enough evidence to repeat the check without retaining unnecessary sensitive content.
Generation: verify text/plain and MIME structure
Trigger a message through the product’s normal test path. Then inspect the final message produced by the application or mail pipeline, rather than relying only on the source template. The key question is whether a text/plain body is present in the message that proceeds to delivery.
The MIME standards distinguish content types and describe how multipart bodies are organized (RFC 2045). For a multipart/alternative message, check that the alternatives represent the same information in different formats. The ordering rule in RFC 2046, Section 5.1.4 is useful when inspecting the structure: alternatives are arranged in increasing order of preference, so the preferred representation is last.
That rule is not a guarantee that every mail client will choose or display content identically. Do not treat one client’s visual behavior as a universal MIME rule. The acceptance question here is more limited: does the message contain a plain-text alternative, and can a reader understand it?
| Check | Pass condition | Failure signal |
|---|---|---|
| Plain-text part | The inspected message contains a text/plain body |
The part is absent, empty, or contains only markup fragments |
| Alternative structure | The message uses the intended MIME structure for its alternatives | The message has an unexpected type or malformed boundary |
| Text encoding | Characters display as intended in the received content | Replacement symbols, broken characters, or unreadable encoded text |
| Run association | The received message can be tied to the test trigger without exposing a secret | The message cannot be distinguished from unrelated test traffic |
If the text contains non-ASCII characters, inspect the result after decoding rather than judging only a raw encoded body. UTF-8 represents code points using sequences of one to four octets, as specified by RFC 3629. That technical detail can help narrow an encoding defect, but a standards-compliant encoding declaration alone does not prove that the displayed message is correct.
Content review: check meaning, not matching strings
A plain-text alternative should stand on its own. It should explain why the message was sent, preserve essential instructions, and give the recipient enough context to act. It should not be a blank section, a strip of HTML tags, or a collection of unexplained template markers.
Compare the plain-text and HTML versions by information, not by exact wording. The two formats do not need identical sentences or layout. They do need to agree on consequential details: the purpose of the email, the required action, relevant deadlines if any, and the destination or meaning of important links.
For each important link, inspect its plain-text representation. The text should expose a usable destination or otherwise make clear how the recipient can complete the action. A label such as “Continue” without a URL may work in a rendered HTML button but leave the plain-text reader without an actionable route. If the email contains a link whose target is represented separately, confirm the actual target matches the intended action.
Look for meaning-changing differences, not cosmetic variation. A plain-text version that omits a secondary decorative line may be acceptable. One that drops a password-reset instruction, changes a support address, or points to a different action is not. Keep the review focused on this text-versus-HTML acceptance task; it is not a substitute for a separate accessibility review or client-rendering test.
A useful comparison record can note each key fact and whether both formats communicate it. For instance, a registration email might need to state that confirmation is required, identify the confirmation action, and explain what to do if the recipient did not request the message. The wording can differ, but the intent should not.
Actual receipt: inspect the message in a test inbox
Send the message to an authorized test receiving address and inspect what arrived. This is the point where a template check becomes a receipt check. Application logs and a successful return value can be useful supporting evidence, but neither should be recorded as proof that the test inbox received readable plain text.
Associate the message with its test run using a safe identifier. This could be a non-sensitive subject marker or a test case reference that does not reveal a real user’s identity. Then verify the received message’s visible plain-text content. If the receiving tool exposes the original message or raw MIME, inspect the MIME parts as well. If it exposes only user-visible content, report that limitation plainly: the test verified readable received content, not the underlying MIME structure.
The RFC 5322 message format defines the separation between message headers and body. That distinction matters when inspecting raw data: headers and delivery metadata are not a substitute for checking the message body. Likewise, a visible message body does not automatically reveal whether the application generated the intended alternative parts. Record the actual evidence, not an assumption about what a tool must have shown.
How to check that a test email contains a text/plain version
Inspect the generated or received message in a view that exposes its MIME parts. Confirm that a text/plain part exists and contains meaningful text. If the test inbox displays only the rendered message and offers no raw-message view, you can confirm visible readability there, but you cannot claim that you independently verified the underlying MIME structure.
How to use a test receiving address for actual-message review
Trigger the message from your own product, direct it to an authorized test address, and then match the received message to the run using a non-sensitive marker. Review the received text itself. Keep the environment and message type in the test record; receipt of one notification does not establish receipt of every message type your product sends.
For a temporary receiving option, check its current behavior and limitations before relying on it in a test workflow. PostTmp’s temporary inbox page can be reviewed as one possible starting point for receiving a test message; this article does not claim a particular retention period, delivery speed, or MIME-inspection feature.
Review and retest: separate content failures from delivery failures
A missing or unreadable text part is a content or message-construction failure. Return to the code that builds the message, its MIME assembly, and its encoding path. Correct the issue, trigger a new message, and inspect the new result. Do not use the previous message as evidence that the fix worked.
A message that does not arrive is a receipt-path failure for that run. The local text assertion may still indicate that the application generated a plain-text string, but it cannot pass actual-receipt acceptance. Record it as “not received” or “receipt unverified,” then investigate the test route separately. Avoid converting a successful send-function result into a delivery claim.
When the plain-text content differs from HTML
Compare the two versions against the acceptance criteria, not against each other’s exact sentences. If the plain-text version drops a required action or changes the destination, fail the content check and fix the template. If only the formatting or non-essential phrasing differs while the same purpose and action remain clear, note the difference without treating it as a defect.
This distinction prevents a common false pass: a text body exists, so the test is marked successful, even though it cannot tell the reader what to do. It also prevents a false failure: the text differs from the HTML word for word, so an otherwise complete alternative is rejected.
What to inspect in a multipart/alternative email test
Check that the intended alternatives are present, that the text part is readable, and that the versions agree on essential information. When raw MIME is available, verify the structure and part ordering against RFC 2046. When it is not available, limit the conclusion to what the receiving interface actually exposed. Do not infer universal client behavior from a single display.
Acceptance decision: choose the evidence level
Use these conditions to decide what to report:
- If the received message is available, the text is readable, and its key purpose and action match the HTML version, then accept the plain-text content for this test run.
- If raw MIME is also available and confirms the expected
text/plainalternative and structure, then record both content and MIME checks as verified. - If only the application output or local preview is available, then report generation evidence only; do not claim actual receipt.
- If the message arrived but its text is missing, garbled, or materially incomplete, then fail the content check and retest after correction.
- If the test inbox did not receive the message, then record receipt as unverified and investigate that path separately.
This decision rule keeps the claim proportional to the evidence. One successful message confirms only that specific message in the tested environment. It does not prove identical display in every client or successful delivery to every recipient environment.
Final record: scope the result to the test
Close the test with a short acceptance note. Include the email type, environment, run association, what was visible in the received message, whether raw MIME was inspected, and any known limitation. If a defect was fixed, identify the retest rather than merging the original failure and later pass into one vague result.
Keep conclusions precise. “The registration email received in the QA inbox had readable plain text, and its confirmation action matched the HTML version” is supportable when that is what the test observed. “All emails render correctly everywhere” is not. The result applies to the tested message and environment, not every mail client, recipient, or future template change.
For a one-off registration, demo, or verification-message check, a temporary receiving address can help keep test traffic separate from a personal inbox. It is not the right choice for accounts that require long-term recovery, ongoing replies, or durable access; use a controlled persistent test mailbox for those cases. When a temporary inbox fits the test, review PostTmp as one receiving option, then record exactly what its inbox let the QA run verify.
Task lasting more than a day? Give it a controllable alias
Forward long-term messages to your real inbox, then pause or delete the entry point when needed.