Отправьте HTML-файл в виде основного письма через Outlook, используя Python - PullRequest
3 голосов
/ 10 апреля 2019

Я пытаюсь отправить диаграмму боке через электронную почту outlook как тело.И вы знаете, график боке, я сгенерировал как файл HTML.То же самое, что я хотел бы отправить в электронном письме, вложенном как тело письма.

Я попытался прочитать чтение HTML-файла с помощью команды read и указать то же самое, что и htmlbody.Но это приходит как пустое в электронном письме.Ничто не приходит населенным.Ниже приведен код, который я пробовал.

import win32com.client as win32
import psutil
import os
import subprocess
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'ABC@XYZ.com'
mail.Subject = 'Sent through Python'
html_url='C:/Users/ABC/Documents/XYZ/test.htm'
with open(html_url, 'r') as myfile:
     data=myfile.read()
mail.HTMLBody = data
mail.send

Затем попробовал следующее ... Но тело электронной почты все еще пустое. Любая идея, что не так ???

from bokeh.embed import components
from jinja2 import Template
from bokeh.resources import INLINE
from bokeh.plotting import figure
from bokeh.io import output_file,show,output_notebook

import win32com.client as win32
import psutil
import os
import subprocess

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'ABC@XYZ.com'
mail.Subject = 'Sent through Python'

def get_plot_components() :
   # build your plot here
    plot = figure()
    plot.circle([2,3,4],[5,6,7])
    show(plot)
    script, div = components(plot)
    return script, div

template = Template('''
       <div id='bokeh_plot_for_the_body'>
          {{ resources | safe }}
          {{ div | safe }}
          {{ script | safe }}
       </div>
                ''')

script, div = get_plot_components()
outlook_body = template.render(resources = INLINE.render(),
                               script = script,
                               div = div)
mail.HTMLBody = outlook_body
mail.send

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

Вам необходимо добавить кодировку с открытым файлом шаблона.

Пример:

html_url= open('C:/Users/ABC/Documents/XYZ/test.htm', encoding='utf16')
data=html_url.read()

Это работает для меня.

0 голосов
/ 17 мая 2019

Похоже, что этого нельзя достичь, так как ни один почтовый клиент не позволяет запускать сценарии из-за угрозы безопасности. Единственный выход - прикрепить файл html или дать ссылку html в электронном письме.

0 голосов
/ 10 апреля 2019

У меня нет машины Windows для тестирования, но я думаю, что проблема может заключаться в том, что вы пытаетесь встроить полную HTML-страницу, сгенерированную Bokeh, в тело другого HTML-файла, сгенерированного Outlook.Итак, вы получаете:

<!DOCTYPE html>
<html lang='en'>
    <head>
        <title>Outlook Message</title>
    </head>  
    <body>

        <!DOCTYPE html>
        <html lang='en'>
            <head>
                <title>Bokeh Plot</title>
            </head>  
            <body>
                <div id=plot>
                <script id=bokeh_script>
                </script>
                </div>
            </body>
        </html>

    </body>
</html>

Я бы посоветовал объединить ваш скрипт bokeh со скриптом, отправляющим сообщение Outlook, добавив функцию, которая возвращает компоненты bokeh, такие как:

from bokeh.embed import components
from jinja2 import Template
from bokeh.resources import INLINE

import win32com.client as win32
import psutil
import os
import subprocess

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'ABC@XYZ.com'
mail.Subject = 'Sent through Python'
html_url='C:/Users/ABC/Documents/XYZ/test.htm'
with open(html_url, 'r') as myfile:
    data=myfile.read()

def get_plot_components()
   # build your plot here
   script, div = components(plot)
   return script, div

template = Template('''
       <div id='bokeh_plot_for_the_body'>
          {{ resources | safe }}
          {{ div | safe }}
          {{ script | safe }}
       </div>
''')

script, div = get_plot_components()
outlook_body = template.render(resources = INLINE.render(),
                               script = script,
                               div = div)
mail.HTMLBody = outlook_body
mail.send
...