about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--notemap.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/notemap.c b/notemap.c
index b448a2a..61112e5 100644
--- a/notemap.c
+++ b/notemap.c
@@ -153,15 +153,8 @@ static char *format(const char *from, const char *uuid, const char *path) {
 		localtime(&status.st_mtime)
 	);
 
-	char subj[78 - (sizeof("Subject: ") - 1)] = {0};
-	for (size_t i = 0; i < sizeof(subj) - 1; ++i) {
-		if (!path[i]) break;
-		subj[i] = (path[i] & 0x80 ? '?' : path[i]);
-	}
-
 #define HEADERS \
 	"From: <%s>\r\n" \
-	"Subject: %s\r\n" \
 	"Date: %s\r\n" \
 	"X-Universally-Unique-Identifier: %s\r\n" \
 	"X-Uniform-Type-Identifier: com.apple.mail-note\r\n" \
@@ -169,13 +162,15 @@ static char *format(const char *from, const char *uuid, const char *path) {
 	"MIME-Version: 1.0\r\n" \
 	"Content-Type: text/plain; charset=\"utf-8\"\r\n" \
 	"Content-Transfer-Encoding: quoted-printable\r\n" \
-	"\r\n"
+	"Subject: =?utf-8?Q?"
+#define HEADERS_END "?=\r\n\r\n"
 
 	size_t max = sizeof(HEADERS)
 		+ strlen(from)
-		+ strlen(subj)
 		+ strlen(date)
 		+ strlen(uuid)
+		+ 3 * strlen(path)
+		+ sizeof(HEADERS_END)
 		+ 3 * status.st_size
 		+ 3 * status.st_size / 76;
 	char *buf = malloc(max);
@@ -183,8 +178,18 @@ static char *format(const char *from, const char *uuid, const char *path) {
 
 	FILE *msg = fmemopen(buf, max, "w");
 	if (!msg) err(EX_OSERR, "fmemopen");
-	fprintf(msg, HEADERS, from, subj, date, uuid);
-#undef HEADERS
+	fprintf(msg, HEADERS, from, date, uuid);
+
+	for (const char *ch = path; *ch; ++ch) {
+		if ((uint8_t)*ch & 0x80) {
+			fprintf(msg, "=%02hhX", (uint8_t)*ch);
+		} else if (*ch == ' ') {
+			fprintf(msg, "_");
+		} else {
+			fprintf(msg, "%c", *ch);
+		}
+	}
+	fprintf(msg, HEADERS_END);
 
 	int ch;
 	int len = 0;