diff options
author | Koni Marti <koni.marti@gmail.com> | 2022-07-11 20:11:18 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-07-14 23:14:45 +0200 |
commit | a1a276e002b937e38585c1fe547bd0c00bc525c1 (patch) | |
tree | c39610446f03464caeb8d8571c90c2624b48e697 /worker/mbox/io.go | |
parent | 12dec19109f4ad91f60a2f012f1556bcf78312e9 (diff) | |
download | aerc-a1a276e002b937e38585c1fe547bd0c00bc525c1.tar.gz |
mbox: implement an mbox backend worker
Implement an mbox backend worker. Worker can be used for testing and
development by mocking a backend for the message store. Worker does not
modify the actual mbox file on disk; all operations are performed in
memory.
To use the mbox backend, create an mbox account in the accounts.conf
where the source uses the "mbox://" scheme, such as
source = mbox://~/mbox/
or
source = mbox://~/mbox/file.mbox
If the mbox source points to a directory, all files in this directory
with the .mbox suffix will be opened as folders.
If an outgoing smtp server is defined for the mbox account, replies can
be sent to emails that are stored in the mbox file.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'worker/mbox/io.go')
-rw-r--r-- | worker/mbox/io.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/worker/mbox/io.go b/worker/mbox/io.go new file mode 100644 index 00000000..38469160 --- /dev/null +++ b/worker/mbox/io.go @@ -0,0 +1,50 @@ +package mboxer + +import ( + "io" + "io/ioutil" + "time" + + "git.sr.ht/~rjarry/aerc/models" + "git.sr.ht/~rjarry/aerc/worker/lib" + "github.com/emersion/go-mbox" +) + +func Read(r io.Reader) ([]lib.RawMessage, error) { + mbr := mbox.NewReader(r) + uid := uint32(0) + messages := make([]lib.RawMessage, 0) + for { + msg, err := mbr.NextMessage() + if err == io.EOF { + break + } else if err != nil { + return nil, err + } + + content, err := ioutil.ReadAll(msg) + if err != nil { + return nil, err + } + + messages = append(messages, &message{ + uid: uid, flags: []models.Flag{models.SeenFlag}, content: content, + }) + + uid++ + } + return messages, nil +} + +func Write(w io.Writer, reader io.Reader, from string, date time.Time) error { + wc := mbox.NewWriter(w) + mw, err := wc.CreateMessage(from, time.Now()) + if err != nil { + return err + } + _, err = io.Copy(mw, reader) + if err != nil { + return err + } + return wc.Close() +} |