# Send Proton Mail to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
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.
```
### Upgrade existing

```text
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.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "protonmail-claw",
    "name": "Proton Mail",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "canonicalUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/protonmail-claw",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=protonmail-claw",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "protonmail-claw",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T13:09:44.120Z",
      "expiresAt": "2026-05-14T13:09:44.120Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=protonmail-claw",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=protonmail-claw",
        "contentDisposition": "attachment; filename=\"protonmail-claw-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "protonmail-claw"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/protonmail-claw"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/protonmail-claw",
    "downloadUrl": "https://openagent3.xyz/downloads/protonmail-claw",
    "agentUrl": "https://openagent3.xyz/skills/protonmail-claw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/protonmail-claw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/protonmail-claw/agent.md"
  }
}
```
## Documentation

### ProtonMail 📨

Your encrypted inbox, automated. Because checking emails manually is so 2010.

### What it does

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.

### Why this 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 is... leisurely
Automation is hot
Why click when you can script?

### The Basics

Node.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

### The 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. ✨

### 1. Login

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. Read Email

await page.click('.item:first-child');
await page.waitForTimeout(2000);

const content = await page.evaluate(() => 
  document.querySelector('.message-content')?.innerText
);

### 4. Send 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. Logout (please, it'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 Example

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: 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

### "chromium not found"

npx playwright install chromium

### Bot detection / Login fails

Verify bot detection bypass is enabled
Check user agent string is current
Try headed mode for testing

### Timeout errors

Increase waitForTimeout values
Check your internet
ProtonMail might be rate limiting

### "libX11 not found"

Install system dependencies (see Requirements section)

### Security Notes

🔒 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.
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: Christopher-Schulze
- Version: 1.0.1
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-05-07T13:09:44.120Z
- Expires at: 2026-05-14T13:09:44.120Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/protonmail-claw)
- [Send to Agent page](https://openagent3.xyz/skills/protonmail-claw/agent)
- [JSON manifest](https://openagent3.xyz/skills/protonmail-claw/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/protonmail-claw/agent.md)
- [Download page](https://openagent3.xyz/downloads/protonmail-claw)