msgHeaders merges the Email's various fields and custom headers together in a standards compliant way to create a MIMEHeader to be used in the resulting message. It does not alter e.Headers. "e"'s fields To, Cc, From, Subject will be used unless they are present in e.Headers. Unless set in e.Header
()
| 298 | // "e"'s fields To, Cc, From, Subject will be used unless they are present in |
| 299 | // e.Headers. Unless set in e.Headers, "Date" will filled with the current time. |
| 300 | func (e *Email) msgHeaders() (textproto.MIMEHeader, error) { |
| 301 | res := make(textproto.MIMEHeader, len(e.Headers)+6) |
| 302 | if e.Headers != nil { |
| 303 | for _, h := range []string{"Reply-To", "To", "Cc", "From", "Subject", "Date", "Message-Id", "MIME-Version"} { |
| 304 | if v, ok := e.Headers[h]; ok { |
| 305 | res[h] = v |
| 306 | } |
| 307 | } |
| 308 | } |
| 309 | // Set headers if there are values. |
| 310 | if _, ok := res["Reply-To"]; !ok && len(e.ReplyTo) > 0 { |
| 311 | res.Set("Reply-To", strings.Join(e.ReplyTo, ", ")) |
| 312 | } |
| 313 | if _, ok := res["To"]; !ok && len(e.To) > 0 { |
| 314 | res.Set("To", strings.Join(e.To, ", ")) |
| 315 | } |
| 316 | if _, ok := res["Cc"]; !ok && len(e.Cc) > 0 { |
| 317 | res.Set("Cc", strings.Join(e.Cc, ", ")) |
| 318 | } |
| 319 | if _, ok := res["Subject"]; !ok && e.Subject != "" { |
| 320 | res.Set("Subject", e.Subject) |
| 321 | } |
| 322 | if _, ok := res["Message-Id"]; !ok { |
| 323 | id, err := generateMessageID() |
| 324 | if err != nil { |
| 325 | return nil, err |
| 326 | } |
| 327 | res.Set("Message-Id", id) |
| 328 | } |
| 329 | // Date and From are required headers. |
| 330 | if _, ok := res["From"]; !ok { |
| 331 | res.Set("From", e.From) |
| 332 | } |
| 333 | if _, ok := res["Date"]; !ok { |
| 334 | res.Set("Date", time.Now().Format(time.RFC1123Z)) |
| 335 | } |
| 336 | if _, ok := res["MIME-Version"]; !ok { |
| 337 | res.Set("MIME-Version", "1.0") |
| 338 | } |
| 339 | for field, vals := range e.Headers { |
| 340 | if _, ok := res[field]; !ok { |
| 341 | res[field] = vals |
| 342 | } |
| 343 | } |
| 344 | return res, nil |
| 345 | } |
| 346 | |
| 347 | func writeMessage(buff io.Writer, msg []byte, multipart bool, mediaType string, w *multipart.Writer) error { |
| 348 | if multipart { |
no test coverage detected