forward: provide option to append all attachments
Append all non-multipart attachments with the -A flag. Rename the flag for forwarding a full message as an RFC2822 attachments to -F. Suggested-by: psykose Signed-off-by: Koni Marti <koni.marti@gmail.com> Tested-by: Tim Culverhouse <tim@timculverhouse.com>
This commit is contained in:
parent
9d90b70b4e
commit
60052c6070
4 changed files with 131 additions and 17 deletions
commands/msg
|
@ -6,9 +6,11 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.sr.ht/~rjarry/aerc/lib"
|
||||
"git.sr.ht/~rjarry/aerc/lib/format"
|
||||
|
@ -35,29 +37,28 @@ func (forward) Complete(aerc *widgets.Aerc, args []string) []string {
|
|||
}
|
||||
|
||||
func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
||||
opts, optind, err := getopt.Getopts(args, "AT:")
|
||||
opts, optind, err := getopt.Getopts(args, "AFT:")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
attach := false
|
||||
attachAll := false
|
||||
attachFull := false
|
||||
template := ""
|
||||
var tolist []*mail.Address
|
||||
for _, opt := range opts {
|
||||
switch opt.Option {
|
||||
case 'A':
|
||||
attach = true
|
||||
to := strings.Join(args[optind:], ", ")
|
||||
if strings.Contains(to, "@") {
|
||||
tolist, err = mail.ParseAddressList(to)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid to address(es): %v", err)
|
||||
}
|
||||
}
|
||||
attachAll = true
|
||||
case 'F':
|
||||
attachFull = true
|
||||
case 'T':
|
||||
template = opt.Value
|
||||
}
|
||||
}
|
||||
|
||||
if attachAll && attachFull {
|
||||
return errors.New("Options -A and -F are mutually exclusive")
|
||||
}
|
||||
|
||||
widget := aerc.SelectedTab().(widgets.ProvidesMessage)
|
||||
acct := widget.SelectedAccount()
|
||||
if acct == nil {
|
||||
|
@ -77,6 +78,14 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
subject := "Fwd: " + msg.Envelope.Subject
|
||||
h.SetSubject(subject)
|
||||
|
||||
var tolist []*mail.Address
|
||||
to := strings.Join(args[optind:], ", ")
|
||||
if strings.Contains(to, "@") {
|
||||
tolist, err = mail.ParseAddressList(to)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid to address(es): %v", err)
|
||||
}
|
||||
}
|
||||
if len(tolist) > 0 {
|
||||
h.SetAddressList("to", tolist)
|
||||
}
|
||||
|
@ -112,7 +121,7 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
return composer, nil
|
||||
}
|
||||
|
||||
if attach {
|
||||
if attachFull {
|
||||
tmpDir, err := ioutil.TempDir("", "aerc-tmp-attachment")
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -144,7 +153,6 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
template = aerc.Config().Templates.Forwards
|
||||
}
|
||||
|
||||
// TODO: add attachments!
|
||||
part := lib.FindPlaintext(msg.BodyStructure, nil)
|
||||
if part == nil {
|
||||
part = lib.FindFirstNonMultipart(msg.BodyStructure, nil)
|
||||
|
@ -158,7 +166,38 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(reader)
|
||||
original.Text = buf.String()
|
||||
addTab()
|
||||
|
||||
// create composer
|
||||
composer, err := addTab()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// add attachments
|
||||
if attachAll {
|
||||
var mu sync.Mutex
|
||||
parts := lib.FindAllNonMultipart(msg.BodyStructure, nil, nil)
|
||||
for _, p := range parts {
|
||||
if lib.EqualParts(p, part) {
|
||||
continue
|
||||
}
|
||||
bs, err := msg.BodyStructure.PartAtIndex(p)
|
||||
if err != nil {
|
||||
acct.Logger().Println("forward: PartAtIndex:", err)
|
||||
continue
|
||||
}
|
||||
store.FetchBodyPart(msg.Uid, p, func(reader io.Reader) {
|
||||
mime := fmt.Sprintf("%s/%s", bs.MIMEType, bs.MIMESubType)
|
||||
name, ok := bs.Params["name"]
|
||||
if !ok {
|
||||
name = fmt.Sprintf("%s_%s_%d", bs.MIMEType, bs.MIMESubType, rand.Uint64())
|
||||
}
|
||||
mu.Lock()
|
||||
composer.AddPartAttachment(name, mime, bs.Params, reader)
|
||||
mu.Unlock()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
return nil
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue