To test an HTML email with Ethereal, send it through an Ethereal SMTP account and inspect the captured message rather than delivering it to a real inbox. With Nodemailer, put your markup in the message’s html field, send the message, then call nodemailer.getTestMessageUrl(info) to get its preview link.
What Ethereal does—and what it does not
Ethereal Email is a fake SMTP service for development. It accepts outbound test messages for inspection and does not deliver them to the address in the message. You can therefore use a real-looking or made-up recipient address without sending the test email to that recipient.
| # | Preview | Product | Price | |
|---|---|---|---|---|
| 1 |
|
Modern HTML Email (Second Edition) | $13.55 | Buy on Amazon |
| 2 |
|
Create Stunning HTML Email That Just Works | $39.55 | Buy on Amazon |
| 3 |
|
Crafting HTML Email | $6.99 | Buy on Amazon |
| 4 |
|
HTML Examples: Html Workbook | $13.99 | Buy on Amazon |
| 5 |
|
HTML5 HTML Logo, Web Designer Frontend Software Engineer T-Shirt | $18.99 | Buy on Amazon |
As an Amazon Associate I earn from qualifying purchases.
A captured-message preview lets you inspect what Ethereal stored. It does not, by itself, establish that the email renders correctly in every real-world email client.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Send and preview an HTML email with Nodemailer
1. Create or reuse a test account
Ethereal provides account creation through its website and through Nodemailer’s createTestAccount(). The code below creates an account through Nodemailer. Install Nodemailer in your project first with npm install nodemailer.
#1 Best Overall
2. Send a message and get its preview URL
Save this as test-email.js and run it with Node.js. The generated account credentials are used only for the test transport; the HTML to inspect goes in the html property.
const nodemailer = require('nodemailer');
async function main() {
const account = await nodemailer.createTestAccount();
const transporter = nodemailer.createTransport({
host: account.smtp.host,
port: account.smtp.port,
secure: account.smtp.secure,
auth: {
user: account.user,
pass: account.pass,
},
});
const info = await transporter.sendMail({
from: 'Example App <[email protected]>',
to: '[email protected]',
subject: 'HTML email test',
text: 'A plain-text fallback for the test message.',
html: '<p><b>Hello</b> to myself!</p>',
});
console.log('Message ID:', info.messageId);
console.log('Preview URL:', nodemailer.getTestMessageUrl(info));
}
main().catch((error) => {
console.error('Email test failed:', error);
process.exitCode = 1;
});
Open the printed preview URL to inspect the captured message. Nodemailer’s homepage demonstrates the same basic flow, including an HTML body and generated preview URL; consult Ethereal’s homepage and your installed Nodemailer documentation for version-specific details.
3. Treat the preview URL as sensitive
The preview URL encodes access information. Do not publish it in a public issue, commit it to a repository, or expose it in logs that others can access. Use the Ethereal mailbox view or an IMAP/POP3 client if that better fits your workflow.
Connection settings and account behavior
Ethereal’s help page currently lists smtp.ethereal.email on port 587 with STARTTLS. The generated-account example above uses the host, port and secure setting returned by Nodemailer, so prefer those returned values over hard-coding settings that might not match an account. Check Ethereal’s SMTP/IMAP/POP3 help for the current connection details.
You can normally reuse an account; Ethereal says account details requested from the same process are cached in memory. Creating a fresh test account for every message is not necessary for the basic workflow. The service’s FAQ says captured messages are retained for “a few hours,” each address has a 100 MB quota, and public accounts can send up to 200 messages per hour; these are Ethereal service limits, and the FAQ does not give a publication year.
Public-account inbound mail is different
Public-account inbound receiving is disabled, and mail sent to public Ethereal addresses bounces. The primary public workflow is to send outbound test messages and inspect what was captured. Ethereal says inbound-capable accounts can be generated with Nodemailer v6.9.14 or newer when ETHEREAL_API_KEY is set; that key is tied to an active EmailEngine subscription. See the current Ethereal FAQ and help page for account qualifications.
Rank #3
Choose how to inspect the captured message
- Preview URL: The quickest route in a Nodemailer script; open the URL returned by
getTestMessageUrl(info). - Ethereal mailbox: Convenient when you want to browse captured messages through the web interface.
- IMAP or POP3: Useful when your existing mail-client workflow is more convenient; Ethereal confirms these access paths, but does not publish a comparative rendering-quality evaluation.
Troubleshooting
No preview URL appears
Check that sendMail() completed and that you pass its returned info object to nodemailer.getTestMessageUrl(info). Log the send result and any caught error so you can distinguish a failed send from a missing preview step.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →The test message never reaches the recipient
That is expected: Ethereal captures messages and does not deliver them to real inboxes. Inspect the message through its preview URL, mailbox, or a mail client instead.
Connection fails or times out
Confirm that the transport uses the account’s returned SMTP host, port, credentials and secure value. Ethereal currently lists port 587 with STARTTLS; check its help page if you are configuring settings manually.
Rank #4
Mail sent to an Ethereal address bounces
Public-account inbound mail is disabled. For ordinary HTML-email testing, send outbound through the Ethereal transport and inspect the captured copy. Inbound-capable accounts have separate requirements described in Ethereal’s FAQ and help page.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
If you need a screenshot of an email preview page or another web page, ScreenshotNeo is a website screenshot API and MCP server. It is not an email-delivery or email-client rendering test: first open the preview in a browser or other accessible page, then capture that page.
Free tools Windows power users keep installed
One-click scans. No signup required.
One-call cURL example, with the preview page URL in place of the sample target:
Best Value
- Lightweight, Classic fit, Double-needle sleeve and bottom hem
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://ethereal.email/ -o shot.webp
See the ScreenshotNeo documentation for request options. Cookie banners, popups and chat widgets are removed before the shot; bot checks, blank pages and failed loads are never billed. An MCP server lets AI agents take screenshots. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Sign up for ScreenshotNeo’s free plan.
Frequently Asked Questions
Should I generate a new Ethereal account for every message?
No. A test account can normally be reused; Ethereal says account details are cached in memory when accounts are requested from the same process.
Can I use Ethereal to verify how an email looks in Gmail or Outlook?
Ethereal’s captured-message preview shows the stored test message, but that alone does not validate rendering in every real-world email client.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




