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