2016-12-13 2 views
1

Я использую GomailКак добавить изображение в HTML тело сообщения электронной почты (Go)

Я пытаюсь отправить по электронной почте себе. Я выяснил, как это сделать, но теперь я хочу добавить изображение либо в тело html, либо как вложение (на самом деле это не имеет значения). Мне просто нужно увидеть изображение в моем письме.

Во-первых, я посылаю imgsrc через POST запрос, который я затем сохранить в следующем struct ...

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) 

Это дало мне пустое изображение с ошибкой, имя файла или расширение слишком длинное. Не уверен, что это важно, но обратите внимание, что src у меня есть от HTML5 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

Возможный дубликат [Как вставить изображение в теле письма?] (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") 

Но, если вам нужно использовать изображение в сообщении, у вас есть несколько вариантов.

Alt 1: Используйте метод Embed

Вы должны иметь изображение в вашей файловой системе, так как метод определен таким образом. Вы должны сделать что-то вроде:

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

Вы должны использовать имя изображения, в этом случае tux.png, когда вы добавляете его в HTML тело с img тега, вы должны определить src как cid:tux.png

Alt 2: Используйте кодирование base64

для этого вам необходимо знать тип пантомимы файла изображения, в моем примере это PNG-файл, так что мим является 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...

EDIT:

Я создал пример с запросом JSON и обработчиком Example

+0

Я пробовал преобразовать 't.Test' в' [] byte (t.Test) ', а затем используя ваш метод ... но его выдает весь массив байтов в качестве источника изображения – Bolboa

+0

Я думаю, что' html' не получается оказаны. Я вижу «теги» не самого изображения – Bolboa

+0

@Bolboa ваш формат img - «data: image/png: base64, iVBORw0 .....», вам нужно только перезаписать ':' after 'image/png' с ';' и использовать его с 'fmt.Sprintf (« », yourImageEncoded)' – Motakjuq

Смежные вопросы