From 203c9c2ae39a4c64bfd9199bbc2deae03c347998 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Tue, 17 Sep 2019 01:11:44 +0530 Subject: email: Tolerate non-ASCII characters in headers. We tolerate non-ASCII characters in headers in order to support Emacs message mode parens style addresses. * email/email.scm (email->headers+body): Read headers as UTF-8 characters. * tests/email.scm ("tolerate non-ascii characters in headers"): New tests. Reported-by: Christopher Baines --- email/email.scm | 9 ++++++++- tests/email.scm | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/email/email.scm b/email/email.scm index 2c4178e..f276019 100644 --- a/email/email.scm +++ b/email/email.scm @@ -605,7 +605,14 @@ values. The returned headers is a string and body is a bytevector." (call-with-port (open-bytevector-input-port email) (lambda (port) - (set-port-encoding! port "us-ascii") + ;; Email headers must strictly be ASCII characters. But for the + ;; sake of supporting Emacs message mode parens style addresses + ;; that may use non-ASCII characters, typically for the full + ;; name, we relax this requirement. We assume an encoding of + ;; UTF-8, and hope that everything turns out fine. Since UTF-8 + ;; is a superset of ASCII, this should not affect standards + ;; conforming headers. + (set-port-encoding! port "utf-8") (let ((headers (read-while port get-line-with-delimiter (lambda (line) (not (or (string= line "\n") diff --git a/tests/email.scm b/tests/email.scm index 530cb8b..8aa9082 100644 --- a/tests/email.scm +++ b/tests/email.scm @@ -282,6 +282,21 @@ foo foo " "utf-8"))) +(test-equal "tolerate non-ascii characters in headers" + (parse-email + (string->bytevector + "From: foo@bar.org (Foo Bãr) + +body" "utf-8")) + (make-email + `((content-type (type . text) + (subtype . plain) + (charset . "utf-8")) + (content-transfer-encoding . 7bit) + (from ((name . "Foo Bãr") + (address . "foo@bar.org")))) + "body")) + (test-equal "parse name-addr email address" (parse-email-address "Foo ") '((name . "Foo") (address . "foo@example.org"))) -- cgit v1.2.3