RDCOMClient (Outlook) — ggplot

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

Единственный способ, которым я вижу это возможным, — добавить график в виде изображения внутри свойства HTMLBody. Я пробовал 2 разных способа добавить изображение в html.

1 – Используя библиотеку RMarkdown, я создал html-страницу с сюжетом. Это не сработало, потому что изображение закодировано как строка base64, которую Outlook не поддерживает.

2 – Сохранение ggplot в файл и создание простого HTML-кода вручную, например: <html><body><img src="**path**/my_plot.png" /></body></html>. Это также показывает ошибку вместо изображения.

Есть ли способ добавить изображение в строку?

ИЗМЕНИТЬ:

Второй метод работает с локальной электронной почтой, но сообщение получателя содержит ошибку вместо фактического изображения.


person Daniel    schedule 27.04.2018    source источник
comment
Ваш метод 2 правильный, но правильный синтаксис <img src = "[path]/my_plot.png"></img>, а не <img src = "[path]/my_plot.png" />   -  person IceCreamToucan    schedule 27.04.2018
comment
Нет, синтаксис правильный. <img></img> = <img />   -  person Daniel    schedule 27.04.2018
comment
О, ты прав. Не уверен, в чем проблема, я могу отправлять изображения с помощью RDCOMClient таким образом.   -  person IceCreamToucan    schedule 27.04.2018
comment
Я узнал проблему. Второй способ работает, как вы сказали. Я использовал путь к другой машине (серверу), а не к своей. Таким образом, приложение не смогло получить доступ к пути.   -  person Daniel    schedule 27.04.2018


Ответы (1)


Вы можете прикрепить изображение и сослаться на него в теле письма, используя идентификатор контента («cid»):

library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
ggsave(tf<-tempfile(fileext = ".png"), p, dpi = 100, width = 5, height = 5)
library(RDCOMClient)
OutApp <- COMCreate("Outlook.Application")
outMail = OutApp$CreateItem(0)
attach <- outMail[["Attachments"]]$Add(tf)
invisible(attach$PropertyAccessor()$SetProperty(
  "http://schemas.microsoft.com/mapi/proptag/0x370E001E", 
  "image/png"
))
invisible(attach$PropertyAccessor()$SetProperty(
  "http://schemas.microsoft.com/mapi/proptag/0x3712001E", 
  cid <- "myggplotimg"
))
outMail[["To"]] = "[email protected]"
outMail[["Subject"]] = "ggplot image"
outMail[["HTMLbody"]] <- sprintf('<p>Here is your image:<br><img src="cid:%s"></p>', cid)
invisible(outMail$Save())
rm(outMail, attach, OutApp)
person lukeA    schedule 29.04.2018
comment
На самом деле немного проще. Вам не нужно устанавливать свойство вложения. Если вы установите cid в своем HTMLBody с именем изображения (включая расширение), это сработает. - person Daniel; 30.04.2018
comment
Как это сделать с несколькими изображениями, встроенными в электронное письмо? Я пытался применить эту концепцию к 2 изображениям, но пока безуспешно. - person georgemirandajr; 11.03.2020