by James
Export notes as EPUB and send them to Kindle using your own SMTP email account.
Kindle Mail
Turn a note into a readable EPUB and send it to your Kindle through your own email account. Write and collect articles in Obsidian, then read them later on your Kindle.
Download 0.1.4 · 中文使用教程 · Privacy · Release notes
Version 0.1.4 fixes missing Obsidian image embeds when filenames contain Markdown emphasis characters such as underscores. It also removes legacy script-element scheduling code. All 30 automated tests passed locally; repeated builds produced identical output.
Published on GitHub for manual installation. Listing in the Obsidian Community directory is not yet confirmed.
By James C. Free and open source under the MIT license. An independent community project, not affiliated with or endorsed by Amazon or Obsidian.
Two commands, two purposes
| Command | Result | Sent to Kindle? |
|---|---|---|
| 发送当前笔记到 Kindle — Send current note to Kindle | Builds an EPUB in memory, asks for confirmation, then emails it | Yes |
| 导出当前笔记为 EPUB — Export current note as EPUB | Saves an EPUB in your vault's Kindle Exports folder | No |
You do not need to export before sending. This first release has a Chinese interface; English translations of command and setting labels are provided below.
Requirements
- Obsidian desktop 1.11.4 or later; mobile is not supported. Uses Node.js SMTP and Obsidian SecretStorage APIs.
- For sending: an Amazon account with a working Send to Kindle address, a Kindle device or app, and an email account that supports authenticated SMTP over TLS with a password or app password.
- An Internet connection for SMTP testing and sending. EPUB export works offline.
- OAuth-only email accounts are not supported. SMTP service availability and email-provider policies vary by account.
Installation
Install this update manually:
-
Download
main.jsandmanifest.jsonfrom the 0.1.4 release, or extractkindle-mail-0.1.4.zip. Disable Kindle Mail before replacing an existing installation. Back up the oldmain.jsandmanifest.json; keep your existingdata.json. -
In Obsidian, open Settings → Community plugins and click the folder icon next to Installed plugins. This opens the plugin folder for the actual vault you are using.
-
Create a
kindle-mailfolder there, and put both files directly inside it:Your actual vault/ └─ .obsidian/plugins/kindle-mail/ ├─ main.js └─ manifest.json -
Restart Obsidian, open Settings → Community plugins → Installed plugins, and enable Kindle Mail.
Do not search the online Browse catalog for an unpublished plugin. A common installation mistake is using a parent folder's .obsidian directory instead of the current vault's directory.
Configure sending
Open Settings → Kindle Mail.
| Setting in the interface | Meaning | Gmail example |
|---|---|---|
| SMTP 主机 | SMTP host | smtp.gmail.com |
| SMTP 用户名 | SMTP login | your-account@gmail.com |
| 发件邮箱 | Sender address | The same Gmail address |
| Kindle 收件邮箱 | Send to Kindle address | Your personal Kindle document address |
| SMTP 端口 | Encrypted SMTP port | 465 · TLS or 587 · STARTTLS |
| SMTP 授权码 | App password secret | Create/link a secret as described below |
| 电子书作者 | EPUB author | Your preferred name |
| EPUB 导出目录 | Export folder in this vault | Kindle Exports |
Gmail app password
- Enable 2-Step Verification in your Google account, if it is not already enabled.
- Open Google App passwords and create an app password named
Obsidian Kindle. This option may be unavailable for some managed or restricted accounts; see Google's official instructions. - In Kindle Mail, click Link… beside SMTP 授权码. Create a secret:
- ID:
kindle-gmail(an identifying label, not your email address). - Secret: the generated 16-character app password, with display spaces removed. Do not use your normal Google password or add an
sk-prefix.
- ID:
- Save. If the setting still shows Link…, click it again and select
kindle-gmail. - Click 测试连接 (Test connection). This checks SMTP connection and authentication only; it does not send email or verify Kindle delivery.
Use the same address for SMTP login and sender unless you have explicitly configured an authorized sending alias.
Allow the sender in Amazon
In Amazon's Manage Your Content and Devices → Preferences → Personal Document Settings, add your sender address to the Approved Personal Document E-mail List. Also confirm your Kindle's personal document email address.
See Amazon's official Send to Kindle email guidance. Amazon may require email confirmation for a delivery.
Other providers
QQ and 163 presets are available. Enable SMTP with the provider and use its authorization code. For another provider, enter its documented host and TLS port. Hotmail/Outlook or organization accounts that require OAuth cannot authenticate with this version.
Send a note
- Open a Markdown note and let Obsidian save your edits.
- Press Ctrl+P (Windows/Linux) or Cmd+P (macOS).
- Run Kindle Mail: 发送当前笔记到 Kindle.
- Review the sender, destination address, SMTP host, every included note and image path, attachment size and conversion warnings. Confirm 发送 (Send). Canceling does not read the password, create a mail transport or send a message.
- Wait for the SMTP acceptance message. Connect your Kindle to the Internet and allow Amazon time to process the document.
You can also right-click a Markdown file and choose 发送到 Kindle. Assign a shortcut under Settings → Hotkeys if you send often.
SMTP acceptance is not a delivery receipt. If a send times out, check your Kindle and mailbox before retrying; the server may already have accepted the email.
Export only
Run Kindle Mail: 导出当前笔记为 EPUB to keep a local copy or check formatting in an EPUB reader. Existing exports are not overwritten. No email account or network is required. This command does not send anything to Kindle.
Conversion support
- Chinese and other UTF-8 text; standard Markdown headings, paragraphs, lists, quotes, tables, links and code.
- Leading YAML frontmatter is excluded.
- Full-note
![[embeds]]are excluded by default. Enable 包含嵌入笔记正文 only when needed and check the complete file list before sending. Maximum nesting: root plus two embedded note levels. Cycles, deeper embeds and section/block embeds show a visible omission marker. Local image references still work with note embedding disabled. - Local PNG, JPEG and GIF images, with basic signature checking. Original bytes are packaged, so source metadata and animation may remain; rendering depends on the reader.
- Wikilinks become display text. Raw HTML is escaped. Remote images are replaced with text and are never downloaded.
- Maximum local image: 10 MiB; total images: 20 MiB. Maximum EPUB sent: 25 MiB. Email services may impose lower limits after MIME encoding.
- Expansion is bounded to 100 note reads and 5 MiB of combined Markdown; image count is limited to 100.
- Fresh vault file sizes are checked before reads and actual sizes after reads. Hidden files, invalid paths and files not registered in the current vault are refused. A file growing between the checks can still briefly allocate memory before the second check stops processing.
- The installed bundle uses SMTP only, does not import
fsorchild_process, replaces dependency filesystem calls with denial functions, and replaces the string-executing scheduler fallback with a function-only implementation. These build protections are required; do not bypassscripts/build.cjs.
Not converted: SVG, WebP, PDF, Canvas, Dataview, Mermaid and other plugin-rendered content. Checkboxes and ==highlight== receive no special conversion. Callouts appear as ordinary blockquotes. Embedded notes use simplified block styling. Heading navigation is limited to a single document entry. This is a one-way send, not a live update or Kindle annotation sync.
Privacy and network use
EPUB creation is local. No developer-operated server, analytics, advertising, payment or telemetry is used. When you test a connection, the plugin contacts your configured SMTP host and authenticates. When you confirm a send, the note title, author, expanded note text and packaged images are sent through your email provider to Amazon. Local exports can be synced by your vault sync provider.
Passwords are referenced through Obsidian SecretStorage; the plugin's data.json stores the secret name, not its value. Non-secret addresses and SMTP settings remain in data.json. SecretStorage is managed by Obsidian, and other plugins may access named secrets through that API. See PRIVACY.md and third-party notices.
Troubleshooting
| Symptom | What to check |
|---|---|
| Plugin is missing | Open the actual vault's plugins folder from Obsidian; avoid an extra nested folder. Refresh or restart. |
| Link… remains beside the password | Create a secret, then select it for the SMTP setting. |
| Authentication fails | Use the matching SMTP username and provider app password; normal Gmail passwords do not work. |
| Connection times out | Verify network access and try the provider's other documented TLS port. |
| SMTP succeeds, Kindle gets nothing | Check the Kindle address, approved sender list, Amazon confirmation email, spam folder and device connection. |
| Images are missing | Only local PNG/JPEG/GIF are supported; remote images are deliberately omitted. |
| Export exists, Kindle is empty | Export saves locally. Use the Send command to deliver it. |
Never include passwords, secret-storage contents or personal notes in public bug reports.
Development and validation
Use Node.js 22+ and pnpm 11:
pnpm install --frozen-lockfile
pnpm check
The output main.js is bundled with dependencies and requires no package installation by users. Release tags must equal the manifest version exactly, e.g. 0.1.4, without v. Attach main.js, manifest.json, LICENSE, and THIRD-PARTY-NOTICES.md individually to the release. The Obsidian installer fetches the first two; bundled license comments are also retained in main.js. Build source labels are normalized to avoid embedding the dependency directory of the build machine. Direct dependency versions and the full dependency tree are locked; CI runs a frozen install, build and tests.
On 2026-10-20 the author confirmed successful delivery of version 0.1.2 through Gmail (TLS port 465) to Kindle on Windows with Obsidian 1.14.4; both note text and local images displayed correctly. Automated tests cover EPUB construction, escaping, embeds, image handling, pre-read resource bounds, cancellation, email attachments and the installed bundle's simulated SMTP exchange. Simulated TLS tests do not replace validation with real email providers. Other desktop operating systems and email providers have not been verified. Community approval is not a guarantee of zero security risk.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.