Add new content types and refactor message writer

Introduced "multipart/mixed" and "multipart/related" content types in encoding.go and updated msgwriter.go to accommodate these. Adjustments made in related tests for these new types. Additionally, removed unnecessary print statements and improved multipart alternative parsing in eml.go.
This commit is contained in:
Winni Neessen 2024-02-10 13:36:42 +01:00
parent 59e85809f7
commit 3facbde703
Signed by: wneessen
GPG key ID: 385AC9889632126E
4 changed files with 18 additions and 7 deletions

7
eml.go
View file

@ -178,9 +178,6 @@ func parseEMLHeaders(mh *nm.Header, m *Msg) error {
for _, h := range commonHeaders { for _, h := range commonHeaders {
if v := mh.Get(h.String()); v != "" { if v := mh.Get(h.String()); v != "" {
m.SetGenHeader(h, v) m.SetGenHeader(h, v)
if strings.EqualFold(h.String(), "subject") {
fmt.Printf("SUBJECT: %s\n", m.GetGenHeader(HeaderSubject)[0])
}
} }
} }
@ -204,7 +201,8 @@ func parseEMLBodyParts(pm *nm.Message, bodybuf *bytes.Buffer, m *Msg) error {
if err := parseEMLBodyPlain(mediatype, pm, bodybuf, m); err != nil { if err := parseEMLBodyPlain(mediatype, pm, bodybuf, m); err != nil {
return fmt.Errorf("failed to parse plain body: %w", err) return fmt.Errorf("failed to parse plain body: %w", err)
} }
case strings.EqualFold(mediatype, TypeMultipartAlternative.String()): case strings.EqualFold(mediatype, TypeMultipartAlternative.String()),
strings.EqualFold(mediatype, "multipart/mixed"):
if err := parseEMLMultipartAlternative(params, bodybuf, m); err != nil { if err := parseEMLMultipartAlternative(params, bodybuf, m); err != nil {
return fmt.Errorf("failed to parse multipart/alternative body: %w", err) return fmt.Errorf("failed to parse multipart/alternative body: %w", err)
} }
@ -261,7 +259,6 @@ func parseEMLMultipartAlternative(params map[string]string, bodybuf *bytes.Buffe
_ = mpart.Close() _ = mpart.Close()
return fmt.Errorf("failed to read multipart: %w", err) return fmt.Errorf("failed to read multipart: %w", err)
} }
fmt.Printf("CTE: %+v", params)
mpContentType, ok := mpart.Header[HeaderContentType.String()] mpContentType, ok := mpart.Header[HeaderContentType.String()]
if !ok { if !ok {

View file

@ -140,6 +140,8 @@ const (
const ( const (
TypeAppOctetStream ContentType = "application/octet-stream" TypeAppOctetStream ContentType = "application/octet-stream"
TypeMultipartAlternative ContentType = "multipart/alternative" TypeMultipartAlternative ContentType = "multipart/alternative"
TypeMultipartMixed ContentType = "multipart/mixed"
TypeMultipartRelated ContentType = "multipart/related"
TypePGPSignature ContentType = "application/pgp-signature" TypePGPSignature ContentType = "application/pgp-signature"
TypePGPEncrypted ContentType = "application/pgp-encrypted" TypePGPEncrypted ContentType = "application/pgp-encrypted"
TypeTextHTML ContentType = "text/html" TypeTextHTML ContentType = "text/html"

View file

@ -40,6 +40,18 @@ func TestContentType_String(t *testing.T) {
"ContentType: application/octet-stream", TypeAppOctetStream, "ContentType: application/octet-stream", TypeAppOctetStream,
"application/octet-stream", "application/octet-stream",
}, },
{
"ContentType: multipart/alternative", TypeMultipartAlternative,
"multipart/alternative",
},
{
"ContentType: multipart/mixed", TypeMultipartMixed,
"multipart/mixed",
},
{
"ContentType: multipart/related", TypeMultipartRelated,
"multipart/related",
},
{ {
"ContentType: application/pgp-signature", TypePGPSignature, "ContentType: application/pgp-signature", TypePGPSignature,
"application/pgp-signature", "application/pgp-signature",

View file

@ -89,11 +89,11 @@ func (mw *msgWriter) writeMsg(m *Msg) {
} }
if m.hasMixed() { if m.hasMixed() {
mw.startMP("mixed", m.boundary) mw.startMP(MIMEMixed, m.boundary)
mw.writeString(DoubleNewLine) mw.writeString(DoubleNewLine)
} }
if m.hasRelated() { if m.hasRelated() {
mw.startMP("related", m.boundary) mw.startMP(MIMERelated, m.boundary)
mw.writeString(DoubleNewLine) mw.writeString(DoubleNewLine)
} }
if m.hasAlt() { if m.hasAlt() {