package attachments import ( "bytes" "encoding/base64" "fmt" "io" ) const delimeter = "**=myohmy689407924327" type EmailAttachment struct { File io.Reader Title string } func (e EmailAttachment) ReadContent() ([]byte, error) { bts, err := io.ReadAll(e.File) if err != nil { return nil, fmt.Errorf("error loading attachment: %s", err) } return bts, nil } func AttachmentsToBytes(body string, attachments []EmailAttachment) ([]byte, error) { var message bytes.Buffer message.WriteString("Content-Type: text/html; charset=\"UTF-8\"\r\n\r\n") message.WriteString(body + "\r\n\r\n") for _, attachment := range attachments { attachmentRawFile, err := attachment.ReadContent() if err != nil { return nil, err } message.WriteString("--" + delimeter + "\r\n") message.WriteString("Content-Disposition: attachment; filename=\"" + attachment.Title + "\"\r\n") message.WriteString("Content-Type: application/octet-stream\r\n") message.WriteString("Content-Transfer-Encoding: base64\r\n\r\n") message.WriteString(base64.StdEncoding.EncodeToString(attachmentRawFile) + "\r\n") } message.WriteString("--" + delimeter + "--") // End the message return message.Bytes(), nil }