This package provides a comprehensive set of Cypress commands designed specifically for interacting with Mailpit, a popular mail testing tool. This package supports TypeScript out of the box.
- Features
- Setup
- Commands Reference
- Mail Management
- Email Assertions
- Single Mail Operations
- Email Status Management
📨 Email Management: Get, search, send, and delete emails • Get emails by subject • Custom Mailpit URL support • TypeScript and Basic Auth integration
📝 Email Content: Access email body, subject, sender, recipients, and attachments • Spam Assassin summary analysis
📱 Status Control: Set email status (read/unread) for individual or all emails • Full status management capabilities
🚀 Coming Soon: More exciting features in development!
Install this package:
# npm
npm install --save-dev cypress-mailpit
# yarn
yarn add --dev cypress-mailpit
# pnpm
pnpm add -D cypress-mailpit
Include this package into your Cypress command file:
// cypress/support/commands
import 'cypress-mailpit';
Add the base URL of your Mailpit installation in the e2e
block of your cypress.config.ts
/ cypress.config.js
:
export default defineConfig({
projectId: "****",
env: {
MAILPIT_URL: "http://localhost:8025/",
},
});
Add MAILPIT_USERNAME
and MAILPIT_PASSWORD
in Cypress env config:
{
"MAILPIT_USERNAME": "mailpit username",
"MAILPIT_PASSWORD": "mailpit password"
}
Yields an array of all the mails stored in Mailpit starting from start
index up to limit
.
cy.mailpitGetAllMails().then((result) => {
expect(result).to.have.property('messages');
expect(result.messages).to.have.length(numberOfEmails);
expect(result.messages).to.be.an('array');
expect(result).to.have.property('tags');
expect(result).to.have.property('messages_count', numberOfEmails);
expect(result).to.have.property('start');
expect(result).to.have.property('total', numberOfEmails);
expect(result).to.have.property('count', numberOfEmails);
expect(result).to.have.property('unread');
});
Searches all mails from Mailpit using the given query and yields an array of matching mails starting from start
index up to limit
.
For more information about the query syntax, refer to the Mailpit documentation.
cy.mailpitSearchEmails('Test').then((result) => {
expect(result).to.have.property('messages');
expect(result.messages).to.have.length(numberOfEmails);
expect(result.messages).to.be.an('array');
expect(result.messages[0].Snippet).to.contain('Test');
expect(result.messages).to.have.length(numberOfEmails);
expect(result.messages).to.be.an('array');
expect(result).to.have.property('messages_count', numberOfEmails);
expect(result).to.have.property('total', 3);
expect(result).to.have.property('count', numberOfEmails);
});
Fetches all mails from Mailpit with the given subject starting from start
index up to limit
.
cy.mailpitGetEmailsBySubject('My Test').then((result) => {
expect(result).to.have.property('messages');
expect(result.messages).to.have.length(numberOfEmails);
expect(result.messages).to.be.an('array');
expect(result).to.have.property('messages_count', numberOfEmails);
expect(result).to.have.property('total', 2 * numberOfEmails);
expect(result).to.have.property('count', numberOfEmails);
});
Yields the mail with the given ID. If no ID is provided, yields the latest email.
cy.mailpitGetMail().then((result) => {
expect(result).to.have.property('ID');
expect(result).to.have.property('MessageID');
expect(result).to.have.property('From');
expect(result).to.have.property('To');
expect(result).to.have.property('Subject');
});
Sends an email with the given options. If no options are provided, sends a default email.
cy
.mailpitSendMail({ to: [{ Email: 'recipient@example.com' }], subject: 'Hello', text: 'Test message' })
.should('have.property', 'ID');
Fetches all emails from Mailpit sent to the given email address. Yields an array of matching emails.
cy.mailpitGetEmailsBySubject('recipient@example.com').then((result) => {
expect(result).to.have.property('messages');
expect(result.messages).to.have.length(numberOfEmails);
expect(result.messages).to.be.an('array');
expect(result).to.have.property('messages_count', numberOfEmails);
expect(result).to.have.property('total', 2 * numberOfEmails);
expect(result).to.have.property('count', numberOfEmails);
});
Checks if there are any emails in Mailpit with the given query. Automatically retries until the condition is met or timeout is reached.
cy.mailpitHasEmailsBySearch('subject:My Test');
Checks if there are any emails in Mailpit with the given search query. Automatically retries until the condition is met or timeout is reached.
cy.mailpitNotHasEmailsBySearch('Subject:My Test');
Checks if there are any emails in Mailpit with the given subject. Automatically retries until the condition is met or timeout is reached.
cy.mailpitHasEmailsBySubject('My Test');
Checks if there are no emails in Mailpit sent to the given email address. Automatically retries until the condition is met or timeout is reached.
cy.mailpitHasEmailsByTo('recipient@example.com', 0, 50, { timeout: 10000, interval: 500 });
Checks if there are no emails in Mailpit with the given subject. Automatically retries until the condition is met or timeout is reached.
cy.mailpitNotHasEmailsBySubject('My Test');
Checks if there are any emails in Mailpit sent to the given email address. If no emails are found, the command will retry until the timeout is reached.
cy.mailpitNotHasEmailsByTo('recipient@example.com');
In the MailpitCommands
module, the following default values are used:
- Timeout: The default value for
timeout
is determined by theCypress.config("defaultCommandTimeout")
. If not specified in the options, it will fallback to this configuration. - Interval: The default value for
interval
is set to500
milliseconds if not provided in the options.
Deletes all stored mails from Mailpit.
cy.mailpitDeleteAllEmails();
Deletes emails from the mailbox based on the search query.
cy.mailpitDeleteEmailsBySearch('subject:Test');
Yields the text body of the current mail.
cy
.mailpitGetMail()
.mailpitGetMailTextBody()
.should('contain', 'Message Body');
Yields the HTML body of the current mail.
cy
.mailpitGetMail()
.mailpitGetMailHTMlBody()
.should('contain', '<p>Message Body</p>');
Yields the sender address of the current mail.
cy
.mailpitGetMail()
.mailpitGetFromAddress()
.should('eq', 'sender@example.com');
Yields the recipient addresses of the current mail.
cy
.mailpitGetMail()
.mailpitGetRecipientAddress()
.should('contain', 'recipient@example.com');
Yields the subject of the current mail.
cy
.mailpitGetMail()
.mailpitGetSubject()
.should('eq', 'My Subject');
Yields the list of all filenames of the attachments of the current mail.
cy
.mailpitGetMail()
.mailpitGetAttachments()
.should('have.length', 2)
.should('include', 'sample.pdf');
Yields the SpamAssassin summary of the current mail.
cy
.mailpitGetMail()
.mailpitGetMailSpamAssainSummary()
.should('have.property', 'score');
Sets the status of all emails in Mailpit to 'read'.
cy.mailpitSetAllEmailStatusAsRead();
Sets the status of all emails in Mailpit to 'unread'.
cy.mailpitSetAllEmailStatusAsUnRead();
Sets the status of specified email(s) to 'read'. Can accept a single message or an array of messages.
cy.mailpitGetMail().mailpitSetStatusAsRead();
Sets the status of specified email(s) to 'unread'. Can accept a single message or an array of messages.
cy.mailpitGetMail().mailpitSetStatusAsUnRead();
Make sure the mailpit server is running. and set the env in cypress.config.ts
Install dependencies.
npm install
Build the package
npm run build
Run cypress tests
npm run cy:run