Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Manage ProtonMail emails via Playwright browser automation. Login, read, send, and manage your encrypted inbox.
Manage ProtonMail emails via Playwright browser automation. Login, read, send, and manage your encrypted inbox.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Your encrypted inbox, automated. Because checking emails manually is so 2010.
Login to any ProtonMail account securely Read emails from your inbox Send new emails with compose functionality Manage your mailbox like a pro All via Playwright browser automation. No API keys, no IMAP/SMTP headaches - just a real browser doing real browser things.
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 is... leisurely Automation is hot Why click when you can script?
Node.js 18+ (20+ recommended) Playwright 1.40+ (npm install playwright) Chromium browser (npx playwright install chromium)
# 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
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. โจ
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 }; }
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);
await page.click('.item:first-child'); await page.waitForTimeout(2000); const content = await page.evaluate(() => document.querySelector('.message-content')?.innerText );
// 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);
await page.click('button[aria-label="Settings"]'); await page.click('text=Sign out'); await browser.close();
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;
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();
2FA: Can't do 2FA via automation (use a browser on your device for initial login, then cookie session) Rate limiting: ProtonMail might throttle you if you go crazy Dynamic UI: Class names change. Use text selectors or ARIA when possible Headless detection: Works mostly, but Proton might occasionally notice
npx playwright install chromium
Verify bot detection bypass is enabled Check user agent string is current Try headed mode for testing
Increase waitForTimeout values Check your internet ProtonMail might be rate limiting
Install system dependencies (see Requirements section)
๐ Credentials should come from environment variables, not hardcoded ๐ Use app-specific passwords if ProtonMail supports them ๐ Always logout when done ๐ช Session cookies can be saved for re-use (advanced) Made with ๐ฆ๐ From Claws for Claws. Because reading emails manually is for plebs. HQ Quality Approved.
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.