Bird

Migrate MailSlurp inbox workflows to Bird

Move a customer-facing inbox workflow while preserving the testing and mail-client features your application still uses. Start with one dedicated address and a controlled recipient.

Identify the inbox purpose

MailSlurp offers programmable inboxes with lifecycle options, HTTP or SMTP inbox types and virtual inbox behavior. A virtual inbox can record outbound mail without delivering it. Its waiting helpers support tests that wait for incoming messages. Review inbox options and wait helpers before changing the harness.
MailSlurp dependencyBird migration action
Inbox ID associated with a test or customerStore a new Bird mbx_ ID against the appropriate application owner. Keep test and customer records distinct.
Inbox expiry or disposable-address cleanupDefine lifecycle cleanup in your application using the documented mailbox operations. Do not assume the old expiry setting carries over.
Virtual inbox or non-delivering testKeep that test harness where needed. The Bird mailbox reply example sends a real email; use a recipient you control.
Wait-for helperFor a controlled test, list the Bird thread/messages with a bounded polling timeout. For an application worker, use signed incoming events.
Email ID and inbox-level replyStore Bird's thread and received-message IDs and reply through the thread-message operation.
SMTP/IMAP client accessInventory it separately from the selected API workflow. Replacing API calls does not configure an existing mail client.

Preserve test isolation

Create a dedicated mailbox for the integration test. Send a message with a unique test-run marker, identify the returned received-message ID and retain that ID for the assertion. Do not let an old message satisfy a new test merely because it is the newest item in a shared inbox.
Check the intended sender, subject and body before invoking the reply. Keep a fixed overall wait deadline and report an unobserved message as a timeout. Delivery cannot be inferred from a successful API response alone.

Build the Bird workflow

Start with the complete Node.js support inbox or Python support inbox. Each creates a mailbox, receives a message, records an application-owned support case and acknowledges it in the original thread. A later message updates that case; a repeated message does not send another acknowledgement.
The examples keep a small local checkpoint for development. Put the same case, incoming-message and outgoing-operation identities in your application's durable store before running multiple workers. Keep the business action separate from the email: acknowledging a refund request does not issue a refund.
Then add the signed event receiver and attachment workflow. Store the received-message ID with the case before acknowledging the event. Retrieve attachment metadata and bytes through the documented operations; keep any retained files under your application's access and retention rules.

Verify the customer workflow

Use one request with an attachment and one follow-up in the same conversation. Confirm the attachment metadata belongs to that received message, the follow-up updates the original case and replies reach the controlled recipient.
Replay the incoming event and confirm the existing job is reused. Then simulate an interrupted send: keep its result uncertain and resolve it using the saved operation metadata before allowing another attempt. The examples include that recovery path.

Change routing and retain needed tests

Move the tested customer cohort to the new address path. Stop the old worker for that cohort so both providers cannot acknowledge the same task. Keep old messages available for support and retain any separate disposable-inbox or virtual-send tests that remain useful.
For rollback, pause new Bird work, reconcile in-progress sends and restore the application route. Do not delete either provider's records while unresolved customer work still depends on them.

Next steps