aboutsummaryrefslogtreecommitdiffstats
path: root/commands/msg/reply.go
diff options
context:
space:
mode:
Diffstat (limited to 'commands/msg/reply.go')
-rw-r--r--commands/msg/reply.go52
1 files changed, 34 insertions, 18 deletions
diff --git a/commands/msg/reply.go b/commands/msg/reply.go
index b9ee050a..fff90fff 100644
--- a/commands/msg/reply.go
+++ b/commands/msg/reply.go
@@ -20,6 +20,7 @@ import (
"git.sr.ht/~rjarry/aerc/lib/parse"
"git.sr.ht/~rjarry/aerc/log"
"git.sr.ht/~rjarry/aerc/models"
+ "github.com/danwakefield/fnmatch"
"github.com/emersion/go-message/mail"
)
@@ -76,7 +77,6 @@ func (reply) Execute(args []string) error {
return errors.New("No account selected")
}
conf := acct.AccountConfig()
- from := conf.From
store := widget.Store()
if store == nil {
@@ -87,23 +87,7 @@ func (reply) Execute(args []string) error {
return err
}
- // figure out the sending from address if we have aliases
- if len(conf.Aliases) != 0 {
- rec := newAddrSet()
- rec.AddList(msg.Envelope.To)
- rec.AddList(msg.Envelope.Cc)
- // test the from first, it has priority over any present alias
- if rec.Contains(from) {
- // do nothing
- } else {
- for _, a := range conf.Aliases {
- if rec.Contains(a) {
- from = a
- break
- }
- }
- }
- }
+ from := chooseFromAddr(conf, msg)
var (
to []*mail.Address
@@ -279,6 +263,28 @@ func (reply) Execute(args []string) error {
}
}
+func chooseFromAddr(conf *config.AccountConfig, msg *models.MessageInfo) *mail.Address {
+ if len(conf.Aliases) == 0 {
+ return conf.From
+ }
+
+ rec := newAddrSet()
+ rec.AddList(msg.Envelope.To)
+ rec.AddList(msg.Envelope.Cc)
+ // test the from first, it has priority over any present alias
+ if rec.Contains(conf.From) {
+ // do nothing
+ } else {
+ for _, a := range conf.Aliases {
+ if match := rec.FindMatch(a); match != "" {
+ return &mail.Address{Name: a.Name, Address: match}
+ }
+ }
+ }
+
+ return conf.From
+}
+
type addrSet map[string]struct{}
func newAddrSet() addrSet {
@@ -301,6 +307,16 @@ func (s addrSet) Contains(a *mail.Address) bool {
return ok
}
+func (s addrSet) FindMatch(a *mail.Address) string {
+ for addr := range s {
+ if fnmatch.Match(a.Address, addr, 0) {
+ return addr
+ }
+ }
+
+ return ""
+}
+
// setReferencesHeader adds the references header to target based on parent
// according to RFC2822
func setReferencesHeader(target, parent *mail.Header) error {