github.com/jordwest/imap-server@v0.0.0-20200627020849-1cf758ba359f/types/rfc2822_message.go (about)

     1  package types
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"io"
     7  	"net/textproto"
     8  )
     9  
    10  // RFC2822Message is a message compliant with RFC 2822.
    11  type RFC2822Message struct {
    12  	Headers textproto.MIMEHeader
    13  	Body    string
    14  }
    15  
    16  // MessageFromBytes creates a RFC2822Message from its byte representation.
    17  func MessageFromBytes(msgBytes []byte) (msg RFC2822Message, err error) {
    18  	// The header and body are separated by a double new-line
    19  	splitMessage := bytes.SplitN(msgBytes, []byte("\r\n\r\n"), 2)
    20  
    21  	// Read the headers
    22  	headerReader := textproto.NewReader(bufio.NewReader(bytes.NewReader(splitMessage[0])))
    23  	msg.Headers, err = headerReader.ReadMIMEHeader()
    24  
    25  	if err != nil && err != io.EOF {
    26  		return msg, err
    27  	}
    28  
    29  	if len(splitMessage) == 2 {
    30  		msg.Body = string(splitMessage[1])
    31  	}
    32  
    33  	return msg, nil
    34  }