diff options
author | Bence Ferdinandy <bence@ferdinandy.com> | 2024-06-29 21:47:38 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-08-03 20:05:29 +0200 |
commit | 88d5de97d6c2caf37c693a51daf98f81951a37ac (patch) | |
tree | 28fce3a867713993f395ceaec57153102b7d6f35 | |
parent | 1d4eafb011f46966848d55f381160e846d0d50c8 (diff) | |
download | aerc-88d5de97d6c2caf37c693a51daf98f81951a37ac.tar.gz |
reply: handle the Sender header
Sometimes emails will have a Sender: header, that is different from the
From: header. The only use of this in the wild I have seen to date is
when meeting invitation is forwarded by somebody. The From: header will
be the person organising the meeting, and the Sender: will be the person
forwarding. Naturally, when one replies (e.g. with on accept), it should
go to the meeting oragniser, but sometimes one would want to include the
Sender in such a reply.
When executing :reply determine the To: address in order of Reply-To:,
From:, Sender:. When executing :reply -a, include the Sender: in Cc:.
Implements: https://todo.sr.ht/~rjarry/aerc/259
Link: https://www.rfc-editor.org/rfc/rfc4021#section-2.1.3
Changelog-added: Replying to all will include the Sender in Cc.
Signed-off-by: Bence Ferdinandy <bence@ferdinandy.com>
Reviewed-by: Tim Culverhouse <tim@timculverhouse.com>
Reviewed-by: Tristan Partin <tristan@partin.io>
Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r-- | commands/msg/reply.go | 15 | ||||
-rw-r--r-- | lib/rfc822/message.go | 1 | ||||
-rw-r--r-- | models/models.go | 1 |
3 files changed, 14 insertions, 3 deletions
diff --git a/commands/msg/reply.go b/commands/msg/reply.go index 79a0c598..acc0d6fa 100644 --- a/commands/msg/reply.go +++ b/commands/msg/reply.go @@ -86,11 +86,13 @@ func (r reply) Execute(args []string) error { ) recSet := newAddrSet() // used for de-duping - - if len(msg.Envelope.ReplyTo) != 0 { + switch { + case len(msg.Envelope.ReplyTo) != 0: to = msg.Envelope.ReplyTo - } else { + case len(msg.Envelope.From) != 0: to = msg.Envelope.From + default: + to = msg.Envelope.Sender } if !config.Compose.ReplyToSelf { @@ -131,6 +133,13 @@ func (r reply) Execute(args []string) error { } cc = append(cc, addr) } + for _, addr := range msg.Envelope.Sender { + // dedupe stuff from the to/from headers + if recSet.Contains(addr) { + continue + } + cc = append(cc, addr) + } recSet.AddList(cc) } diff --git a/lib/rfc822/message.go b/lib/rfc822/message.go index 106ee07d..3f0c447e 100644 --- a/lib/rfc822/message.go +++ b/lib/rfc822/message.go @@ -163,6 +163,7 @@ func parseEnvelope(h *mail.Header) *models.Envelope { MessageId: msgID, From: parseAddressList(h, "from"), ReplyTo: parseAddressList(h, "reply-to"), + Sender: parseAddressList(h, "sender"), To: parseAddressList(h, "to"), Cc: parseAddressList(h, "cc"), Bcc: parseAddressList(h, "bcc"), diff --git a/models/models.go b/models/models.go index 80bc0db1..7642579a 100644 --- a/models/models.go +++ b/models/models.go @@ -229,6 +229,7 @@ type Envelope struct { Subject string From []*mail.Address ReplyTo []*mail.Address + Sender []*mail.Address To []*mail.Address Cc []*mail.Address Bcc []*mail.Address |