proton mail
Read, write and organize mail.
Every command under proton mail, with the arguments and flags it takes. For these commands in use, see the guide.
Holds conversations, drafts, messages and settings.
conversations
Section titled “conversations”Whole threads.
Holds attachments, delete, export, forward, get, label, list, mark, move, reply, snooze, star, trash, unlabel, unsnooze and unstar.
conversations attachments
Section titled “conversations attachments”Files attached anywhere in a thread.
Holds download and list.
conversations attachments download
Section titled “conversations attachments download”Download and decrypt attachments from a thread.
proton mail conversations attachments download REF [ATTACHMENT_REF]proton mail conversations attachments download 'Quarterly numbers' --output-dir .| Flag | Description |
|---|---|
--force |
Overwrite a file that already exists |
--include-inline |
Include inline attachments |
--output string |
Write to this path, or - for stdout |
--output-dir string |
Write into this directory, keeping each item’s own name |
conversations attachments list
Section titled “conversations attachments list”List every attachment in a thread.
proton mail conversations attachments list REFproton mail conversations attachments list 'Quarterly numbers'| Flag | Description |
|---|---|
--include-inline |
Include inline attachments |
conversations delete
Section titled “conversations delete”Delete threads permanently.
proton mail conversations delete [REF...]proton mail conversations delete 5bH2mQxK| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations export
Section titled “conversations export”Write a whole thread out as .eml files or one mbox.
proton mail conversations export REFproton mail conversations export 'Quarterly numbers' --output-dir ./backup| Flag | Description |
|---|---|
--force |
Overwrite a file that already exists |
--format string |
How to lay the thread down: eml, mbox (default mbox) |
--no-attachments |
Skip attachments |
--output string |
Write to this path, or - for stdout |
--output-dir string |
Write into this directory, keeping each item’s own name |
conversations forward
Section titled “conversations forward”Forward the newest message in a thread.
proton mail conversations forward REFproton mail conversations forward 'Quarterly numbers' --to jane@example.com| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Your text, placed above the quoted original (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--draft |
Save as a draft instead of sending |
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Compose in HTML (default: match the original) |
--no-attachments |
Leave the original’s attachments behind |
--no-quote |
Do not quote the original message |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
--to stringArray |
Recipient (repeatable; accepts “Name |
conversations get
Section titled “conversations get”Show a whole thread, decrypted.
proton mail conversations get REFproton mail conversations get 'Quarterly numbers'proton mail conversations get 5bH2mQxK --summary| Flag | Description |
|---|---|
--body-only |
Emit only the bodies, with no headers or dividers |
--include-inline |
List inline attachments too |
--render string |
Which representation of the body to print: text, html, raw (default text) |
--strip-quotes |
Drop quoted reply blocks from each body |
--summary |
One line per message instead of the full thread |
conversations label
Section titled “conversations label”Attach a label to threads.
proton mail conversations label [REF...]proton mail conversations label 'Quarterly numbers' --label Accounting| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--label string |
The label to attach or detach, by name or ID |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations list
Section titled “conversations list”List threads in a folder.
The filters are the ones every organising verb takes, so a selection can be read here and then handed to one of them. Text predicates go through Proton’s index, which lags a change by a few seconds.
It looks in the inbox unless told otherwise; –folder all searches everything.
proton mail conversations listproton mail conversations listproton mail conversations list --unread --folder inboxproton mail conversations list --from jane@example.com --folder all| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: inbox) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--page int |
Which page of results, counting from zero |
--page-size int |
How many threads per page (default 25) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations mark
Section titled “conversations mark”Set whether threads count as read.
Holds read and unread.
conversations mark read
Section titled “conversations mark read”Mark threads as read.
proton mail conversations mark read [REF...]proton mail conversations mark read 'Quarterly numbers'proton mail conversations mark read --folder inbox --all| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations mark unread
Section titled “conversations mark unread”Mark threads as unread.
proton mail conversations mark unread [REF...]proton mail conversations mark unread 'Quarterly numbers'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations move
Section titled “conversations move”Move threads to a folder.
proton mail conversations move [REF...]proton mail conversations move 'Quarterly numbers' --into archiveproton mail conversations move --older-than 90d --folder inbox --into archive| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--into string |
Destination folder, by name or ID |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations reply
Section titled “conversations reply”Reply to the newest message in a thread.
proton mail conversations reply REFproton mail conversations reply 'Quarterly numbers' --body 'Looks right to me.'proton mail conversations reply 'Quarterly numbers' --everyone --body Agreed.| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Your text, placed above the quoted original (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--draft |
Save as a draft instead of sending |
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--everyone |
Reply to everyone who was on the message, not just the sender |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Compose in HTML (default: match the original) |
--no-quote |
Do not quote the original message |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
--to stringArray |
Recipient (repeatable; accepts “Name |
conversations snooze
Section titled “conversations snooze”Take threads out of the inbox until later.
–until takes a duration from now, such as 3d, or a moment written out in full, such as 2026-04-17T09:00. The thread returns to the inbox then, unread.
proton mail conversations snooze [REF...]proton mail conversations snooze 5bH2mQxK --until 3dproton mail conversations snooze --unread --until 2026-04-17T09:00| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
--until string |
When they come back (e.g. 3d, or 2026-04-17T09:00) |
conversations star
Section titled “conversations star”Star threads.
proton mail conversations star [REF...]proton mail conversations star 'Quarterly numbers'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations trash
Section titled “conversations trash”Move threads to the trash.
proton mail conversations trash [REF...]proton mail conversations trash 'Quarterly numbers'proton mail conversations trash --from newsletter@example.com --older-than 90d| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations unlabel
Section titled “conversations unlabel”Detach a label from threads.
proton mail conversations unlabel [REF...]proton mail conversations unlabel 'Quarterly numbers' --label Accounting| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--label string |
The label to attach or detach, by name or ID |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations unsnooze
Section titled “conversations unsnooze”Bring snoozed threads back to the inbox now.
proton mail conversations unsnooze [REF...]proton mail conversations unsnooze 5bH2mQxK| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
conversations unstar
Section titled “conversations unstar”Remove the star from threads.
proton mail conversations unstar [REF...]proton mail conversations unstar 'Quarterly numbers'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
drafts
Section titled “drafts”Messages not yet sent.
Holds create, delete, list, send and update.
drafts create
Section titled “drafts create”Save a draft without sending it.
proton mail drafts createproton mail drafts create --to team@example.com --subject Standup --body 'Notes to follow.'proton mail drafts create --to jane@example.com --subject Report --attach ./report.pdf| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Message body (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--eml string |
Build the message from an RFC 822 file; other flags override what it says |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Treat the body as HTML rather than plain text |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--subject string |
Subject line |
--to stringArray |
Recipient (repeatable; accepts “Name |
drafts delete
Section titled “drafts delete”Delete drafts.
proton mail drafts delete REF...proton mail drafts delete 5bH2mQxKdrafts list
Section titled “drafts list”List drafts.
proton mail drafts listproton mail drafts list| Flag | Description |
|---|---|
--page int |
Which page of results, counting from zero |
--page-size int |
How many drafts per page (default 25) |
drafts send
Section titled “drafts send”Send a draft as it stands.
Its body already contains whatever signature it was created with, so nothing is appended.
proton mail drafts send REFproton mail drafts send 5bH2mQxKproton mail drafts send 5bH2mQxK --send-at 2026-04-16T09:00| Flag | Description |
|---|---|
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
drafts update
Section titled “drafts update”Change a draft. Only what you pass is replaced; everything else is kept.
–to, –cc and –bcc replace the whole list rather than adding to it. –attach adds files and –detach removes one by name or ID.
proton mail drafts update REFproton mail drafts update 5bH2mQxK --body 'Notes attached.'proton mail drafts update 5bH2mQxK --detach report.pdf| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Message body (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--detach stringArray |
Remove an attachment by name or ID (repeatable) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Switch the draft to text/html |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--plain |
Switch the draft to text/plain |
--subject string |
Subject line |
--to stringArray |
Recipient (repeatable; accepts “Name |
messages
Section titled “messages”Individual messages.
Holds attachments, delete, empty, expire, export, forward, get, label, list, mark, move, reply, send, star, trash, unlabel, unschedule, unstar, unsubscribe and watch.
messages attachments
Section titled “messages attachments”Files attached to a message.
Holds download and list.
messages attachments download
Section titled “messages attachments download”Download and decrypt attachments.
Naming an attachment downloads that one; naming none downloads them all. Existing files are never overwritten silently: a collision becomes “file (2).pdf” unless –force says otherwise.
proton mail messages attachments download REF [ATTACHMENT_REF]proton mail messages attachments download 'Invoice #2291' --output-dir .proton mail messages attachments download 5bH2mQxK kQ81mDx4 --output invoice.pdf| Flag | Description |
|---|---|
--force |
Overwrite a file that already exists |
--include-inline |
Include inline attachments when downloading them all |
--output string |
Write to this path, or - for stdout |
--output-dir string |
Write into this directory, keeping each item’s own name |
messages attachments list
Section titled “messages attachments list”List a message’s attachments.
proton mail messages attachments list REFproton mail messages attachments list 'Invoice #2291'proton mail messages attachments list 5bH2mQxK --include-inline| Flag | Description |
|---|---|
--include-inline |
Include inline attachments, such as signature graphics |
messages delete
Section titled “messages delete”Delete messages permanently.
proton mail messages delete [REF...]proton mail messages delete 5bH2mQxKproton mail messages delete --folder spam --all --yes| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages empty
Section titled “messages empty”Delete everything in a folder, permanently.
Nothing is listed first: Proton clears the folder without naming what was in it, which is why this cannot be narrowed and why it always asks.
proton mail messages emptyproton mail messages empty --folder trashproton mail messages empty --folder spam| Flag | Description |
|---|---|
--folder string |
Folder or label to look in |
messages expire
Section titled “messages expire”Make messages delete themselves after a while, or stop them.
–in takes a duration and Proton stores the moment it lands on, so a message already counting down reports when rather than how long.
proton mail messages expire [REF...]proton mail messages expire 5bH2mQxK --in 7dproton mail messages expire --from newsletter@example.com --in 30dproton mail messages expire 5bH2mQxK --never| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--in string |
Delete them after DURATION (e.g. 7d, 24h) |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--never |
Stop them expiring |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--password-file string |
Read the account password from a file |
--password-stdin |
Read the account password from stdin |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--totp string |
Two-factor code |
--unread |
Match unread messages |
messages export
Section titled “messages export”Write messages out as standalone RFC 822 documents, readable by any mail client, grep, or anything else.
eml writes one file per message; mbox concatenates everything into one stream. Skipping attachments with –no-attachments is much faster for a large archive.
Exported files are not encrypted - that is what exporting means. The original DKIM signatures will not verify against the rebuilt body either, exactly as with the web client’s own export.
proton mail messages export [REF...]proton mail messages export 'Invoice #2291' --output-dir ./backupproton mail messages export --folder archive --all --output-dir ./mail-backupproton mail messages export --folder archive --older-than 1y --format mbox --output archive.mbox| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--force |
Overwrite a file that already exists |
--format string |
How to lay the messages down: eml, mbox (default eml) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--no-attachments |
Skip attachments, which is much faster |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--output string |
Write to this path, or - for stdout |
--output-dir string |
Write into this directory, keeping each item’s own name |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages forward
Section titled “messages forward”Forward a message.
The original is quoted below your text with its own headers, the subject gains “Fw:”, and its attachments come along without being re-uploaded.
proton mail messages forward REFproton mail messages forward 'Invoice #2291' --to jane@example.comproton mail messages forward 'Invoice #2291' --to jane@example.com --no-attachments| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Your text, placed above the quoted original (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--draft |
Save as a draft instead of sending |
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Compose in HTML (default: match the original) |
--no-attachments |
Leave the original’s attachments behind |
--no-quote |
Do not quote the original message |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
--to stringArray |
Recipient (repeatable; accepts “Name |
messages get
Section titled “messages get”Show one message, decrypted.
proton mail messages get REFproton mail messages get 'Invoice #2291'proton mail messages get 5bH2mQxK --render htmlproton mail messages get 5bH2mQxK --body-only --strip-quotes| Flag | Description |
|---|---|
--body-only |
Emit only the body, with no headers or attachment list |
--include-inline |
List inline attachments too, such as signature graphics |
--render string |
Which representation of the body to print: text, html, raw (default text) |
--strip-quotes |
Drop quoted reply blocks from the body |
messages label
Section titled “messages label”Attach a label to messages.
proton mail messages label [REF...]proton mail messages label 'Invoice #2291' --label Accountingproton mail messages label --from billing@example.com --label Accounting| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--label string |
The label to attach or detach, by name or ID |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages list
Section titled “messages list”List messages in a folder.
The filters are the ones every organising verb takes, so a selection can be read here and then handed to trash, move, label or export. Text predicates go through Proton’s index, which lags a change by a few seconds.
It looks in the inbox unless told otherwise; –folder all searches everything.
proton mail messages listproton mail messages listproton mail messages list --unreadproton mail messages list --folder archive --page-size 50proton mail messages list --starred --output jsonproton mail messages list --from billing@example.com --folder allproton mail messages list --keyword invoice --after 2026-01-01 --folder all| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: inbox) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--page int |
Which page of results, counting from zero |
--page-size int |
How many messages per page (default 25) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages mark
Section titled “messages mark”Set whether messages count as read.
Holds read and unread.
messages mark read
Section titled “messages mark read”Mark messages as read.
proton mail messages mark read [REF...]proton mail messages mark read 'Invoice #2291'proton mail messages mark read --folder inbox --all| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages mark unread
Section titled “messages mark unread”Mark messages as unread.
proton mail messages mark unread [REF...]proton mail messages mark unread 'Invoice #2291'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages move
Section titled “messages move”Move messages to a folder.
A folder is somewhere a message lives, so moving takes it out of wherever it was. To add a tag while leaving it in place, use label instead.
proton mail messages move [REF...]proton mail messages move 'Invoice #2291' --into archiveproton mail messages move --from newsletter@example.com --older-than 90d --into archive| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--into string |
Destination folder, by name or ID |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages reply
Section titled “messages reply”Reply to a message.
The original is quoted below your text, the subject gains “Re:”, and the reply leaves from the address the original arrived on.
–all includes everyone who was on the message. –draft stops before sending, so you can edit it with mail drafts update.
proton mail messages reply REFproton mail messages reply 'Invoice #2291' --body 'Thanks, paid today.'proton mail messages reply 'Invoice #2291' --everyone --body 'Noted.'proton mail messages reply 'Invoice #2291' --body 'Draft first.' --draft| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Your text, placed above the quoted original (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--draft |
Save as a draft instead of sending |
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--everyone |
Reply to everyone who was on the message, not just the sender |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Compose in HTML (default: match the original) |
--no-quote |
Do not quote the original message |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
--to stringArray |
Recipient (repeatable; accepts “Name |
messages send
Section titled “messages send”Compose and send a message.
proton mail messages sendproton mail messages send --to jane@example.com --subject Report --body 'See attached.' --attach ./report.pdfproton mail messages send --to team@example.com --subject Standup --body -proton mail messages send --to jane@example.com --subject Reminder --send-at 2026-04-16T09:00proton mail messages send --eml ./draft.eml| Flag | Description |
|---|---|
--attach stringArray |
File to attach (repeatable) |
--attach-inline stringArray |
Image to embed in the HTML body by Content-ID (repeatable; needs –html) |
--bcc stringArray |
Blind-carbon-copy recipient (repeatable) |
--body string |
Message body (- reads stdin) |
--cc stringArray |
Carbon-copy recipient (repeatable) |
--eml string |
Build the message from an RFC 822 file; other flags override what it says |
--eo-password string |
Password-protect the message for recipients outside Proton (expires after 28 days) |
--eo-password-hint string |
Hint shown to password-protected recipients |
--expires string |
Self-destruct after DURATION (e.g. 7d, 24h) |
--from string |
Address to send from, by email or ID (default: your primary) |
--html |
Treat the body as HTML rather than plain text |
--no-signature |
Leave out this address’s signature and Proton’s footer |
--send-at string |
Schedule delivery (RFC 3339, or YYYY-MM-DDTHH:MM in the system timezone) |
--subject string |
Subject line |
--to stringArray |
Recipient (repeatable; accepts “Name |
messages star
Section titled “messages star”Star messages.
proton mail messages star [REF...]proton mail messages star 'Invoice #2291'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages trash
Section titled “messages trash”Move messages to the trash.
proton mail messages trash [REF...]proton mail messages trash 'Invoice #2291'proton mail messages trash --unread --older-than 30dproton mail messages trash --from newsletter@example.com --older-than 90d --dry-run| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages unlabel
Section titled “messages unlabel”Detach a label from messages.
proton mail messages unlabel [REF...]proton mail messages unlabel 'Invoice #2291' --label Accounting| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--label string |
The label to attach or detach, by name or ID |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages unschedule
Section titled “messages unschedule”Cancel a scheduled send.
The message leaves the queue and returns to Drafts, keeping its ID - the same thing the web client’s “Edit and reschedule” does. To change the time, cancel it and send again with –send-at.
proton mail messages unschedule [REF...]proton mail messages unschedule 5bH2mQxKproton mail messages unschedule --all| Flag | Description |
|---|---|
--all |
Act on everything in scope, rather than a subset |
messages unstar
Section titled “messages unstar”Remove the star from messages.
proton mail messages unstar [REF...]proton mail messages unstar 'Invoice #2291'| Flag | Description |
|---|---|
--after string |
Match messages after this date (YYYY-MM-DD) |
--all |
Act on everything in scope, rather than a subset |
--before string |
Match messages before this date (YYYY-MM-DD) |
--folder string |
Folder or label to look in (default: all) |
--from string |
Match the sender’s address |
--keyword string |
Match text anywhere, including display names and bodies |
--limit int |
Most messages to affect (Proton pages at 150) (default 150) |
--newer-than string |
Match messages newer than DURATION |
--older-than string |
Match messages older than DURATION (e.g. 30d, 2w, 1h) |
--starred |
Match starred messages |
--subject string |
Match text in the subject |
--to string |
Match a recipient’s address |
--unread |
Match unread messages |
messages unsubscribe
Section titled “messages unsubscribe”Ask a mailing list to stop.
Proton does the asking, using whatever the message offered - a List-Unsubscribe header, or the one-click form behind it - because Proton is the party the list already knows.
proton mail messages unsubscribe REF...proton mail messages unsubscribe 5bH2mQxKmessages watch
Section titled “messages watch”Print each message as it arrives, until you stop it.
It reports what happens while it is watching, so nothing that arrived beforehand comes up. A thread returning from snooze counts as arriving.
Without –folder it covers the inbox plus every folder whose notifications are on, which settings folders list shows under NOTIFY.
proton mail messages watchproton mail messages watchproton mail messages watch --folder allproton mail messages watch --from billing@example.comproton mail messages watch --output json| Flag | Description |
|---|---|
--folder string |
Folder or label to look in (default: the ones that notify) |
--from string |
Match the sender’s address |
--subject string |
Match text in the subject |
settings
Section titled “settings”How Mail behaves.
Holds addresses, autoreply, filters, folders, get, labels, list, senders and set.
settings addresses
Section titled “settings addresses”Your addresses, display names and signatures.
Holds get, list and update.
settings addresses get
Section titled “settings addresses get”Show one address, including its signature.
proton mail settings addresses get REFproton mail settings addresses get me@proton.mesettings addresses list
Section titled “settings addresses list”List the addresses on the account.
proton mail settings addresses listproton mail settings addresses listsettings addresses update
Section titled “settings addresses update”Set the display name recipients see and the signature appended to mail sent from this address.
Proton stores signatures as HTML. Plain text is escaped and its newlines become line breaks; –html passes markup through untouched.
proton mail settings addresses update REFproton mail settings addresses update me@proton.me --display-name 'Roman'proton mail settings addresses update me@proton.me --signature - --htmlproton mail settings addresses update me@proton.me --clear-signature| Flag | Description |
|---|---|
--clear-signature |
Remove the signature |
--display-name string |
Name recipients see next to the address |
--html |
Treat the signature as HTML rather than escaping it |
--signature string |
Signature appended to mail from this address (- reads stdin) |
settings autoreply
Section titled “settings autoreply”The automatic reply and its schedule.
Holds disable, enable, get and set.
settings autoreply disable
Section titled “settings autoreply disable”Turn the auto-reply off, keeping its schedule.
proton mail settings autoreply disableproton mail settings autoreply disablesettings autoreply enable
Section titled “settings autoreply enable”Turn the auto-reply on, keeping its schedule.
proton mail settings autoreply enableproton mail settings autoreply enablesettings autoreply get
Section titled “settings autoreply get”Show the auto-reply and its schedule.
proton mail settings autoreply getproton mail settings autoreply getsettings autoreply set
Section titled “settings autoreply set”Configure the auto-reply and turn it on.
–start and –end are written in the grammar the repeat mode dictates: fixed 2026-07-01T09:00 a date and time in –zone daily 09:00 a time of day, with –days weekly mon:09:00 a weekday and time monthly 1:09:00 a day of the month and time permanent - no bounds
Proton sends every auto-reply with the subject “Auto” and offers no way to change it. Auto-reply is a paid feature.
proton mail settings autoreply setproton mail settings autoreply set --message 'Away until Monday.'proton mail settings autoreply set --message 'On holiday.' --start 2026-07-01 --end 2026-07-14| Flag | Description |
|---|---|
--days stringSlice |
Days it is active, for a daily schedule, e.g. mon,tue,wed |
--end string |
End of the window (grammar depends on –repeat) |
--html |
Treat the message as HTML rather than escaping it |
--message string |
Reply body (- reads stdin) |
--password-file string |
Read the account password from a file |
--password-stdin |
Read the account password from stdin |
--repeat string |
How the schedule repeats: fixed, daily, weekly, monthly, permanent (default fixed) |
--start string |
Start of the window (grammar depends on –repeat) |
--totp string |
Two-factor code |
--zone string |
IANA time zone the schedule is read in (default: the system zone) |
settings filters
Section titled “settings filters”Server-side Sieve filters.
Holds apply, create, delete, disable, enable, get, list, reorder and update.
settings filters apply
Section titled “settings filters apply”Run filters over mail that is already in the mailbox.
A filter ordinarily acts once, as mail arrives, so a rule written today does nothing about what came yesterday.
With no filter named, every enabled filter runs.
proton mail settings filters apply [REF...]proton mail settings filters applyproton mail settings filters apply Newsletterssettings filters create
Section titled “settings filters create”Create a filter.
Describe it with –if and the actions below, and Proton writes the Sieve. A condition reads FIELD [not] COMPARATOR VALUE:
field subject, sender, recipient, attachments comparator contains, is, starts, ends, matches
is wants the whole value; matches takes * and ? as wildcards. An attachments condition takes no value - it asks whether there is one.
–sieve takes a script you wrote yourself instead.
proton mail settings filters createproton mail settings filters create --name Receipts --if "sender contains billing@" --label Receiptsproton mail settings filters create --name Big --sieve ./big.sieve| Flag | Description |
|---|---|
--disabled |
Create it without turning it on |
--if stringArray |
A condition matching mail must meet, as FIELD [not] COMPARATOR VALUE (repeatable) |
--label stringArray |
Apply this label to matching mail (repeatable) |
--mark-read |
Mark matching mail as read |
--match string |
Whether every condition must hold, or any one of them: all, any (default all) |
--move-to string |
Move matching mail into this folder (archive, inbox, spam, trash, or one of yours) |
--name string |
Name for the new filter |
--sieve string |
Sieve script (- reads stdin) |
--star |
Star matching mail |
settings filters delete
Section titled “settings filters delete”Delete filters.
proton mail settings filters delete REF...proton mail settings filters delete Receiptssettings filters disable
Section titled “settings filters disable”Disable filters.
proton mail settings filters disable REF...proton mail settings filters disable Receiptssettings filters enable
Section titled “settings filters enable”Enable filters.
proton mail settings filters enable REF...proton mail settings filters enable Receiptssettings filters get
Section titled “settings filters get”Show what a filter matches and does.
proton mail settings filters get REFproton mail settings filters get Receiptssettings filters list
Section titled “settings filters list”List your filters.
proton mail settings filters listproton mail settings filters listsettings filters reorder
Section titled “settings filters reorder”Set the order filters run in.
The first rule to file a message wins, so the order decides where mail lands. Name every filter, in the order you want them: this replaces the whole order rather than nudging one entry, because a half-stated order is one nobody can predict.
proton mail settings filters reorder REF...proton mail settings filters reorder Newsletters Receipts Archivesettings filters update
Section titled “settings filters update”Change what a filter is called, matches, or does.
–if and the actions beside it replace the whole rule rather than adding to it. The filter keeps its place in the order and whether it is running.
proton mail settings filters update REFproton mail settings filters update Receipts --sieve ./receipts.sieve| Flag | Description |
|---|---|
--if stringArray |
A condition matching mail must meet, as FIELD [not] COMPARATOR VALUE (repeatable) |
--label stringArray |
Apply this label to matching mail (repeatable) |
--mark-read |
Mark matching mail as read |
--match string |
Whether every condition must hold, or any one of them: all, any (default all) |
--move-to string |
Move matching mail into this folder (archive, inbox, spam, trash, or one of yours) |
--name string |
New name |
--sieve string |
New Sieve script (- reads stdin) |
--star |
Star matching mail |
settings folders
Section titled “settings folders”Folders, which a message lives in.
Holds create, delete, list and update.
settings folders create
Section titled “settings folders create”Create a folder.
proton mail settings folders createproton mail settings folders create --name Receiptsproton mail settings folders create --name 2026 --parent Receipts --color oliveproton mail settings folders create --name Receipts --notify=false| Flag | Description |
|---|---|
--color string |
Accent color, by name (purple) or hex (#8080FF) (default #8080FF) |
--name string |
Name for the new folder |
--notify |
Tell you when mail arrives here (default true) |
--parent string |
Put it inside this folder, by ID |
settings folders delete
Section titled “settings folders delete”Delete folders.
proton mail settings folders delete REF...proton mail settings folders delete Receiptssettings folders list
Section titled “settings folders list”List your folders.
proton mail settings folders listproton mail settings folders listsettings folders update
Section titled “settings folders update”Rename or recolor a folder.
proton mail settings folders update REFproton mail settings folders update Receipts --name Invoicesproton mail settings folders update Receipts --notify| Flag | Description |
|---|---|
--color string |
New accent color, as a hex value |
--name string |
New name |
--notify |
Tell you when mail arrives here (default true) |
--parent string |
Move it inside this folder, by ID |
settings get
Section titled “settings get”Show the mail settings now in effect.
proton mail settings getproton mail settings getsettings labels
Section titled “settings labels”Labels, which a message carries.
Holds create, delete, list and update.
settings labels create
Section titled “settings labels create”Create a label.
proton mail settings labels createproton mail settings labels create --name Workproton mail settings labels create --name Accounting --color pacific| Flag | Description |
|---|---|
--color string |
Accent color, by name (purple) or hex (#8080FF) (default #8080FF) |
--name string |
Name for the new label |
settings labels delete
Section titled “settings labels delete”Delete labels.
proton mail settings labels delete REF...proton mail settings labels delete Worksettings labels list
Section titled “settings labels list”List your labels.
proton mail settings labels listproton mail settings labels listsettings labels update
Section titled “settings labels update”Rename or recolor a label.
proton mail settings labels update REFproton mail settings labels update Work --name Officeproton mail settings labels update Work --color enzian| Flag | Description |
|---|---|
--color string |
New accent color, as a hex value |
--name string |
New name |
settings list
Section titled “settings list”List the mail settings that can be changed.
proton mail settings listproton mail settings listsettings senders
Section titled “settings senders”Who always reaches the inbox, and who never does.
Holds allow, block, forget, list and spam.
settings senders allow
Section titled “settings senders allow”Always let someone reach the inbox.
A whole domain works too, written with the @: @example.com.
Deciding again about the same sender replaces the earlier decision rather than colliding with it.
proton mail settings senders allow EMAIL...proton mail settings senders allow billing@example.comsettings senders block
Section titled “settings senders block”Send someone’s mail straight to blocked.
A whole domain works too, written with the @: @example.com.
Deciding again about the same sender replaces the earlier decision rather than colliding with it.
proton mail settings senders block EMAIL...proton mail settings senders block spammer@example.comproton mail settings senders block @example.comsettings senders forget
Section titled “settings senders forget”Drop a standing decision, letting the spam filter decide again.
proton mail settings senders forget EMAIL...proton mail settings senders forget billing@example.comsettings senders list
Section titled “settings senders list”List every standing decision about a sender.
proton mail settings senders listproton mail settings senders listsettings senders spam
Section titled “settings senders spam”Send someone’s mail straight to spam.
A whole domain works too, written with the @: @example.com.
Deciding again about the same sender replaces the earlier decision rather than colliding with it.
proton mail settings senders spam EMAIL...proton mail settings senders spam newsletter@example.comsettings set
Section titled “settings set”Change one mail setting.
proton mail settings set KEY VALUEproton mail settings set signature offproton mail settings set view-mode conversationEvery command also takes the flags that work everywhere.