详细分析 ▾
运行时依赖
版本
- Added comprehensive documentation in SKILL.md covering setup, usage, and security tips for managing ProtonMail via Playwright browser automation. - Specifies installation requirements and system dependencies for various platforms. - Provides step-by-step code samples for logging in, reading, sending, and managing emails. - Introduces bot detection evasion techniques to improve reliability. - Highlights limitations such as 2FA automation challenges and UI fragility. - Offers detailed troubleshooting advice and best security practices. - Project is now clearly positioned as a browser automation solution (not API or IMAP).
安装命令 点击复制
技能文档
Your encrypted inbox, automated. Because checking emails manually is so 2010.
什么 做
- 登录 到 任何 ProtonMail 账户 securely
- 读取 emails 从 inbox
- 发送 新的 emails 带有 compose functionality
- Manage mailbox 点赞 pro
All via Playwright browser automation. No API keys, no IMAP/SMTP headaches - just a real browser doing real browser things.
为什么 exists
You have better things to do than clicking through ProtonMail's beautiful (but slow) UI. Let your agent handle it. While you relax. Or code. Or whatever it is you do.
We built this because:
- ProtonMail's web UI ... leisurely
- Automation hot
- 为什么 click 当...时 您 可以 script?
Requirements
Basics
- 节点.js 18+ (20+ recommended)
- Playwright 1.40+ (
npm install playwright) - Chromium browser (
npx playwright install chromium)
System Dependencies (Linux)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2# Raspberry Pi / ARM
sudo apt-get install -y chromium-browser
Secret Sauce (Bot Detection Bypass)
This skill includes enterprise-grade bot detection evasion:// Launch with stealth args
await chromium.launch({
headless: true,
args: [
'--disable-blink-features=AutomationControlled',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage'
]
});// Hide webdriver property
await page.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});
This makes Chrome think it's being controlled by a human. Mostly works. ✨
Quick 开始
1. 登录
const { chromium } = require('playwright');async function loginProton(email, password) {
const browser = await chromium.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']
});
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
});
const page = await context.newPage();
await page.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});
await page.goto('https://account.proton.me/login');
await page.waitForTimeout(2000);
await page.fill('#username', email);
await page.fill('#password', password);
await page.click('button[type=submit]');
await page.waitForTimeout(3000);
return { browser, context, page };
}
2. Check Inbox
await page.goto('https://mail.proton.me/inbox');
await page.waitForTimeout(2000);const emails = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.item')).map(e => ({
subject: e.querySelector('.subject')?.innerText,
sender: e.querySelector('.sender')?.innerText,
time: e.querySelector('.time')?.innerText
}));
});
console.log(emails);
3. 读取 Email
await page.click('.item:first-child');
await page.waitForTimeout(2000);const content = await page.evaluate(() =>
document.querySelector('.message-content')?.innerText
);
4. 发送 Email (Tested & Working)
// Navigate to compose
await page.goto('https://mail.proton.me/compose');
await page.waitForTimeout(3000);// Use keyboard navigation (most reliable)
// Tab to recipient field
await page.keyboard.press('Tab');
await page.waitForTimeout(500);
// Type recipient
await page.keyboard.type('recipient@email.com');
await page.waitForTimeout(500);
// Tab to subject
await page.keyboard.press('Tab');
await page.waitForTimeout(500);
// Type subject
await page.keyboard.type('Your subject here');
await page.waitForTimeout(500);
// Tab to body
await page.keyboard.press('Tab');
await page.waitForTimeout(500);
// Type message
await page.keyboard.type('Your message here...');
// Send with Ctrl+Enter
await page.keyboard.press('Control+Enter');
await page.waitForTimeout(3000);
5. 登出 (please, 's polite)
await page.click('button[aria-label="Settings"]');
await page.click('text=Sign out');
await browser.close();
Environment Variables
Don't hardcode passwords (seriously, don't):
export PROTON_EMAIL="your@email.com"
export PROTON_PASSWORD="yourpassword"
Then in code:
const email = process.env.PROTON_EMAIL;
const password = process.env.PROTON_PASSWORD;
Complete 示例
const { chromium } = require('playwright');async function main() {
const email = process.env.PROTON_EMAIL || 'your@email.com';
const password = process.env.PROTON_PASSWORD || 'yourpassword';
const browser = await chromium.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']
});
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
});
const page = await context.newPage();
await page.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});
// Login
await page.goto('https://account.proton.me/login');
await page.fill('#username', email);
await page.fill('#password', password);
await page.click('button[type=submit]');
await page.waitForTimeout(5000);
// Go to compose
await page.goto('https://mail.proton.me/compose');
await page.waitForTimeout(3000);
// Send email using keyboard navigation (most reliable)
await page.keyboard.press('Tab');
await page.keyboard.type('recipient@email.com');
await page.keyboard.press('Tab');
await page.keyboard.type('Test Subject');
await page.keyboard.press('Tab');
await page.keyboard.type('Hello! This is a test email.');
await page.keyboard.press('Control+Enter');
await page.waitForTimeout(3000);
console.log('📧 Email sent!');
await browser.close();
}
main();
Limitations
- 2FA: 可以't 做 2FA 通过 automation (使用 browser 在...上 device 对于 initial 登录, 然后 Cookie 会话)
- Rate limiting: ProtonMail might throttle 您 如果 您 go crazy
- Dynamic UI: 类 names 更改. 使用 text selectors 或 ARIA 当...时 possible
- Headless detection: Works mostly, 但是 Proton might occasionally notice
Troubleshooting
"chromium 不 found"
npx playwright install chromium
Bot detection / 登录 fails
- 验证 bot detection bypass 已启用
- Check 用户 agent 字符串 current
- Try headed mode 对于 testing
超时 errors
- Increase waitForTimeout values
- Check internet
- ProtonMail might rate limiting
"libX11 不 found"
Install system dependencies (see Requirements section)Security Notes
- 🔒 Credentials 应该 come 从 environment variables, 不 hardcoded
- 🔑 使用 app-specific passwords 如果 ProtonMail supports them
- 📝 Always 登出 当...时 已完成
- 🍪 会话 cookies 可以 saved 对于 re-使用 (advanced)
Made 带有 🦞🔒
从 Claws 对于 Claws. 因为 reading emails manually 对于 plebs.
HQ Quality Approved.
免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制