Preface¶
DeepSeek Harness (hereinafter referred to as DSH) treats models, tools, conversations and interfaces as plugins. The official repository positions itself as “Everything is a Plugin”: you can add capabilities and modify configurations without changing the Harness source code. Agents can thus write code, browse files, run terminal commands, but the email layer usually still requires opening a client on your own.
Such daily needs are very specific: glance at unread emails, search for a contract by subject, save attachments to the workspace, draft a reply and send it out. Copy-pasting manually works, but you may miss details as conversations grow longer. The community plugin dsh-email was built for exactly this purpose: connecting your inbox to the agent’s tool list via standard IMAP/SMTP.
This article is organized based on the DSH plugin directory details page and the GitHub repository STARDUSTLC666/dsh-email (README, package.json, license, verified on 2026-08-18): what it is, what tools it offers, how to install and configure it, and how to handle sending approval and credentials. The directory site is a community-maintained search portal and has no official affiliation with DeepSeek / Magic Square; the plugin itself is also clearly stated as a community project in the README and has no official relationship with DeepSeek.
What It Is¶
dsh-email is a UI enhancement plugin maintained by GitHub user STARDUSTLC666, with the MIT license for the repository. The current npm package version is 0.6.2, the main language is TypeScript, and the engines field requires Node.js >= 20. The GitHub repository had 5 stars as of 2026-08-18.
It provides a set of email tools for agents in the current DSH process: list inbox, read emails, search, send emails on behalf, view folders, and send/receive attachments. It uses IMAP for receiving emails and SMTP for sending emails, does not rely on the system shell, and has no native binaries; the README specifies that the same Node.js code works on Windows / macOS / Linux.
The settings interface is mounted on the Web UI. The dsh.client field in package.json declares platform: web, and injects @deepseek-ai/dsh-client-runtime and @deepseek-ai/dsh-client-ui-settings. That is to say: the email protocol itself is cross-platform, and the form configuration page targets dsh web.
Core Features¶
Six Types of Tools¶
The README summarizes the capabilities into six tools, with names and responsibilities as follows.
| Tool | Function |
|---|---|
email_list |
List the latest emails in a folder, supports unread filtering and pagination; only returns summaries by default, without the body text |
email_read |
Read the full text of an email by UID; HTML will be converted to plain text, and overly long content will be truncated by maxBodyChars (default 20000 characters) |
email_search |
Search subjects / senders / recipients / cc recipients server-side by keywords; if no results are found, it will fall back to scanning the bodies of the latest 30 emails by default |
email_send |
Send emails on behalf, with optional attachments; pops up a confirmation before sending by default, showing recipients, subject and the number of attachments |
email_folders |
List INBOX, Sent, Junk and custom folders, returning the path for other tools to use |
email_attachment |
Download attachments by sequence number; saves to the conversation workspace by default, both per-file and total size are limited by maxAttachmentBytes (default 20 MiB) |
The main changes in v0.6.2 are related to search and list order: server-side search now supports cc; the fallback body scan also matches to / cc fields, and parsing failure of a single email will not interrupt the entire batch; the list is sorted in descending UID order to ensure the latest emails appear first; the attachment parameter validation for email_send now requires an array of path strings.
The conversation example given in the repository README is:
Help me check the latest 10 unread emails in my QQ mailbox and list the ones that need replies.
The agent will first call email_list (unread, latest 10 emails), and call email_read again when the body text is needed. This is the usage explanation in the documentation, not actual test records.
Eight Email Provider Presets¶
Selecting a provider will automatically fill in the IMAP/SMTP addresses, so you don’t need to manually enter the hostnames. The eight presets listed on the directory page and the README are consistent:
| provider | IMAP | SMTP |
|---|---|---|
qq |
imap.qq.com:993 (SSL) | smtp.qq.com:465 (SSL) |
163 |
imap.163.com:993 | smtp.163.com:465 |
126 |
imap.126.com:993 | smtp.126.com:465 |
sina |
imap.sina.com:993 | smtp.sina.com:465 |
aliyun |
imap.aliyun.com:993 | smtp.aliyun.com:465 |
gmail |
imap.gmail.com:993 | smtp.gmail.com:465 |
outlook |
outlook.office365.com:993 | smtp.office365.com:587 (STARTTLS) |
icloud |
imap.mail.me.com:993 | smtp.mail.me.com:587 (STARTTLS) |
You can also manually fill in any IMAP/SMTP settings without using a preset. Explicitly specified host / port / secure will take precedence over preset values.
All service providers require you to use an authorization code or app-specific password instead of your web login password. The entry points mentioned in the README are:
- QQ: Settings → Account → Enable IMAP/SMTP → Generate authorization code
- 163 / 126: Settings → POP3/SMTP/IMAP → Enable → Add authorization code
- Gmail: Enable two-factor authentication first, then generate an app-specific password on the Security page
- Outlook: App passwords in the Microsoft Account Security page (some accounts require enabling two-factor authentication first)
Multiple Accounts and Two Configuration Entry Points¶
One tool-email configuration can connect multiple email accounts, and you can switch accounts using the account parameter when calling the tools; defaultAccount is the default account used when this parameter is omitted. The single-account top-level fields from v0.1 (such as provider / user / password) are still available as shared default values for all accounts.
There are two configuration options, choose either one:
1. Web Settings (recommended in the README): Restart dsh web, then open Settings → Email (dsh-email), fill in your email and authorization code, and click “Save and Apply”. The page has a “Test Connection” button. The saved values are written to the dsh-email namespace in settings.yaml, which will override the default account in the YAML file; the password field is marked as secret and will not appear in exports and diagnostics.
2. YAML: Override the tool-email line in your profile’s cordis.patch.yml. You can also fill in the account mapping in the “Multiple Accounts (Advanced, YAML)” text box on the settings page, a non-empty value will override the accounts field.
The plugin ships with an empty configuration, and inserting config: {} into cordis.patch.yml will not break the startup process as specified in the README; calling any email_* tool before completing the configuration will return a clear configuration prompt.
Installation and Activation¶
The installation command given on the directory details page is:
dsh plugin add github:STARDUSTLC666/dsh-email
For reproducible installations, pin the commit as instructed on the directory page. As of 2026-08-18, the latest commit on the repository’s main branch is f24f1ffa6ce4a1369433a1a433fb8078d34b6683 (committed on 2026-08-16):
dsh plugin add github:STARDUSTLC666/dsh-email#f24f1ffa6ce4a1369433a1a433fb8078d34b6683
The repository README also includes an installation method with a web profile, which aligns with the fact that the settings page targets dsh web:
dsh plugin --profile web add dsh-email
After installation, restart dsh web. A single-account YAML configuration can be written as:
- id: tool-email
config:
provider: qq
user: you@qq.com
password: your authorization code
The README strongly recommends putting the password in the environment variable DSH_EMAIL_PASSWORD instead of writing it in plaintext in the configuration file long-term.
For connecting to a corporate email without a preset:
- id: tool-email
config:
user: you@corp.example
password: your authorization code
imap: { host: imap.corp.example, port: 993, secure: true }
smtp: { host: smtp.corp.example, port: 465, secure: true }
inboxFolder: INBOX
Multi-account example:
- id: tool-email
config:
accounts:
work: { provider: qq, user: work@qq.com, password: authorization code 1 }
home: { provider: '163', user: home@163.com, password: authorization code 2 }
defaultAccount: work
The downloadDir option can change the directory where attachments are saved; if not specified, the default is .dsh-email-downloads under the conversation workspace, falling back to $DSH_HOME/email-downloads if that does not exist.
Typical Usage¶
After completing the configuration, you can directly use natural language to ask the agent to call the tools without remembering parameter names. The types of tasks consistent with the documentation include:
- List the latest unread emails in a folder, only showing summaries
- Open an email by UID, with HTML content converted to plain text
- Search by subject, sender or cc recipient; if the server returns no results, it will default to scanning the bodies of the latest bodySearchLimit emails (default 30)
- List folder paths, then pass the path to email_list / email_search
- Download attachments by sequence number, allowing the model to read files in the workspace
- Draft a reply and send it via email_send; a confirmation popup will appear by default, and you need to approve it before the email is actually sent
Email approval is enabled by default (sendApproval: true). Each send operation will go through the DSH approval channel, with a prompt similar to “Send email to xx with subject ‘xx’”. Environments without an approval channel (such as headless mode without UI) will directly reject sending emails, which is a secure default specified in the documentation, not a malfunction.
Another easy pitfall: when the conversation is in Full Access mode, the Harness approval policy is set to never (no confirmation popup). In this case, email_send will be intercepted and a prompt will be given. The two solutions given in the README are: switch the access mode back to Read Only / Write; or turn off “Confirm before sending” in the settings page, which means you explicitly accept the risks.
Applicable Scenarios and Notes¶
It is suitable for users who are already using DSH Web and need agents to help manage emails: scan unread emails, retrieve attachments, draft replies and send them after your approval. Multiple accounts allow you to configure work and personal emails in the same setup. Corporate mailboxes that provide standard IMAP/SMTP can also be manually configured with hostnames.
The following points are explicitly stated in the repository README’s “Known Limitations” and “Security Notes” and are worth checking against the source code before installation.
OAuth2 is not supported. Enterprise environments that enforce OAuth (some Microsoft 365 / Google Workspace accounts) are currently unavailable, and you can only use the service provider’s app-specific passwords or authorization codes.
Body search is a compromise. The server only searches subject / from / to / cc fields. Many service providers (QQ is specifically named in the README) have unreliable IMAP TEXT / HEADER search, so if no results are found, it will fall back to scanning the latest N emails on the client side, which is slower; you can turn off this fallback using bodySearchFallback.
Attachments. Embedded images are not yet supported for separate download; if the attachment position cannot be located, an error will be thrown instead of downloading the wrong file. The default size limit is 20 MiB, and you can modify maxAttachmentBytes between 1024 bytes and 512 MiB.
Credentials stored on disk. The authorization code is the key to your email account. The values saved via the settings page are written in plaintext to the local settings.yaml: the secret tag only ensures that they will not appear in logs, exports and diagnostics, but does not provide disk encryption. Do not share this file with untrusted parties, and do not commit it to Git. A more secure approach is to use the DSH_EMAIL_PASSWORD environment variable. The plugin does not perform any network reporting, and credentials are only stored in memory to connect to your email server.
Permission model. The installation prompt on the directory page clearly states: the plugin runs with the permissions of the current DSH process, and may execute code during installation. You should inspect the source code repository and license before installing. This plugin uses the MIT license; the prepare script in package.json runs tsc for building.
Finally, reaffirm the attribution: dsh-email is a community plugin, the README clearly states that it has nothing to do with DeepSeek official, and @deepseek-ai/* is the official reserved namespace. The directory page cited in this article is also an independent site and not an official app store.
Summary¶
dsh-email wraps IMAP/SMTP into six tools, comes with eight presets including QQ, 163, Gmail, etc., and provides a Web settings page and email sending approval. For users who are already working in DSH and want their agents to be able to access emails, the installation cost and capability boundaries are clearly defined: authorization codes, approval switches, OAuth gaps, all are documented in detail.
Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-email/
GitHub: https://github.com/STARDUSTLC666/dsh-email