diff options
Diffstat (limited to 'plugins/base/smtp.go')
-rw-r--r-- | plugins/base/smtp.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/plugins/base/smtp.go b/plugins/base/smtp.go index dc8211e..a6cfd3d 100644 --- a/plugins/base/smtp.go +++ b/plugins/base/smtp.go @@ -53,6 +53,37 @@ func (att *formAttachment) Filename() string { return att.FileHeader.Filename } +type refcountedAttachment struct { + *multipart.FileHeader + *multipart.Form + refs int +} + +func (att *refcountedAttachment) Open() (io.ReadCloser, error) { + return att.FileHeader.Open() +} + +func (att *refcountedAttachment) MIMEType() string { + // TODO: retain params, e.g. "charset"? + t, _, _ := mime.ParseMediaType(att.FileHeader.Header.Get("Content-Type")) + return t +} + +func (att *refcountedAttachment) Filename() string { + return att.FileHeader.Filename +} + +func (att *refcountedAttachment) Ref() { + att.refs += 1 +} + +func (att *refcountedAttachment) Unref() { + att.refs -= 1 + if att.refs == 0 { + att.Form.RemoveAll() + } +} + type imapAttachment struct { Mailbox string Uid uint32 @@ -176,6 +207,22 @@ func (msg *OutgoingMessage) WriteTo(w io.Writer) error { return nil } +func (msg *OutgoingMessage) Ref() { + for _, a := range msg.Attachments { + if a, ok := a.(*refcountedAttachment); ok { + a.Ref() + } + } +} + +func (msg *OutgoingMessage) Unref() { + for _, a := range msg.Attachments { + if a, ok := a.(*refcountedAttachment); ok { + a.Unref() + } + } +} + func sendMessage(c *smtp.Client, msg *OutgoingMessage) error { if err := c.Mail(msg.From, nil); err != nil { return fmt.Errorf("MAIL FROM failed: %v", err) |