我正在使用Gomail
我正在尝试向自己发送电子邮件。我已经想出了如何做到这一点,但现在我想添加一个图像,无论是在html体内还是作为附件(并不重要)。我只需要能够在我的电子邮件中看到图像。
首先,我通过img
请求发送src
POST
,然后我将其保存到以下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...
如何将此信息发送到我的电子邮箱?到目前为止,文档只能让我知道。
答案 0 :(得分:2)
首先,检查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
1}}
替代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
创建了一个示例