email.utils.parseaddr() is a function in the Python
standard library that pulls a display name and an email address out of a raw email header.
parseaddr.com is a hosted API that turns messy free-text postal addresses into
clean structured fields. Same name, different problem. If a search engine pointed you here because
"parseaddr" usually means the Python function, this page is for you.
It is the standard library's one-liner for a single email header:
from email.utils import parseaddr
parseaddr('"Jane Doe" <jane.doe@example.com>')
# returns the 2-tuple: ('Jane Doe', 'jane.doe@example.com')
Given one header value it returns (display name, email address). Its contract is narrow:
it is designed for a single address in a single header, and it expects input that mostly follows
RFC 2822. Real-world input is
rarely that tidy.
Robust extraction from real-world headers is harder than the one-liner suggests. The failure modes are documented, not hypothetical:
To: or Cc: header can hold several
addresses; parseaddr handles one, so splitting lists is on you, and naive splits on commas
break the next case."Doe, Jane" <jane@example.com>. Quoting rules are exactly where
naive comma-splitting and regex parsers break.email/_parseaddr.py. In applications that gate access on a verified email domain (for
example, signup restricted to @company.example.com), that misparse can be a bypass. It was
fixed upstream in later Python releases.The lesson generalizes beyond email: naive parsers are fine on the happy path and brittle at the edges. When the string you actually need to parse is a postal address, you want a parser built for the mess, not a regex you maintain yourself.
parseaddr is a hosted postal address parsing API. One POST call turns free-text input
like flat 2, 10 downing st, london sw1a 2aa into structured fields: house number, road,
unit, city, postcode, country. Under the hood it runs libpostal, the open-source parser trained on about
a billion real addresses, so the edge cases (abbreviations, missing commas, local formats) are handled
rather than hand-rolled:
curl -s https://api.parseaddr.com/v1/parse \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"address":"flat 2, 10 downing st, london sw1a 2aa"}'
Free tier: 2,000 calls a month, no card, key issued instantly at signup. Paid plans start at £19/month for 25,000 calls. Full pricing on the pricing page.
Honest answer: this is not an email parsing or verification service. If your job is extracting names and addresses from email headers, the stdlib function is a fine starting point on a current Python where CVE-2023-27043 is fixed, and there are dedicated email parsing services for inbox-scale workloads. parseaddr.com is for physical addresses: e-commerce checkout, delivery and logistics, CRM dedup, fintech onboarding. The overlap between the two worlds is real, which is why we wrote the parseaddr vs Mailparser explainer.
Is parseaddr.com the same thing as Python's email.utils.parseaddr()? No. One is a standard library function for email headers; the other is a hosted API for postal addresses. The name collision is why this page exists.
Is parseaddr.com an email parser? No. Postal addresses only, as the home page and llms.txt both state plainly.
Does parseaddr.com fix CVE-2023-27043? No, and it does not need to: that is a bug in Python's stdlib email module, fixed upstream. parseaddr.com never parses email headers.
What does it cost to try? Nothing. 2,000 calls a month on the free tier, no card, and the signup form is on the home page.
parseaddr · home · pricing · docs · parseaddr vs Mailparser