// invokeMessageCallback extracts the relevant data from the passed FETCH response // and invokes the user-provided callback. func (w *IMAPSource) invokeMessageCallback(msgInfo *imap.MessageInfo) error { logger.Debugf("handling mail uid=%d", msgInfo.Attrs["UID"]) flags := imap.AsFlagSet(msgInfo.Attrs["FLAGS"]) idate := imap.AsDateTime(msgInfo.Attrs["INTERNALDATE"]) mailBytes := imap.AsBytes(msgInfo.Attrs["RFC822"]) mailLiteral := imap.NewLiteral(mailBytes) logger.Debugf("invoking message transformer") err := w.callbackFunc(flags, &idate, mailLiteral) if err == nil { logger.Debugf("message transformation successful") } else { logger.Warningf("message transformation failed: %s", err) } return err }
/** * Creates a new mail on the IMAP server with the given header information, flags and content * (body). * ATTENTION: DOES NOT LOCK THE IMAP CONNECTION! => Has to be wrapped into a mutex lock method */ func (mc *MailCon) createMailInFolder_internal(h *Header, f *Flags, content string) (uid uint32, err error) { var ( // Create the msg: // Header info + empty line + content + empty line msg string = strings.Join([]string{SerializeHeader(h), "", content, ""}, "\r\n") lit imap.Literal = imap.NewLiteral([]byte(msg)) mbox string = fmt.Sprintf("%s%s%s", mc.mailbox, mc.delim, h.Folder) cmd *imap.Command resp *imap.Response ) // 1) Execute the actual append mail command if cmd, err = mc.client.Append(mbox, imap.AsFlagSet(SerializeFlags(f)), &h.Date, lit); err != nil { return 0, err } if resp, err = cmd.Result(imap.OK); err != nil { return 0, fmt.Errorf("[watney] ERROR waiting for result of append command\n\t%s\n", err.Error()) } // 2) Process the server response and extract the message UID of the previously added mail // The Response is an 'APPENDUID' with the fields: // [0] APPENDUID:string | [1] internaldate:long64 | [2] UID:uint32 return imap.AsNumber(resp.Fields[2]), err }