Email QR code generator
100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.
Email settings
Design
Add a centre logo
The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.
More design options
The dark half of the code. Keep it well below the background in lightness.
Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.
Contrast 11.5:1 between the modules and the background.
PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.
A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.
The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.
Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.
Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.
The ring of the three finder patterns.
The eye inside each finder pattern.
The blank margin around the code, measured in modules. 4 is the specified minimum.
Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.
A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.
Live preview & export
Enter the address the email should be sent to.
Export
Raster, for screens
Complete the form to enable the downloads.
Export size and encoded text
- Payload
- Nothing encoded yet
- Symbol
- Not built yet
- Recovery
- M
Waiting for input
A mailto: QR code opens the phone's mail app with the recipient, subject and message already written, leaving the sender only to press send. The whole message sits in readable text inside the symbol, so it is a prompt rather than a private channel.
When someone scans it
The phone opens a new draft in its default mail app, addressed and pre-filled. Nothing is sent until the person taps send.
How the mailto: URI is put together
The payload is a URI defined by RFC 6068. The address follows the scheme directly, and anything else arrives as a query: the first parameter after a question mark, the rest joined by ampersands. mailto:hello@example.com?subject=Stand%2014%20enquiry&body=Please%20send%20a%20quote. is a complete payload.
Encoding is where hand-built mailto: codes break. Reserved characters have to be percent-encoded, and non-ASCII text has to be converted to UTF-8 first and then percent-encoded byte by byte. RFC 6068 is explicit that spaces should be written as %20, not as a plus sign, because a plus cannot be told apart from a literal plus in an address.
Line breaks in the body must be encoded as %0D%0A. A raw newline in the payload either truncates the body at the break or produces a URI a mail app will not parse at all.
What mail apps actually honour
RFC 6068 sets a deliberately low bar for readers: a client that resolves a mailto: URI must handle the subject header and the body, and nothing more is guaranteed. In practice cc and bcc are honoured by most desktop clients and ignored by a good number of mobile ones, which is why this page does not offer fields that would silently disappear.
The scan opens whatever the phone has set as its default mail app. If the person has removed the stock mail app and not signed into a replacement, the tap does nothing visible, and that is a device setting rather than a fault in the code.
Long bodies are the other soft limit. Some clients truncate a pre-filled body, and every character also enlarges the symbol, so a mailto: code works best as a subject line plus one or two sentences that identify where the person is standing.
A draft, not a send, and not a secret
Scanning never sends anything. The mail app opens a composed draft in the sender's own account, from their own address, and they can edit every part of it before sending. That also means the message reaches you as an ordinary email with an ordinary reply-to.
Everything in the code is readable. Anyone who photographs the poster can decode the address, the subject and the body with any scanner, so a reference number or a discount phrase in the body is public the moment it is printed.
A printed address is machine-readable in the same way a mailto: link on a web page is, so it can be harvested. A role address such as enquiries@ or stand14@ keeps a personal mailbox out of the printed material and can be retired without reprinting anything else.
Questions and answers
Does scanning send the email automatically?
No. The mailto: scheme can only open a draft. The person sees the recipient, subject and body in their own mail app, can change any of it, and has to press send themselves. No mail app on any platform sends a mailto: message without that step.
Can I add cc and bcc addresses?
RFC 6068 defines cc and bcc as header fields in the query string, but it only obliges a client to understand subject and body. Mobile mail apps frequently drop the rest, so those fields are not offered here rather than appearing to work and then vanishing.
Why are spaces encoded as %20 instead of a plus sign?
Because RFC 6068 says so. In a mailto: URI a plus sign can be a real character in an address, as in name+tag@example.com, so a plus standing for a space cannot be distinguished from a plus that belongs there. %20 removes the ambiguity.
Will printing my address like this get it scraped?
It can be. A mailto: payload is as machine-readable as a mailto: link on a web page, and anyone can decode a photographed code. Use a role address you can retire, and expect it to attract the same unsolicited mail any published address does.
How a static QR code works
Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.
Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.