summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Isaac2025-02-09 23:09:26 +0000
committerArun Isaac2025-02-09 23:23:03 +0000
commit32eb61f81ce9d069f5e73091ee2b6729f1404a6d (patch)
tree99d23e0963452e33b58b4f5d00315e4d6c3dfa45
parent9a82ce70b9eded77a148336feb8913156a31bab8 (diff)
downloadguile-email-32eb61f81ce9d069f5e73091ee2b6729f1404a6d.tar.gz
guile-email-32eb61f81ce9d069f5e73091ee2b6729f1404a6d.tar.lz
guile-email-32eb61f81ce9d069f5e73091ee2b6729f1404a6d.zip
email: Quote display names when serializing email addresses.
* email/email.scm (interpret-address): Quote display names when they have illegal characters. * tests/email.scm ("quote display-name when serializing email addresses with illegal characters", "do not quote display-name when serializing email addresses without illegal characters"): New tests.
-rw-r--r--email/email.scm16
-rw-r--r--tests/email.scm8
2 files changed, 23 insertions, 1 deletions
diff --git a/email/email.scm b/email/email.scm
index ff0f5e9..22d9739 100644
--- a/email/email.scm
+++ b/email/email.scm
@@ -957,7 +957,21 @@ For example,
(match-lambda
((('name . name)
('address . address))
- (format #f "~a <~a>" name address))
+ (string-append
+ ;; Quote display names with illegal characters.
+ (let ((char-set:atext (char-set-intersection
+ char-set:ascii
+ (char-set-union char-set:letter
+ char-set:digit
+ (char-set #\! #\# #\$ #\%
+ #\& #\' #\* #\+
+ #\- #\/ #\= #\?
+ #\^ #\_ #\` #\{
+ #\| #\} #\~)))))
+ (if (string-every char-set:atext name)
+ name
+ (string-append "\"" name "\"")))
+ " <" address ">"))
((('address . address)) address)))
(define (parse-email-body headers body)
diff --git a/tests/email.scm b/tests/email.scm
index 972233d..510838a 100644
--- a/tests/email.scm
+++ b/tests/email.scm
@@ -598,6 +598,14 @@ Content-Type: text/plain; charset=utf-8
(parse-email-address "Foo [Bar] <foo@example.com>")
'((name . "Foo [Bar]") (address . "foo@example.com")))
+(test-equal "quote display-name when serializing email addresses with illegal characters"
+ "\"Foo [Bar]\" <foo@example.com>"
+ (interpret-address '((name . "Foo [Bar]") (address . "foo@example.com"))))
+
+(test-equal "do not quote display-name when serializing email addresses without illegal characters"
+ "FooBar <foo@example.com>"
+ (interpret-address '((name . "FooBar") (address . "foo@example.com"))))
+
;;;
;;; MIME encoded words