From 560ea8f0d6d8e8477349aeaac42544b11b9bc39c Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Thu, 4 Jun 2026 13:23:53 +0200 Subject: [PATCH 1/2] feat(email): replace unicode checkmark with inline PNG image The signer-verified circle previously rendered a unicode `✓` glyph which is styled inconsistently across mail clients. Embed a PNG of the PostGuard checkmark via `cid:pg-check` to match the shape used in the download page UI. --- src/email.rs | 10 +++++++++- templates/email/check.png | Bin 0 -> 3170 bytes templates/email/email.html | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 templates/email/check.png diff --git a/src/email.rs b/src/email.rs index 5cbfea5..1809dce 100644 --- a/src/email.rs +++ b/src/email.rs @@ -109,6 +109,11 @@ fn take_firstname_lastname_pair(attrs: &mut Vec<(String, String)>) -> Option { fn build_body(html: String, text: String) -> Result> { let logo = Attachment::new_inline("pg-logo".to_string()) .body(LOGO_PNG.to_vec(), "image/png".parse::()?); + let check = Attachment::new_inline("pg-check".to_string()) + .body(CHECK_PNG.to_vec(), "image/png".parse::()?); let related = MultiPart::related() .singlepart(SinglePart::html(html)) - .singlepart(logo); + .singlepart(logo) + .singlepart(check); Ok(MultiPart::alternative() .singlepart(SinglePart::plain(text)) diff --git a/templates/email/check.png b/templates/email/check.png new file mode 100644 index 0000000000000000000000000000000000000000..8e107dadee3caf71fd713292d0f0136f3953d432 GIT binary patch literal 3170 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 literal 0 HcmV?d00001 diff --git a/templates/email/email.html b/templates/email/email.html index 3859648..194a53e 100644 --- a/templates/email/email.html +++ b/templates/email/email.html @@ -42,7 +42,9 @@ {% if sender_email != "" %}
- + + +

{{files_from}}

{{sender_email}}

From d2962609af5da074d0deb6aa277e65459128aa59 Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Thu, 4 Jun 2026 15:39:00 +0200 Subject: [PATCH 2/2] feat(email): remove circle around signer-verified checkmark --- src/email.rs | 2 +- templates/email/email.html | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/email.rs b/src/email.rs index 1809dce..fd86a94 100644 --- a/src/email.rs +++ b/src/email.rs @@ -109,7 +109,7 @@ fn take_firstname_lastname_pair(attrs: &mut Vec<(String, String)>) -> Option
- - - +

{{files_from}}

{{sender_email}}