An uncertain SMTP result can approve the card again and send a second Message-ID
Maintainers usually reply within 2 days
@agentvivekkumar is already working on this.
Since Oct 10, 2026.
Assessment
This issue has not been assessed yet.
Description
Summary
handleMailRequest() calls markSending() before SMTP. sendOnce() creates a new Message-ID on every attempt.
If beforeSmtp() refuses the send, SMTP is not called. unmarkSending() correctly returns the card to approved.
If sendMail() fails with timeout or network, sendOnce() searches Sent. When Sent has no hit, the catch still calls unmarkSending(). A retry calls newMessageId() again. recordSent() writes the journal only after a confirmed send.
Why this matters
The server can accept the message and then drop the connection. Sent can be slow. The retry can send a second message. Reusing one Message-ID is not a guarantee, because the retry does not reuse it.
Evidence
sendOnce()andrecordSent()insrc/main/mail.ts- The approved-send catch in
handleMailRequest()insrc/main/mail.ts unmarkSending()insrc/main/mailApprovals.tsproposalSendProblem()insrc/shared/mailProposals.tsalready blocks a card insending
This is not the Can send journal item in TODOS.md. That item is a record before SMTP for Can send.
Change
Keep unmarkSending() when the failure happens before sendMail().
For timeout or network after sendMail() starts, leave the card in sending when Sent does not show the message. Show "check Sent". Add an owner action that sets the card back to approved only after the owner checks Sent.
Do not block every retry for every failure. Do not promise exactly-once SMTP delivery.
Test plan
- Fake SMTP accepts the message, then drops the connection. Sent returns no hit.
-
sendMailruns once. The card stayssending. - A second send with the same proposal id does not call
sendMail. - A refusal from
beforeSmtp()returns the card toapprovedand does not callsendMail.
Checkout: main at 0ef922bac25d6aad226243c72a0a7f142cfacfec.
- Dominant language
- TypeScript
- Stars
- 273
- Forks
- 211
- Avg merge
- 2d 10h
- Merged PRs (30d)
- 357
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from agentvivekkumar/dontbemichael
-
Difficulty 5/5 Over a week Newbie friendliness 28/100
agentvivekkumar/dontbemichael#607 · 1 comment ·
Maintainers usually reply within 2 days
-
The router's loop guard never fires: nothing counts hopsPossibly taken @Vanshika25developer claimed this 7 days ago. Openos:linux
Difficulty 3/5 1-2 days Newbie friendliness 25/100
agentvivekkumar/dontbemichael#605 · 3 comments ·
Maintainers usually reply within 2 days
-
Give Fable a tier and a pricePossibly taken @sahibsiddiqui claimed this 7 days ago. Openenhancement
Difficulty 2/5 1-3 hours Newbie friendliness 15/100
agentvivekkumar/dontbemichael#556 ·
Maintainers usually reply within 2 days
-
Keep what each engine can do in one table instead of Claude checks spread through the codePossibly taken @Sanketmis208 claimed this 9 days ago. Openenhancement
Difficulty 4/5 3-5 days Newbie friendliness 48/100
agentvivekkumar/dontbemichael#531 ·
Maintainers usually reply within 2 days
-
Employee Trial ShiftPossibly taken @agentvivekkumar claimed this 4 days ago. Openenhancement Require Customer
Difficulty 5/5 Over a week Newbie friendliness 20/100
agentvivekkumar/dontbemichael#527 · 3 comments · 1 assignee ·
Maintainers usually reply within 2 days
All issues in agentvivekkumar/dontbemichael
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Graphify-Labs/graphify#4860 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
sveltejs/eslint-plugin-svelte#1615 ·
Maintainers usually reply within 7 days
-
Parallel reticle_verify opens per-flow leases without the source lease's ignoreHTTPSErrorsPossibly taken @as992949791 claimed this today. Opengood first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
reticlehq/reticle#2033 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day