diff --git a/msg.go b/msg.go index 430feb23..77f9297d 100644 --- a/msg.go +++ b/msg.go @@ -989,7 +989,13 @@ func (m *Msg) encodeString(s string) string { // hasAlt returns true if the Msg has more than one part func (m *Msg) hasAlt() bool { - return len(m.parts) > 1 + c := 0 + for _, p := range m.parts { + if !p.del { + c++ + } + } + return c > 1 } // hasMixed returns true if the Msg has mixed parts diff --git a/msgwriter.go b/msgwriter.go index d53be217..719d7dfc 100644 --- a/msgwriter.go +++ b/msgwriter.go @@ -102,7 +102,9 @@ func (mw *msgWriter) writeMsg(m *Msg) { } for _, p := range m.parts { - mw.writePart(p, m.charset) + if !p.del { + mw.writePart(p, m.charset) + } } if m.hasAlt() { mw.stopMP() diff --git a/part.go b/part.go index ebd01638..35c1bd06 100644 --- a/part.go +++ b/part.go @@ -16,6 +16,7 @@ type PartOption func(*Part) type Part struct { ctype ContentType enc Encoding + del bool w func(io.Writer) (int64, error) } @@ -64,6 +65,12 @@ func (p *Part) SetWriteFunc(w func(io.Writer) (int64, error)) { p.w = w } +// Delete removes the current part from the parts list of the Msg by setting the +// del flag to true. The msgWriter will skip it then +func (p *Part) Delete() { + p.del = true +} + // WithPartEncoding overrides the default Part encoding func WithPartEncoding(e Encoding) PartOption { return func(p *Part) { diff --git a/part_test.go b/part_test.go index 55bc82d0..d3ceef28 100644 --- a/part_test.go +++ b/part_test.go @@ -241,6 +241,22 @@ func TestPart_SetContent(t *testing.T) { } } +// TestPart_Delete tests Part.Delete +func TestPart_Delete(t *testing.T) { + c := "This is a test with ümläutß" + m := NewMsg() + m.SetBodyString(TypeTextPlain, c) + pl, err := getPartList(m) + if err != nil { + t.Errorf("failed: %s", err) + return + } + pl[0].Delete() + if !pl[0].del { + t.Errorf("Delete failed. Expected: %t, got: %t", true, pl[0].del) + } +} + // getPartList is a helper function func getPartList(m *Msg) ([]*Part, error) { pl := m.GetParts()