From 57729484f70a73b1de2399b61d78bb6c302e0bd9 Mon Sep 17 00:00:00 2001 From: Drew Smirnoff Date: Sat, 3 Jan 2026 18:38:34 +0400 Subject: [PATCH] fix(sender): encode the files sent from matcha (#84) --- sender/sender.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/sender/sender.go b/sender/sender.go index bfd419199a286941e57f28485ed243466466cbae..aa7c6a41dec437fce1a74f336863d4e64552df23 100644 --- a/sender/sender.go +++ b/sender/sender.go @@ -127,7 +127,8 @@ func SendEmail(account *config.Account, to []string, subject, plainBody, htmlBod if err != nil { return err } - imgPart.Write(data) // data is already base64 encoded + // data is already base64 encoded, but needs MIME line wrapping (76 chars per line) + imgPart.Write([]byte(wrapBase64(string(data)))) } relatedWriter.Close() // Finish the related part @@ -149,7 +150,8 @@ func SendEmail(account *config.Account, to []string, subject, plainBody, htmlBod return err } encodedData := base64.StdEncoding.EncodeToString(data) - attachmentPart.Write([]byte(encodedData)) + // MIME requires base64 to be line-wrapped at 76 characters + attachmentPart.Write([]byte(wrapBase64(encodedData))) } mainWriter.Close() // Finish the main message @@ -157,3 +159,20 @@ func SendEmail(account *config.Account, to []string, subject, plainBody, htmlBod addr := fmt.Sprintf("%s:%d", smtpServer, smtpPort) return smtp.SendMail(addr, auth, account.Email, to, msg.Bytes()) } + +// wrapBase64 wraps base64-encoded data at 76 characters per line as required by MIME. +func wrapBase64(data string) string { + const lineLength = 76 + var result strings.Builder + for i := 0; i < len(data); i += lineLength { + end := i + lineLength + if end > len(data) { + end = len(data) + } + result.WriteString(data[i:end]) + if end < len(data) { + result.WriteString("\r\n") + } + } + return result.String() +}