Python examples for Mailoverse using the requests library. Learn to retrieve emails, implement polling, and create a reusable client class for email testing in Python.
Python
Examples for Python using the requests library.
Using requests
import os
import requests
MAILOVERSE_DOMAIN = os.environ['MAILOVERSE_DOMAIN']
MAILOVERSE_API_KEY = os.environ['MAILOVERSE_API_KEY']
def get_email(address: str) -> dict | None:
response = requests.get(
'https://api.mailoverse.com/email',
params={'address': address},
headers={'Authorization': f'Bearer {MAILOVERSE_API_KEY}'}
)
response.raise_for_status()
return response.json()['email']
# Usage
email = get_email(f'test@{MAILOVERSE_DOMAIN}')
if email:
print(f"Subject: {email['subject']}")
print(f"Links: {email['parsedHtml']['links']}")With Polling
import os
import time
import requests
def wait_for_email(address: str, timeout: int = 30, interval: int = 1) -> dict:
"""Poll for an email until it arrives or timeout is reached."""
start_time = time.time()
headers = {'Authorization': f"Bearer {os.environ['MAILOVERSE_API_KEY']}"}
while time.time() - start_time < timeout:
response = requests.get(
'https://api.mailoverse.com/email',
params={'address': address},
headers=headers
)
response.raise_for_status()
data = response.json()
if data['email']:
return data['email']
time.sleep(interval)
raise TimeoutError(f'Timeout waiting for email to {address}')
# Usage
email = wait_for_email('test@yoursubdomain.mailoverse.com')
print(f"Received: {email['subject']}")Client Class
A full-featured client class with type hints and dataclasses:
import os
import time
from typing import Optional
from dataclasses import dataclass
import requests
@dataclass
class ParsedContent:
links: list[dict[str, str]]
images: list[str]
body: str
@dataclass
class Email:
id: str
from_addresses: list[str]
to_addresses: list[str]
subject: Optional[str]
body: Optional[str]
html_body: Optional[str]
parsed_html: Optional[ParsedContent]
parsed_text: Optional[ParsedContent]
received_at: str
@classmethod
def from_dict(cls, data: dict) -> 'Email':
return cls(
id=data['id'],
from_addresses=data['from'],
to_addresses=data['to'],
subject=data.get('subject'),
body=data.get('body'),
html_body=data.get('htmlBody'),
parsed_html=ParsedContent(**data['parsedHtml']) if data.get('parsedHtml') else None,
parsed_text=ParsedContent(**data['parsedText']) if data.get('parsedText') else None,
received_at=data['receivedAt'],
)
class MailoverseClient:
def __init__(self, api_key: Optional[str] = None, domain: Optional[str] = None):
self.api_key = api_key or os.environ['MAILOVERSE_API_KEY']
self.domain = domain or os.environ['MAILOVERSE_DOMAIN']
self.base_url = 'https://api.mailoverse.com'
def get_email(self, address: str) -> Optional[Email]:
response = requests.get(
f'{self.base_url}/email',
params={'address': address},
headers={'Authorization': f'Bearer {self.api_key}'}
)
response.raise_for_status()
data = response.json()['email']
return Email.from_dict(data) if data else None
def wait_for_email(
self,
address: str,
timeout: int = 30,
interval: int = 1
) -> Email:
start_time = time.time()
while time.time() - start_time < timeout:
email = self.get_email(address)
if email:
return email
time.sleep(interval)
raise TimeoutError(f'Timeout waiting for email to {address}')
def generate_test_email(self, prefix: str = 'test') -> str:
import random
import string
suffix = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
return f'{prefix}-{int(time.time())}-{suffix}@{self.domain}'
# Usage
client = MailoverseClient()
test_email = client.generate_test_email('signup')
email = client.wait_for_email(test_email)
print(f"Received: {email.subject}")Using with pytest
import pytest
from mailoverse import MailoverseClient
@pytest.fixture
def mailoverse():
return MailoverseClient()
def test_signup_sends_verification_email(mailoverse, app_client):
test_email = mailoverse.generate_test_email('signup')
# Trigger signup in your app
app_client.post('/signup', json={
'email': test_email,
'password': 'SecurePass123!'
})
# Wait for verification email
email = mailoverse.wait_for_email(test_email)
assert 'Verify' in email.subject
assert email.parsed_html is not None
assert len(email.parsed_html.links) == 1
assert '/verify?token=' in email.parsed_html.links[0]['href']