M cmd/mb/main.go +18 -2
@@ 278,8 278,24 @@ func main() {
err = err1
}
case "edit":
- // todo: implement this
- err = errors.New(cmd + ": not implemented")
+ var src io.ReadCloser = os.Stdin
+ if len(os.Args) > 2 {
+ if src, err = openMsg(mbox, os.Args[2]); err != nil {
+ break
+ }
+ }
+ var msg *mail.Message
+ if msg, err = mail.ReadMessage(src); err != nil {
+ src.Close()
+ break
+ }
+ var name string
+ if name, err = mb.Edit(mbox, msg); len(name) > 0 {
+ os.Stdout.WriteString(name + "\n")
+ }
+ if err1 := src.Close(); err == nil {
+ err = err1
+ }
case "send":
var src io.ReadCloser = os.Stdin
if len(os.Args) > 2 {
M command.go +2 -2
@@ 121,7 121,7 @@ func anno(w io.Writer, p part, no int) e
return err
}
-func newPlainTextPrinter(dst io.Writer, t transform.Transformer, anno func(io.Writer, part, int) error) func(part, int) error {
+func newPlainTextDecoder(dst io.Writer, t transform.Transformer, anno func(io.Writer, part, int) error) func(part, int) error {
return func(p part, no int) error {
// todo: if the msg has no content type header, this will return "mime: no media type"
mt, _, err := mime.ParseMediaType(p.Header.Get("Content-Type"))
@@ 156,7 156,7 @@ func View(dst io.Writer, msg *mail.Messa
if _, err := io.Copy(dst, &b); err != nil {
return err
}
- return parse(msg, newPlainTextPrinter(dst, transform.Nop, anno))
+ return parse(msg, newPlainTextDecoder(dst, transform.Nop, anno))
}
func Send(msg *mail.Message) error {
M config.go +1 -1
@@ 20,7 20,7 @@ var (
// editor is a program to edit mails.
//
// This editor has to be UTF-8 capable.
- editor = "/usr/bin/nvi"
+ editor = "vim"
// viewHeader holds a list of mail header fields, as described in RFC 5322.
// These fields and their values will be shown when viewing a mail.
M decode.go +12 -4
@@ 22,6 22,14 @@ func (d decoder) safeDecodeHeader(key st
return value
}
+var dec = &mime.WordDecoder{CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
+ cr, err := decodeCharSet(charset)
+ if err != nil {
+ return nil, err
+ }
+ return transform.NewReader(input, cr), nil
+}}
+
func newDecoder() decoder {
dec := new(mime.WordDecoder)
dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {
@@ 35,12 43,12 @@ func newDecoder() decoder {
}
func decodeCharSet(charset string) (transform.Transformer, error) {
- switch strings.ToUpper(charset) {
- case "ISO-8859-1", "WINDOWS-1252":
+ switch strings.ToLower(charset) {
+ case "iso-8859-1", "windows-1252":
return charmap.Windows1252.NewDecoder(), nil
- case "ISO-8859-15":
+ case "iso-8859-15":
return charmap.ISO8859_15.NewDecoder(), nil
- case "UTF-8", "US-ASCII": // actually, we need to replace us ascii > 0x7f with something
+ case "utf-8", "us-ascii": // actually, we need to replace us ascii > 0x7f with something
return transform.Nop, nil
}
return nil, errors.New("unknown charset '" + charset + "'")
M edit.go +1 -1
@@ 260,7 260,7 @@ func fmtReply(dst io.Writer, sender stri
parseAddressList(h.Get("From"))); err != nil {
return err
}
- if err := parse(msg, newPlainTextPrinter(dst, "eMessage{true}, anno)); err != nil {
+ if err := parse(msg, newPlainTextDecoder(dst, "eMessage{true}, anno)); err != nil {
return err
}
}