2016-12-13 157 views
1

的身体,我使用Gomail如何添加图片到HTML中的电子邮件(GO)

我试图发送电子邮件给自己。我已经想出了如何做,但现在我想添加一个图像,无论是在HTML体或附件(并不重要)。我只需要能够看到我的电子邮件中的图像。

首先,我通过一个POST请求,然后我保存到以下struct发送imgsrc ...

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

然后我尝试它附加在电子邮件正文中,像这样.. 。

mail := gomail.NewMessage() 
mail.SetHeader("From", "[email protected]") 
mail.SetHeader("To", "[email protected]") 
mail.SetHeader("Subject", "IMAGE!") 

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

这个没有工作,所以我试图用Embed method ...

mail.Embed(t.Test) 

这给了我一个空白的图像,错误的文件名或扩展名太长。不知道这是否重要,但请注意,我得到的是HTML5画布。我从画布图像的源...

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

的可能的复制[如何将图像插入电子邮件正文?](HTTP:/ /stackoverflow.com/questions/34790771/how-do-i-insert-an-image-into-email-body) –

+0

t.Test是图像还是文件名? –

+0

@JohnSPerayil它是我认为的图像本身 – Bolboa

回答

1

首先,检查是否在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身上,你必须定义srccid:tux.png

Alt 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

+0

我试着把't.Test'转换成'[] byte(t.Test)',然后使用你的方法......但是它打印出整个字节数组作为图像源 – Bolboa

+0

我认为'html'没有得到渲染。我看到'tags'不是图像本身 – Bolboa

+0

@Bolboa你的img格式是'data:image/png:base64,iVBORw0 .....',你只需要在'image/png'后面重新设置':'''用';'和'fmt.Sprintf(“”,yourImageEncoded)' – Motakjuq

相关问题