diff options
author | Reto Brunner <reto@labrat.space> | 2020-08-19 12:01:45 +0200 |
---|---|---|
committer | Reto Brunner <reto@labrat.space> | 2020-08-20 19:18:57 +0200 |
commit | c84630714405a1e93766a6a6c023801302a3ea66 (patch) | |
tree | 156e9f45c6847a123f677594c8aff3a82322bce8 /lib/format | |
parent | fe1cabb077cf6c6cb3de122b3f5532acbeba8c85 (diff) | |
download | aerc-c84630714405a1e93766a6a6c023801302a3ea66.tar.gz |
base models.Address on the mail.Address type
This allows us to hook into the std libs implementation of parsing related stuff. For this, we need to get rid of the distinction between a mailbox and a host to just a single "address" field. However this is already the common case. All but one users immediately concatenated the mbox/domain to a single address. So this in effects makes it simpler for most cases and we simply do the transformation in the special case.
Diffstat (limited to 'lib/format')
-rw-r--r-- | lib/format/format.go | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/lib/format/format.go b/lib/format/format.go index cc46da8..06b4d3f 100644 --- a/lib/format/format.go +++ b/lib/format/format.go @@ -2,22 +2,46 @@ package format import ( "errors" - "fmt" + "mime" gomail "net/mail" "strings" "time" "unicode" "git.sr.ht/~sircmpwn/aerc/models" + "github.com/emersion/go-message" ) -func parseAddress(address string) *gomail.Address { +func ParseAddress(address string) (*models.Address, error) { addrs, err := gomail.ParseAddress(address) if err != nil { - return nil + return nil, err + } + return (*models.Address)(addrs), nil +} + +func ParseAddressList(s string) ([]*models.Address, error) { + parser := gomail.AddressParser{ + &mime.WordDecoder{message.CharsetReader}, + } + list, err := parser.ParseList(s) + if err != nil { + return nil, err } - return addrs + addrs := make([]*models.Address, len(list)) + for i, a := range list { + addrs[i] = (*models.Address)(a) + } + return addrs, nil +} + +func FormatAddresses(l []*models.Address) string { + formatted := make([]string, len(l)) + for i, a := range l { + formatted[i] = a.Format() + } + return strings.Join(formatted, ", ") } func ParseMessageFormat( @@ -29,7 +53,10 @@ func ParseMessageFormat( retval := make([]byte, 0, len(format)) var args []interface{} - accountFromAddress := parseAddress(fromAddress) + accountFromAddress, err := ParseAddress(fromAddress) + if err != nil { + return "", nil, err + } var c rune for i, ni := 0, 0; i < len(format); { @@ -87,8 +114,7 @@ func ParseMessageFormat( } addr := msg.Envelope.From[0] retval = append(retval, 's') - args = append(args, - fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host)) + args = append(args, addr.Address) case 'A': if msg.Envelope == nil { return "", nil, @@ -106,8 +132,7 @@ func ParseMessageFormat( addr = msg.Envelope.ReplyTo[0] } retval = append(retval, 's') - args = append(args, - fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host)) + args = append(args, addr.Address) case 'C': retval = append(retval, 'd') args = append(args, number) @@ -158,7 +183,7 @@ func ParseMessageFormat( if addr.Name != "" { val = addr.Name } else { - val = fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host) + val = addr.Address } retval = append(retval, 's') args = append(args, val) @@ -188,7 +213,7 @@ func ParseMessageFormat( if addr.Name != "" { val = addr.Name } else { - val = fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host) + val = addr.Address } retval = append(retval, 's') args = append(args, val) @@ -197,7 +222,7 @@ func ParseMessageFormat( return "", nil, errors.New("no envelope available for this message") } - addrs := models.FormatAddresses(msg.Envelope.To) + addrs := FormatAddresses(msg.Envelope.To) retval = append(retval, 's') args = append(args, addrs) case 'R': @@ -205,7 +230,7 @@ func ParseMessageFormat( return "", nil, errors.New("no envelope available for this message") } - addrs := models.FormatAddresses(msg.Envelope.Cc) + addrs := FormatAddresses(msg.Envelope.Cc) retval = append(retval, 's') args = append(args, addrs) case 's': @@ -226,8 +251,7 @@ func ParseMessageFormat( } addr := msg.Envelope.To[0] retval = append(retval, 's') - args = append(args, - fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host)) + args = append(args, addr.Address) case 'T': retval = append(retval, 's') args = append(args, accountName) @@ -241,8 +265,12 @@ func ParseMessageFormat( errors.New("found no address for sender") } addr := msg.Envelope.From[0] + mailbox := addr.Address // fallback if there's no @ sign + if split := strings.SplitN(addr.Address, "@", 2); len(split) == 2 { + mailbox = split[1] + } retval = append(retval, 's') - args = append(args, addr.Mailbox) + args = append(args, mailbox) case 'v': if msg.Envelope == nil { return "", nil, |