如何编写 mbox 格式的文件?

huangapple go评论151阅读模式
英文:

How to write mbox-formatted files?

问题

我已经使用Gmail API获取了邮件内容和必要的标头。我想将它们写入mbox文件中。我找到了一些Go语言的包和示例来读取和解析mbox文件。但是如何使用Go语言创建和写入mbox文件呢?

英文:

I have obtained the mail content and the necessary headers using Gmail API. I want to write those into mbox files. I could find Go packages and samples to read and parse mbox files. But how to create and write mbox file using Go?

答案1

得分: 5

mbox文件格式(维基百科)实际上非常简单。

每封邮件都有一行以"From "开头的首行。邮件正文中任何以"From "开头的首行都会在前面加上一个空格或">"。在每封邮件正文之后,会插入一个额外的空行。通常,邮件头部已经有一个"From ..."的首行,所以你需要做的是"遍历每封邮件,打印它,扫描正文以确保所有以"From "开头的行都有转义字符,然后在每封邮件的末尾加上一个空行"。

类似以下的代码(需要根据你表示邮件的方式进行适当调整):

package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

type Mail struct {
	Headers []string
	Body    []string
}

func (m *Mail) Save(w io.Writer) {
	for _, h := range m.Headers {
		fmt.Fprintln(w, h)
	}
	fmt.Println("")
	for _, b := range m.Body {
		if strings.HasPrefix(b, "From ") {
			fmt.Fprintln(w, ">", b)
		} else {
			fmt.Fprintln(w, b)
		}
	}
}

func WriteMbox(w io.Writer, mails []Mail) {
	for _, m := range mails {
		m.Save(w)
		fmt.Fprintln(w, "")
	}
}

func main() {
	m := Mail{Headers: []string{"From test", "Subject: Test"}, 
              Body: []string{"Mail body, totes, like"}}
	WriteMbox(os.Stdout, []Mail{m, m, m})
}
英文:

The mbox file format (Wikipedia) is actually super-simple.

Each mail has a first line that starts "From ". Any first line in the email body that happens to start with "From " has either " " or ">" prepended. After each mail body, there's an extra blank line inserted. Typically, a mail header already has a "From ..." first line, so what you need to do is "iterate through each email, print it, scan the body to ensure all lines that start "From " have an escape, then finish each mail with a blank line".

Something like the following (will need adapting to how you represent emails):

package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

type Mail struct {
	Headers []string
	Body    []string
}

func (m *Mail) Save(w io.Writer) {
	for _, h := range m.Headers {
		fmt.Fprintln(w, h)
	}
	fmt.Println("")
	for _, b := range m.Body {
		if strings.HasPrefix(b, "From ") {
			fmt.Fprintln(w, ">", b)
		} else {
			fmt.Fprintln(w, b)
		}
	}
}

func WriteMbox(w io.Writer, mails []Mail) {
	for _, m := range mails {
		m.Save(w)
		fmt.Fprintln(w, "")
	}
}

func main() {
	m := Mail{Headers: []string{"From test", "Subject: Test"}, 
              Body: []string{"Mail body, totes, like"}}
	WriteMbox(os.Stdout, []Mail{m, m, m})
}

huangapple
  • 本文由 发表于 2016年3月18日 16:15:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/36079306.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定