# AnyRFC
> **Complete, RFC-compliant protocol clients built with AnyIO structured concurrency**
[](https://badge.fury.io/py/anyrfc)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://github.com/astral-sh/ruff)
AnyRFC provides **RFC-compliant protocol clients** that prioritize correctness, security, and modern
async patterns. Built exclusively with [AnyIO](https://anyio.readthedocs.io/) for structured concurrency.
## Why AnyRFC?
๐ฏ **RFC Compliance First** - Every implementation passes comprehensive RFC test suites
โก **Modern Async** - Structured concurrency with AnyIO (no asyncio dependency hell)
๐ **Security by Default** - TLS everywhere, proper certificate validation, secure authentication
๐งช **Battle-Tested** - Real-world interoperability testing against major servers
๐ **Type Safe** - Full mypy compliance with strict typing
๐ **Complete** - Full implementations, not toys or demos
## Quick Start
```bash
pip install anyrfc
```
```python
import anyio
from anyrfc import WebSocketClient
async def main():
async with WebSocketClient("wss://echo.websocket.org/") as ws:
await ws.send_text("Hello, AnyRFC!")
async for message in ws.receive():
print(f"Received: {message}")
break # Just get the first message
anyio.run(main)
```
## What's Included
### ๐ WebSocket Client (RFC 6455)
Complete WebSocket implementation with all RFC 6455 features:
```python
from anyrfc import WebSocketClient, CloseCode
async with WebSocketClient("wss://api.example.com/ws") as ws:
# Send different message types
await ws.send_text("Hello!")
await ws.send_binary(b"\\x00\\x01\\x02\\x03")
# Handle incoming messages
async for message in ws.receive():
if isinstance(message, str):
print(f"Text: {message}")
else:
print(f"Binary: {message.hex()}")
if should_close:
await ws.close(CloseCode.NORMAL_CLOSURE)
break
```
**Features:**
- โ
All frame types (text, binary, ping, pong, close)
- โ
Message fragmentation and reassembly
- โ
Proper client-side frame masking
- โ
Extension support framework
- โ
Graceful connection handling
- โ
Real-server compatibility
### ๐ง Email Clients (IMAP & SMTP)
Battle-tested email clients with full RFC compliance and real-world Gmail compatibility:
```python
from anyrfc import IMAPClient, SMTPClient
# IMAP - Complete email operations
async with IMAPClient("imap.gmail.com", use_tls=True) as imap:
await imap.authenticate({"username": "user", "password": "app_password"})
await imap.select_mailbox("INBOX")
# Search and read emails
messages = await imap.search_messages("UNSEEN")
for msg_id in messages[:5]:
email = await imap.fetch_messages(str(msg_id), "BODY[]")
# Mark as read
await imap.store_message_flags(str(msg_id), [b"\\Seen"], "FLAGS")
# Create drafts with proper literal continuation
await imap.append_message("Drafts", email_content, [b"\\Draft"])
# Extract attachments as binary BLOBs
bodystructure = await imap.fetch_messages(str(msg_id), "BODYSTRUCTURE")
# Parse structure and fetch binary parts...
# SMTP - Send emails with authentication
async with SMTPClient("smtp.gmail.com", use_starttls=True) as smtp:
await smtp.authenticate({"username": "user", "password": "app_password"})
await smtp.send_message(
from_addr="sender@example.com",
to_addrs=["recipient@example.com"],
message="""Subject: Hello from AnyRFC!
This email was sent using AnyRFC's SMTP client!
"""
)
```
**IMAP Features (RFC 9051 Compliant):**
- โ
**Complete email operations**: Read, flag, search, delete
- โ
**Draft creation**: APPEND with proper literal continuation
- โ
**Real-time monitoring**: Live email detection with polling
- โ
**Attachment extraction**: Binary BLOB downloads (PDFs, images, etc.)
- โ
**Gmail compatibility**: Tested with live Gmail IMAP servers
- โ
**Extension support**: IDLE, SORT, THREAD, CONDSTORE, QRESYNC
- โ
**Battle-tested**: Handles 178KB+ attachments and complex operations
## Architecture Highlights
### AnyIO Structured Concurrency
Every I/O operation uses AnyIO's structured concurrency primitives:
```python
async def websocket_with_timeout():
async with anyio.create_task_group() as tg:
# Connection with automatic cleanup
tg.start_soon(websocket_handler)
# Heartbeat with cancellation scope
with anyio.move_on_after(30):
tg.start_soon(heartbeat_sender)
```
### RFC Compliance Testing
```python
from anyrfc.websocket import WebSocketClient
client = WebSocketClient("wss://example.com")
compliance_report = await client.validate_compliance()
# Returns detailed RFC 6455 test results
assert compliance_report["handshake_validation"] == True
assert compliance_report["frame_parsing"] == True
assert compliance_report["close_sequence"] == True
```
### Type Safety
```python
from anyrfc import WebSocketClient
from anyrfc.websocket import WSFrame, OpCode
# Fully typed interfaces
client: WebSocketClient = WebSocketClient("wss://api.example.com")
frame: WSFrame = WSFrame(fin=True, opcode=OpCode.TEXT, payload=b"test")
# MyPy validates everything
reveal_type(client.websocket_state) # WSState
reveal_type(await client.receive()) # Union[str, bytes]
```
## Installation & Setup
### Basic Installation
```bash
pip install anyrfc
```
### Development Setup
```bash
git clone https://github.com/elgertam/anyrfc.git
cd anyrfc
# Install with uv (recommended)
uv sync --all-extras
# Or with pip
pip install -e ".[dev]"
```
### Requirements
- **Python**: 3.11+
- **Core**: `anyio>=4.0.0`
- **HTTP**: `httpx>=0.25.0` (approved dependency)
- **Types**: `typing-extensions>=4.0.0`
## Real-World Examples
### WebSocket Trading Client
```python
from anyrfc import WebSocketClient
import json
async def crypto_prices():
# Binance public data stream (no authentication required)
uri = "wss://data-stream.binance.vision/ws/btcusdt@ticker"
# Use relaxed validation for real-world servers
async with WebSocketClient(uri, strict_rfc_validation=False) as ws:
async for message in ws.receive():
data = json.loads(message)
if 'c' in data: # Current price
price = float(data['c'])
change = float(data['P']) # 24hr change %
print(f"๐ฐ BTC-USDT: ${price:,.2f} ({change:+.2f}%)")
```
### Email Monitoring Service
```python
from anyrfc import IMAPClient
import anyio
import re
async def email_monitor():
"""Real-time email monitoring with secret code extraction."""
async with IMAPClient("imap.gmail.com", use_tls=True) as imap:
await imap.authenticate({"username": "user", "password": "app_password"})
await imap.select_mailbox("INBOX")
while True:
# Check for new emails every 5 seconds (production-tested)
unread = await imap.search_messages("UNSEEN")
if unread:
print(f"๐ง {len(unread)} new emails!")
for msg_id in unread:
# Fetch email content
email_data = await imap.fetch_messages(str(msg_id), "BODY[]")
email_text = email_data[str(msg_id)][b"BODY[]"].decode()
# Extract verification codes (6 digits)
codes = re.findall(r'\b\d{6}\b', email_text)
if codes:
print(f"๐ Verification code found: {codes[0]}")
# Mark as read
await imap.store_message_flags(str(msg_id), [b"\\Seen"], "FLAGS")
await anyio.sleep(5) # 5-second polling proven effective
```
## Testing & Quality
### Comprehensive Test Suite
```bash
# Run all tests
uv run pytest
# RFC compliance tests
uv run pytest tests/rfc_compliance/ -v
# Real-server interoperability
uv run pytest tests/interop/ -v
# Type checking
uv run mypy src/
# Linting
uv run ruff check src/
```
### Real-Server Testing
AnyRFC is extensively tested against production servers:
- โ
**WebSocket**: echo.websocket.org, Binance WebSocket API, major services
- โ
**IMAP**: Live Gmail operations (read, flag, drafts, attachments)
- โ
**SMTP**: Gmail, SendGrid, major SMTP services
- โ
**Production verified**: Real-time email monitoring, 178KB+ file transfers
- โ
**Compliance tested**: Autobahn WebSocket suite, RFC test vectors
## Protocol Roadmap
### โ
Phase 1: WebSocket Foundation (Complete)
- [x] WebSocket Client (RFC 6455)
- [x] Autobahn test suite compliance
- [x] Real-world server compatibility
### โ
Phase 2: Email Infrastructure (Complete)
- [x] **IMAP Client (RFC 9051)**
- [x] Complete email operations (read, flag, search, delete)
- [x] Draft creation with literal continuation
- [x] Attachment extraction (binary BLOBs)
- [x] Real-time email monitoring
- [x] Gmail production testing
- [x] Extensions: IDLE, SORT, THREAD, CONDSTORE, QRESYNC
- [x] SMTP Client Foundation (RFC 5321)
- [x] SASL authentication framework (RFC 4422)
### ๐ง Phase 3: OAuth & Modern Auth (In Progress)
- [ ] OAuth 2.0 client (RFC 6749/6750)
- [ ] JWT handling (RFC 7519)
- [ ] PKCE support (RFC 7636)
- [ ] Device authorization flow (RFC 8628)
- [ ] MIME message composition (RFC 2045-2049)
- [ ] Advanced SMTP features (DKIM, SPF validation)
### ๐ฎ Phase 4: Advanced Protocols
- [ ] SSH client suite (RFC 4251-4254)
- [ ] SFTP file transfer
- [ ] DNS-over-HTTPS (RFC 8484)
- [ ] CoAP for IoT (RFC 7252)
## Performance
AnyRFC is built for high-performance workloads:
```python
# Concurrent WebSocket connections
async def stress_test():
async with anyio.create_task_group() as tg:
for i in range(100):
tg.start_soon(websocket_worker, f"wss://api{i}.example.com")
# Memory-efficient message streaming
async def large_mailbox():
async with IMAPClient("imap.example.com") as imap:
# Stream large mailboxes without loading everything into memory
async for message in imap.fetch_messages("1:*", "BODY[]"):
await process_message(message) # Process one at a time
```
## Contributing
We welcome contributions! AnyRFC follows strict quality standards:
1. **RFC Compliance**: All features must be RFC-compliant
2. **AnyIO Only**: No asyncio imports allowed
3. **Type Safety**: Full mypy compliance required
4. **Real-World Testing**: Test against actual servers
5. **Security First**: Secure by default
See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
## Security
- ๐ **TLS Everywhere**: Secure connections by default
- ๐ก๏ธ **Input Validation**: Strict RFC-compliant parsing
- ๐ **Credential Safety**: Never logs or stores credentials insecurely
- ๐ **Security Audits**: Regular dependency and code security reviews
Report security issues to: [andrew@elgert.org](mailto:andrew@elgert.org)
## License
MIT License - see [LICENSE](LICENSE) for details.
## Why "AnyRFC"?
**Any** + **RFC** = Protocol clients that work with **any** server implementing the **RFC** standard. Built on
**AnyIO** for structured concurrency.
---
**Built by [Andrew M. Elgert](https://github.com/elgertam) โข [Documentation](https://github.com/elgertam/anyrfc#readme) โข [Issues](https://github.com/elgertam/anyrfc/issues) โข [PyPI](https://pypi.org/project/anyrfc/)**
Raw data
{
"_id": null,
"home_page": null,
"name": "anyrfc",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "\"Andrew M. Elgert\" <andrew@elgert.org>",
"keywords": "anyio, async, client, imap, protocol, rfc, rfc5321, rfc6455, rfc9051, smtp, structured-concurrency, websocket",
"author": null,
"author_email": "\"Andrew M. Elgert\" <andrew@elgert.org>",
"download_url": "https://files.pythonhosted.org/packages/47/dc/fecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354/anyrfc-0.3.1.tar.gz",
"platform": null,
"description": "# AnyRFC\n\n> **Complete, RFC-compliant protocol clients built with AnyIO structured concurrency**\n\n[](https://badge.fury.io/py/anyrfc)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n[](https://github.com/astral-sh/ruff)\n\nAnyRFC provides **RFC-compliant protocol clients** that prioritize correctness, security, and modern\nasync patterns. Built exclusively with [AnyIO](https://anyio.readthedocs.io/) for structured concurrency.\n\n## Why AnyRFC?\n\n\ud83c\udfaf **RFC Compliance First** - Every implementation passes comprehensive RFC test suites \n\u26a1 **Modern Async** - Structured concurrency with AnyIO (no asyncio dependency hell) \n\ud83d\udd12 **Security by Default** - TLS everywhere, proper certificate validation, secure authentication \n\ud83e\uddea **Battle-Tested** - Real-world interoperability testing against major servers \n\ud83d\udcdd **Type Safe** - Full mypy compliance with strict typing \n\ud83d\ude80 **Complete** - Full implementations, not toys or demos \n\n## Quick Start\n\n```bash\npip install anyrfc\n```\n\n```python\nimport anyio\nfrom anyrfc import WebSocketClient\n\nasync def main():\n async with WebSocketClient(\"wss://echo.websocket.org/\") as ws:\n await ws.send_text(\"Hello, AnyRFC!\")\n async for message in ws.receive():\n print(f\"Received: {message}\")\n break # Just get the first message\n\nanyio.run(main)\n```\n\n## What's Included\n\n### \ud83c\udf10 WebSocket Client (RFC 6455)\n\nComplete WebSocket implementation with all RFC 6455 features:\n\n```python\nfrom anyrfc import WebSocketClient, CloseCode\n\nasync with WebSocketClient(\"wss://api.example.com/ws\") as ws:\n # Send different message types\n await ws.send_text(\"Hello!\")\n await ws.send_binary(b\"\\\\x00\\\\x01\\\\x02\\\\x03\")\n\n # Handle incoming messages\n async for message in ws.receive():\n if isinstance(message, str):\n print(f\"Text: {message}\")\n else:\n print(f\"Binary: {message.hex()}\")\n\n if should_close:\n await ws.close(CloseCode.NORMAL_CLOSURE)\n break\n```\n\n**Features:**\n\n- \u2705 All frame types (text, binary, ping, pong, close)\n- \u2705 Message fragmentation and reassembly\n- \u2705 Proper client-side frame masking\n- \u2705 Extension support framework\n- \u2705 Graceful connection handling\n- \u2705 Real-server compatibility\n\n### \ud83d\udce7 Email Clients (IMAP & SMTP)\n\nBattle-tested email clients with full RFC compliance and real-world Gmail compatibility:\n\n```python\nfrom anyrfc import IMAPClient, SMTPClient\n\n# IMAP - Complete email operations\nasync with IMAPClient(\"imap.gmail.com\", use_tls=True) as imap:\n await imap.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n await imap.select_mailbox(\"INBOX\")\n\n # Search and read emails\n messages = await imap.search_messages(\"UNSEEN\")\n for msg_id in messages[:5]:\n email = await imap.fetch_messages(str(msg_id), \"BODY[]\")\n \n # Mark as read\n await imap.store_message_flags(str(msg_id), [b\"\\\\Seen\"], \"FLAGS\")\n\n # Create drafts with proper literal continuation\n await imap.append_message(\"Drafts\", email_content, [b\"\\\\Draft\"])\n\n # Extract attachments as binary BLOBs\n bodystructure = await imap.fetch_messages(str(msg_id), \"BODYSTRUCTURE\")\n # Parse structure and fetch binary parts...\n\n# SMTP - Send emails with authentication\nasync with SMTPClient(\"smtp.gmail.com\", use_starttls=True) as smtp:\n await smtp.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n await smtp.send_message(\n from_addr=\"sender@example.com\",\n to_addrs=[\"recipient@example.com\"],\n message=\"\"\"Subject: Hello from AnyRFC!\n\nThis email was sent using AnyRFC's SMTP client!\n\"\"\"\n )\n```\n\n**IMAP Features (RFC 9051 Compliant):**\n\n- \u2705 **Complete email operations**: Read, flag, search, delete\n- \u2705 **Draft creation**: APPEND with proper literal continuation\n- \u2705 **Real-time monitoring**: Live email detection with polling\n- \u2705 **Attachment extraction**: Binary BLOB downloads (PDFs, images, etc.)\n- \u2705 **Gmail compatibility**: Tested with live Gmail IMAP servers\n- \u2705 **Extension support**: IDLE, SORT, THREAD, CONDSTORE, QRESYNC\n- \u2705 **Battle-tested**: Handles 178KB+ attachments and complex operations\n\n## Architecture Highlights\n\n### AnyIO Structured Concurrency\n\nEvery I/O operation uses AnyIO's structured concurrency primitives:\n\n```python\nasync def websocket_with_timeout():\n async with anyio.create_task_group() as tg:\n # Connection with automatic cleanup\n tg.start_soon(websocket_handler)\n\n # Heartbeat with cancellation scope\n with anyio.move_on_after(30):\n tg.start_soon(heartbeat_sender)\n```\n\n### RFC Compliance Testing\n\n```python\nfrom anyrfc.websocket import WebSocketClient\n\nclient = WebSocketClient(\"wss://example.com\")\ncompliance_report = await client.validate_compliance()\n\n# Returns detailed RFC 6455 test results\nassert compliance_report[\"handshake_validation\"] == True\nassert compliance_report[\"frame_parsing\"] == True\nassert compliance_report[\"close_sequence\"] == True\n```\n\n### Type Safety\n\n```python\nfrom anyrfc import WebSocketClient\nfrom anyrfc.websocket import WSFrame, OpCode\n\n# Fully typed interfaces\nclient: WebSocketClient = WebSocketClient(\"wss://api.example.com\")\nframe: WSFrame = WSFrame(fin=True, opcode=OpCode.TEXT, payload=b\"test\")\n\n# MyPy validates everything\nreveal_type(client.websocket_state) # WSState\nreveal_type(await client.receive()) # Union[str, bytes]\n```\n\n## Installation & Setup\n\n### Basic Installation\n\n```bash\npip install anyrfc\n```\n\n### Development Setup\n\n```bash\ngit clone https://github.com/elgertam/anyrfc.git\ncd anyrfc\n\n# Install with uv (recommended)\nuv sync --all-extras\n\n# Or with pip\npip install -e \".[dev]\"\n```\n\n### Requirements\n\n- **Python**: 3.11+\n- **Core**: `anyio>=4.0.0`\n- **HTTP**: `httpx>=0.25.0` (approved dependency)\n- **Types**: `typing-extensions>=4.0.0`\n\n## Real-World Examples\n\n### WebSocket Trading Client\n\n```python\nfrom anyrfc import WebSocketClient\nimport json\n\nasync def crypto_prices():\n # Binance public data stream (no authentication required)\n uri = \"wss://data-stream.binance.vision/ws/btcusdt@ticker\"\n\n # Use relaxed validation for real-world servers\n async with WebSocketClient(uri, strict_rfc_validation=False) as ws:\n async for message in ws.receive():\n data = json.loads(message)\n if 'c' in data: # Current price\n price = float(data['c'])\n change = float(data['P']) # 24hr change %\n print(f\"\ud83d\udcb0 BTC-USDT: ${price:,.2f} ({change:+.2f}%)\")\n```\n\n### Email Monitoring Service\n\n```python\nfrom anyrfc import IMAPClient\nimport anyio\nimport re\n\nasync def email_monitor():\n \"\"\"Real-time email monitoring with secret code extraction.\"\"\"\n async with IMAPClient(\"imap.gmail.com\", use_tls=True) as imap:\n await imap.authenticate({\"username\": \"user\", \"password\": \"app_password\"})\n await imap.select_mailbox(\"INBOX\")\n\n while True:\n # Check for new emails every 5 seconds (production-tested)\n unread = await imap.search_messages(\"UNSEEN\")\n if unread:\n print(f\"\ud83d\udce7 {len(unread)} new emails!\")\n \n for msg_id in unread:\n # Fetch email content\n email_data = await imap.fetch_messages(str(msg_id), \"BODY[]\")\n email_text = email_data[str(msg_id)][b\"BODY[]\"].decode()\n \n # Extract verification codes (6 digits)\n codes = re.findall(r'\\b\\d{6}\\b', email_text)\n if codes:\n print(f\"\ud83d\udd10 Verification code found: {codes[0]}\")\n \n # Mark as read\n await imap.store_message_flags(str(msg_id), [b\"\\\\Seen\"], \"FLAGS\")\n\n await anyio.sleep(5) # 5-second polling proven effective\n```\n\n## Testing & Quality\n\n### Comprehensive Test Suite\n\n```bash\n# Run all tests\nuv run pytest\n\n# RFC compliance tests\nuv run pytest tests/rfc_compliance/ -v\n\n# Real-server interoperability\nuv run pytest tests/interop/ -v\n\n# Type checking\nuv run mypy src/\n\n# Linting\nuv run ruff check src/\n```\n\n### Real-Server Testing\n\nAnyRFC is extensively tested against production servers:\n\n- \u2705 **WebSocket**: echo.websocket.org, Binance WebSocket API, major services\n- \u2705 **IMAP**: Live Gmail operations (read, flag, drafts, attachments)\n- \u2705 **SMTP**: Gmail, SendGrid, major SMTP services\n- \u2705 **Production verified**: Real-time email monitoring, 178KB+ file transfers\n- \u2705 **Compliance tested**: Autobahn WebSocket suite, RFC test vectors\n\n## Protocol Roadmap\n\n### \u2705 Phase 1: WebSocket Foundation (Complete)\n\n- [x] WebSocket Client (RFC 6455)\n- [x] Autobahn test suite compliance\n- [x] Real-world server compatibility\n\n### \u2705 Phase 2: Email Infrastructure (Complete)\n\n- [x] **IMAP Client (RFC 9051)**\n - [x] Complete email operations (read, flag, search, delete)\n - [x] Draft creation with literal continuation\n - [x] Attachment extraction (binary BLOBs)\n - [x] Real-time email monitoring\n - [x] Gmail production testing\n - [x] Extensions: IDLE, SORT, THREAD, CONDSTORE, QRESYNC\n- [x] SMTP Client Foundation (RFC 5321)\n- [x] SASL authentication framework (RFC 4422)\n\n### \ud83d\udea7 Phase 3: OAuth & Modern Auth (In Progress)\n\n- [ ] OAuth 2.0 client (RFC 6749/6750)\n- [ ] JWT handling (RFC 7519)\n- [ ] PKCE support (RFC 7636)\n- [ ] Device authorization flow (RFC 8628)\n- [ ] MIME message composition (RFC 2045-2049)\n- [ ] Advanced SMTP features (DKIM, SPF validation)\n\n### \ud83d\udd2e Phase 4: Advanced Protocols\n\n- [ ] SSH client suite (RFC 4251-4254)\n- [ ] SFTP file transfer\n- [ ] DNS-over-HTTPS (RFC 8484)\n- [ ] CoAP for IoT (RFC 7252)\n\n## Performance\n\nAnyRFC is built for high-performance workloads:\n\n```python\n# Concurrent WebSocket connections\nasync def stress_test():\n async with anyio.create_task_group() as tg:\n for i in range(100):\n tg.start_soon(websocket_worker, f\"wss://api{i}.example.com\")\n\n# Memory-efficient message streaming\nasync def large_mailbox():\n async with IMAPClient(\"imap.example.com\") as imap:\n # Stream large mailboxes without loading everything into memory\n async for message in imap.fetch_messages(\"1:*\", \"BODY[]\"):\n await process_message(message) # Process one at a time\n```\n\n## Contributing\n\nWe welcome contributions! AnyRFC follows strict quality standards:\n\n1. **RFC Compliance**: All features must be RFC-compliant\n2. **AnyIO Only**: No asyncio imports allowed\n3. **Type Safety**: Full mypy compliance required\n4. **Real-World Testing**: Test against actual servers\n5. **Security First**: Secure by default\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.\n\n## Security\n\n- \ud83d\udd12 **TLS Everywhere**: Secure connections by default\n- \ud83d\udee1\ufe0f **Input Validation**: Strict RFC-compliant parsing\n- \ud83d\udd10 **Credential Safety**: Never logs or stores credentials insecurely\n- \ud83d\udccb **Security Audits**: Regular dependency and code security reviews\n\nReport security issues to: [andrew@elgert.org](mailto:andrew@elgert.org)\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Why \"AnyRFC\"?\n\n**Any** + **RFC** = Protocol clients that work with **any** server implementing the **RFC** standard. Built on\n**AnyIO** for structured concurrency.\n\n---\n\n**Built by [Andrew M. Elgert](https://github.com/elgertam) \u2022 [Documentation](https://github.com/elgertam/anyrfc#readme) \u2022 [Issues](https://github.com/elgertam/anyrfc/issues) \u2022 [PyPI](https://pypi.org/project/anyrfc/)**\n",
"bugtrack_url": null,
"license": null,
"summary": "Complete, RFC-compliant protocol clients using AnyIO structured concurrency",
"version": "0.3.1",
"project_urls": {
"Bug Tracker": "https://github.com/elgertam/anyrfc/issues",
"Changelog": "https://github.com/elgertam/anyrfc/blob/master/CHANGELOG.md",
"Documentation": "https://github.com/elgertam/anyrfc#readme",
"Homepage": "https://github.com/elgertam/anyrfc",
"Repository": "https://github.com/elgertam/anyrfc.git"
},
"split_keywords": [
"anyio",
" async",
" client",
" imap",
" protocol",
" rfc",
" rfc5321",
" rfc6455",
" rfc9051",
" smtp",
" structured-concurrency",
" websocket"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "947f4ff2ff0ce3a258e9e66e4ccc6ffd4789926e3ac4a311d0a2e38ffc9e8de7",
"md5": "584dd50e917682afe8544daec6cdd167",
"sha256": "828656c7b75eb53cd0d01b40704b69e7bc1ced8ae224ae4692425f6125b143cf"
},
"downloads": -1,
"filename": "anyrfc-0.3.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "584dd50e917682afe8544daec6cdd167",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 85094,
"upload_time": "2025-08-18T02:50:25",
"upload_time_iso_8601": "2025-08-18T02:50:25.520032Z",
"url": "https://files.pythonhosted.org/packages/94/7f/4ff2ff0ce3a258e9e66e4ccc6ffd4789926e3ac4a311d0a2e38ffc9e8de7/anyrfc-0.3.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "47dcfecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354",
"md5": "11ff8a00f1ff21631d4316bd767f1f98",
"sha256": "0c73ba6b89cff1f15d32f294688b290a370450ab9d8cd14db08740a6ecc0f0e2"
},
"downloads": -1,
"filename": "anyrfc-0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "11ff8a00f1ff21631d4316bd767f1f98",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 367468,
"upload_time": "2025-08-18T02:50:26",
"upload_time_iso_8601": "2025-08-18T02:50:26.517807Z",
"url": "https://files.pythonhosted.org/packages/47/dc/fecb425cc44e01b18393a0a863d0e88a8ba5978b9670f68a4e83756a4354/anyrfc-0.3.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-18 02:50:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "elgertam",
"github_project": "anyrfc",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "anyrfc"
}