Skip to content
This repository was archived by the owner on Nov 28, 2024. It is now read-only.

add more details when failing to parse email addresses to make finding problems with input easier #72

Open
wants to merge 1 commit into
base: v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package mail
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"path/filepath"
Expand Down Expand Up @@ -380,6 +381,26 @@ func TestRename(t *testing.T) {
testMessage(t, m, 1, want)
}

func TestEmptyAddress(t *testing.T) {
cases := []struct {
headerName string
value string
}{
{headerName: "From", value: ""},
{headerName: "To", value: ""},
}
for i, tc := range cases {
t.Run(fmt.Sprintf("case_%d", i), func(t *testing.T) {
m := NewMessage()
m.SetHeader(tc.headerName, tc.value)
err := Send(stubSendMail(t, 1, nil), m)
if err == nil {
t.Error("expected error but got none")
}
})
}
}

func TestAttachmentsOnly(t *testing.T) {
m := NewMessage()
m.SetHeader("From", "[email protected]")
Expand Down
12 changes: 7 additions & 5 deletions send.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,17 @@ func send(s Sender, m *Message) error {
}

func (m *Message) getFrom() (string, error) {
fieldName := "Sender"
from := m.header["Sender"]
if len(from) == 0 {
from = m.header["From"]
if len(from) == 0 {
return "", errors.New(`gomail: invalid message, "From" field is absent`)
}
fieldName = "From"
}

return parseAddress(from[0])
return parseAddress(fieldName, from[0])
}

func (m *Message) getRecipients() ([]string, error) {
Expand All @@ -85,7 +87,7 @@ func (m *Message) getRecipients() ([]string, error) {
for _, field := range []string{"To", "Cc", "Bcc"} {
if addresses, ok := m.header[field]; ok {
for _, a := range addresses {
addr, err := parseAddress(a)
addr, err := parseAddress(field, a)
if err != nil {
return nil, err
}
Expand All @@ -107,10 +109,10 @@ func addAddress(list []string, addr string) []string {
return append(list, addr)
}

func parseAddress(field string) (string, error) {
addr, err := stdmail.ParseAddress(field)
func parseAddress(fieldName, fieldValue string) (string, error) {
addr, err := stdmail.ParseAddress(fieldValue)
if err != nil {
return "", fmt.Errorf("gomail: invalid address %q: %v", field, err)
return "", fmt.Errorf("gomail: invalid address %q for field %q: %v", fieldValue, fieldName, err)
}
return addr.Address, nil
}