Simplified error handling
diff --git a/parsemail.go b/parsemail.go
index 0580481..2bbb123 100644
--- a/parsemail.go
+++ b/parsemail.go
@@ -55,82 +55,32 @@
}
func createEmailFromHeader(header mail.Header) (email Email, err error) {
+ hp := headerParser{header: &header}
+
email.Subject = header.Get("Subject")
+ email.From = hp.parseAddressList(header.Get("From"))
+ email.Sender = hp.parseAddress(header.Get("Sender"))
+ email.ReplyTo = hp.parseAddressList(header.Get("Reply-To"))
+ email.To = hp.parseAddressList(header.Get("To"))
+ email.Cc = hp.parseAddressList(header.Get("Cc"))
+ email.Bcc = hp.parseAddressList(header.Get("Bcc"))
+ email.Date = hp.parseTime(header.Get("Date"))
+ email.ResentFrom = hp.parseAddressList(header.Get("Resent-From"))
+ email.ResentSender = hp.parseAddress(header.Get("Resent-Sender"))
+ email.ResentTo = hp.parseAddressList(header.Get("Resent-To"))
+ email.ResentCc = hp.parseAddressList(header.Get("Resent-Cc"))
+ email.ResentBcc = hp.parseAddressList(header.Get("Resent-Bcc"))
+ email.ResentMessageID = hp.parseMessageId(header.Get("Resent-Message-ID"))
+ email.MessageID = hp.parseMessageId(header.Get("Message-ID"))
+ email.InReplyTo = hp.parseMessageIdList(header.Get("In-Reply-To"))
+ email.References = hp.parseMessageIdList(header.Get("References"))
+ email.ResentDate = hp.parseTime(header.Get("Resent-Date"))
- email.From, err = parseAddressList(header.Get("From"))
- if err != nil {
+ if hp.err != nil {
+ err = hp.err
return
}
- email.Sender, err = parseAddress(header.Get("Sender"))
- if err != nil {
- return
- }
-
- email.ReplyTo, err = parseAddressList(header.Get("Reply-To"))
- if err != nil {
- return
- }
-
- email.To, err = parseAddressList(header.Get("To"))
- if err != nil {
- return
- }
-
- email.Cc, err = parseAddressList(header.Get("Cc"))
- if err != nil {
- return
- }
-
- email.Bcc, err = parseAddressList(header.Get("Bcc"))
- if err != nil {
- return
- }
-
- email.Date, err = parseTime(header.Get("Date"))
- if err != nil {
- return
- }
-
- email.ResentFrom, err = parseAddressList(header.Get("Resent-From"))
- if err != nil {
- return
- }
-
- email.ResentSender, err = parseAddress(header.Get("Resent-Sender"))
- if err != nil {
- return
- }
-
- email.ResentTo, err = parseAddressList(header.Get("Resent-To"))
- if err != nil {
- return
- }
-
- email.ResentCc, err = parseAddressList(header.Get("Resent-Cc"))
- if err != nil {
- return
- }
-
- email.ResentBcc, err = parseAddressList(header.Get("Resent-Bcc"))
- if err != nil {
- return
- }
-
- if header.Get("Resent-Date") == "" {
- email.ResentDate = time.Time{}
- } else {
- email.ResentDate, err = parseTime(header.Get("Resent-Date"))
- if err != nil {
- return
- }
- }
-
- email.ResentMessageID = parseMessageId(header.Get("Resent-Message-ID"))
- email.MessageID = parseMessageId(header.Get("Message-ID"))
- email.InReplyTo = parseMessageIdList(header.Get("In-Reply-To"))
- email.References = parseMessageIdList(header.Get("References"))
-
//decode whole header for easier access to extra fields
//todo: should we decode? aren't only standard fields mime encoded?
email.Header, err = decodeHeaderMime(header)
@@ -150,45 +100,6 @@
return mime.ParseMediaType(contentTypeHeader)
}
-func parseAddress(s string) (*mail.Address, error) {
- if strings.Trim(s, " \n") != "" {
- return mail.ParseAddress(s)
- }
-
- return nil, nil
-}
-
-func parseAddressList(s string) ([]*mail.Address, error) {
- if strings.Trim(s, " \n") != "" {
- return mail.ParseAddressList(s)
- }
-
- return []*mail.Address{}, nil
-}
-
-func parseTime(s string) (time.Time, error) {
- t, err := time.Parse(time.RFC1123Z, s)
- if err == nil {
- return t, err
- }
-
- return time.Parse("Mon, 2 Jan 2006 15:04:05 -0700", s)
-}
-
-func parseMessageId(s string) string {
- return strings.Trim(s, "<> ")
-}
-
-func parseMessageIdList(s string) (result []string) {
- for _, p := range strings.Split(s, " ") {
- if strings.Trim(p, " \n") != "" {
- result = append(result, parseMessageId(p))
- }
- }
-
- return
-}
-
func parseMultipartAlternative(msg io.Reader, boundary string) (textBody, htmlBody string, embeddedFiles []EmbeddedFile, err error) {
pmr := multipart.NewReader(msg, boundary)
for {
@@ -382,6 +293,75 @@
return
}
+type headerParser struct {
+ header *mail.Header
+ err error
+}
+
+func (hp headerParser) parseAddress(s string) (ma *mail.Address) {
+ if hp.err != nil {
+ return nil
+ }
+
+ if strings.Trim(s, " \n") != "" {
+ ma, hp.err = mail.ParseAddress(s)
+
+ return ma
+ }
+
+ return nil
+}
+
+func (hp headerParser) parseAddressList(s string) (ma []*mail.Address) {
+ if hp.err != nil {
+ return
+ }
+
+ if strings.Trim(s, " \n") != "" {
+ ma, hp.err = mail.ParseAddressList(s)
+ return
+ }
+
+ return
+}
+
+func (hp headerParser) parseTime(s string) (t time.Time) {
+ if hp.err != nil || s == ""{
+ return
+ }
+
+ t, hp.err = time.Parse(time.RFC1123Z, s)
+ if hp.err == nil {
+ return t
+ }
+
+ t, hp.err = time.Parse("Mon, 2 Jan 2006 15:04:05 -0700", s)
+
+ return
+}
+
+func (hp headerParser) parseMessageId(s string) string {
+ if hp.err != nil {
+ return ""
+ }
+
+ return strings.Trim(s, "<> ")
+}
+
+func (hp headerParser) parseMessageIdList(s string) (result []string) {
+ if hp.err != nil {
+ return
+ }
+
+ for _, p := range strings.Split(s, " ") {
+ if strings.Trim(p, " \n") != "" {
+ result = append(result, hp.parseMessageId(p))
+ }
+ }
+
+ return
+}
+
// Attachment with filename, content type and data (as a io.Reader)
type Attachment struct {
Filename string