code: func (m *MailYak) buildMimeWithBoundaries(mb, ab string) (*bytes.Buffer, error) {
  	var buf bytes.Buffer
  
  	if err := m.writeHeaders(&buf); err != nil {
  		return nil, err
  	}
  
  	// Start our multipart/mixed part
  	mixed := multipart.NewWriter(&buf)
  	if err := mixed.SetBoundary(mb); err != nil {
  		return nil, err
  	}
  	defer mixed.Close()
  
  	fmt.Fprintf(&buf, "Content-Type: multipart/mixed;\r\n\tboundary=\"%s\"; charset=UTF-8\r\n\r\n", mixed.Boundary())
  
  	ctype := fmt.Sprintf("multipart/alternative;\r\n\tboundary=\"%s\"", ab)
  
  	altPart, err := mixed.CreatePart(textproto.MIMEHeader{"Content-Type": {ctype}})
  	if err != nil {
  		return nil, err
  	}
  
  	if err := m.writeBody(altPart, ab); err != nil {
  		return nil, err
  	}
  
  	if err := m.writeAttachments(mixed, lineSplitterBuilder{}); err != nil {
  		return nil, err
  	}
  
  	return &buf, nil
  }
docs: // buildMimeWithBoundaries creates the MIME message using mb and ab as MIME
  // boundaries, and returns the generated MIME data as a buffer.