如何将图像添加到电子邮件的 html 正文(前往)

How to add image to html body of an email (Go)

我正在使用 Gomail

我正在尝试向自己发送电子邮件。我已经想出如何做到这一点,但现在我想在 html 正文中或作为附件添加图像(并不重要)。我只需要能够在我的电子邮件中看到图像。

首先,我通过 POST 请求发送 img src,然后将其保存到以下 struct...

type test_struct struct {
    Test string `json:"image"`
}

然后我尝试像这样将其附加到电子邮件正文中...

mail := gomail.NewMessage()
mail.SetHeader("From", "XXXX@gmail.com")
mail.SetHeader("To", "XXXX@gmail.com")
mail.SetHeader("Subject", "IMAGE!")

mail.SetBody("text/html", `<img src="cid:t.Test" alt="My Image"/>`)

这没有用,所以我尝试使用 Embed method...

mail.Embed(t.Test)

这给了我一个空白图像,错误是文件名或扩展名太长。不确定这是否重要,但请注意我得到的 src 来自 HTML5 Canvas。我从 Canvas...

得到了图像的来源
localCanvas.toDataURL('image/png');

这是我在 t.Test...

中保存的值
buf, err := ioutil.ReadAll(req.Body)
reader := bytes.NewReader(buf)

var t test_struct

err = json.NewDecoder(reader).Decode(&t)

保存在t.Test中的字符串格式如下...

data:image/png:base64, iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgA...

如何将此发送到我的电子邮箱?文档只能让我到目前为止。

首先,检查t.Test中的数据是否正确(是否包含文件名、路径或您需要引用图像的任何内容)

嗯,你有一些选择,首先,如果只附上图片就可以了,你只需要这样做:

mail.Attach("/path/of/your/image/image.png")

但是,如果您需要在消息中使用图片,您还有其他选择。

备选方案 1:使用 Embed 方法

您的文件系统中必须有图像,因为该方法是以这种方式定义的。你必须做这样的事情:

mail.SetBody("text/html", "Image <img src=\"cid:tux.png\"/>")
mail.Embed("/path/of/your/image/tux.png")

您必须使用图像名称,在本例中为 tux.png,当您使用 img 标签将其添加到 html 正文时,您必须定义 src 喜欢 cid:tux.png

选项 2:使用 base64 编码

为此你需要知道图像文件的 mime 类型,在我的例子中是一个 png 文件,所以 mime 是 image/png。此外,您必须将图像编码为 base64。

img, err := ioutil.ReadFile("/path/of/your/image/tux.png")
if err != nil {
    // check errors
}
out := base64.StdEncoding.EncodeToString(img)

或者,如果文件系统中没有图像,但在变量([]byte 类型)中有它,则可以将其与 EncodeToString

一起使用
var imageData []byte
// in some part, you load the image data into imageData
out := base64.StdEncoding.EncodeToString(imageData)

而且你喜欢

mail.SetBody("text/html", fmt.Sprintf("Image <img src=\"data:image/png;base64,%s\"/>", out))

所以,当你使用img时,你必须在src中设置一个带有data:mime_type;base64,image_encoded_base64的嵌入图像,如果我们看这个例子,是data:image/png;base64,iVBORw0K...

编辑:

我使用 JSON 请求和处理程序 Example

创建了一个示例