msg/reply: handle addresses as addresses

This simplifies the code considerably and makes it easier to follow
This commit is contained in:
Reto Brunner 2020-08-19 12:06:02 +02:00
parent c846307144
commit 2a186cfd71

View file

@ -5,12 +5,12 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
gomail "net/mail"
"strings" "strings"
"git.sr.ht/~sircmpwn/getopt" "git.sr.ht/~sircmpwn/getopt"
"git.sr.ht/~sircmpwn/aerc/lib" "git.sr.ht/~sircmpwn/aerc/lib"
"git.sr.ht/~sircmpwn/aerc/lib/format"
"git.sr.ht/~sircmpwn/aerc/models" "git.sr.ht/~sircmpwn/aerc/models"
"git.sr.ht/~sircmpwn/aerc/widgets" "git.sr.ht/~sircmpwn/aerc/widgets"
) )
@ -60,7 +60,10 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
return errors.New("No account selected") return errors.New("No account selected")
} }
conf := acct.AccountConfig() conf := acct.AccountConfig()
us, _ := gomail.ParseAddress(conf.From) from, err := format.ParseAddress(conf.From)
if err != nil {
return err
}
store := widget.Store() store := widget.Store()
if store == nil { if store == nil {
return errors.New("Cannot perform action. Messages still loading") return errors.New("Cannot perform action. Messages still loading")
@ -72,27 +75,18 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
acct.Logger().Println("Replying to email " + msg.Envelope.MessageId) acct.Logger().Println("Replying to email " + msg.Envelope.MessageId)
var ( var (
to []string to []*models.Address
cc []string cc []*models.Address
toList []*models.Address
) )
if args[0] == "reply" { if args[0] == "reply" {
if len(msg.Envelope.ReplyTo) != 0 { if len(msg.Envelope.ReplyTo) != 0 {
toList = msg.Envelope.ReplyTo to = msg.Envelope.ReplyTo
} else { } else {
toList = msg.Envelope.From to = msg.Envelope.From
}
for _, addr := range toList {
if addr.Name != "" {
to = append(to, fmt.Sprintf("%s <%s@%s>",
addr.Name, addr.Mailbox, addr.Host))
} else {
to = append(to, fmt.Sprintf("<%s@%s>", addr.Mailbox, addr.Host))
}
} }
isMainRecipient := func(a *models.Address) bool { isMainRecipient := func(a *models.Address) bool {
for _, ta := range toList { for _, ta := range to {
if ta.Mailbox == a.Mailbox && ta.Host == a.Host { if ta.Address == a.Address {
return true return true
} }
} }
@ -104,15 +98,16 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
if isMainRecipient(addr) { if isMainRecipient(addr) {
continue continue
} }
cc = append(cc, addr.Format()) cc = append(cc, addr)
} }
envTos := make([]*models.Address, 0, len(msg.Envelope.To))
for _, addr := range msg.Envelope.To { for _, addr := range msg.Envelope.To {
address := fmt.Sprintf("%s@%s", addr.Mailbox, addr.Host) if addr.Address == from.Address {
if strings.EqualFold(address, us.Address) {
continue continue
} }
to = append(to, addr.Format()) envTos = append(envTos, addr)
} }
to = append(to, envTos...)
} }
} }
@ -124,8 +119,9 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
} }
defaults := map[string]string{ defaults := map[string]string{
"To": strings.Join(to, ", "), "To": format.FormatAddresses(to),
"Cc": strings.Join(cc, ", "), "Cc": format.FormatAddresses(cc),
"From": from.Format(),
"Subject": subject, "Subject": subject,
"In-Reply-To": msg.Envelope.MessageId, "In-Reply-To": msg.Envelope.MessageId,
} }
@ -133,7 +129,7 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
addTab := func() error { addTab := func() error {
if template != "" { if template != "" {
original.From = models.FormatAddresses(msg.Envelope.From) original.From = format.FormatAddresses(msg.Envelope.From)
original.Date = msg.Envelope.Date original.Date = msg.Envelope.Date
} }