Как интегрировать HTML-код в скрипт Python? - PullRequest
6 голосов
/ 30 мая 2019

У меня есть код Python, который создает отчет для фрейма данных из Reddit, преобразует его в простой HTML, а затем отправляет его по электронной почте. Ниже приведен код:

#Clean all the Dataframes
test_clean = clean(test_test_df)
brand_clean = clean(brands_df)
competitor_clean = clean(competitors_df)
#Convert to HTML
test_html = test_clean.render()
brand_html = brand_clean.render()
competitor_html = competitor_clean.render()


# In[27]:


brand_clean


# # Email Integration

# #### Import Libraries for Email

# In[ ]:


import smtplib
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText
from datetime import date


# #### Send Email If No Data is Available

# In[ ]:


if test_test_df.empty:
    today = str(date.today())

    fromaddr = "email@email.com"
    toaddr = "email@email.com"
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Daily Reddit Monitor " + today


    message = "There are no relevant posts above the 100 score threshold today!"

    #email = df_complete.render()

    part1 = MIMEText(message, 'plain')


    msg.attach(part1)
    #msg.attach(part2)

    server = smtplib.SMTP('smtp.postmarkapp.com', 587)
    server.starttls()
    server.login('API-KEY”, “API-KEY')
    text = msg.as_string()
    server.sendmail(fromaddr, toaddr, text)
    server.quit()
    IpyExit 

Полученное письмо имеет очень простой формат. Я хотел, чтобы электронная почта выглядела хорошо, поэтому написал HTML-код с логотипом изображения заголовка и т. Д., Используя встроенный CSS-код HTML Tables, короче говоря, HTML-код для новостного письма. Теперь я хочу, чтобы этот сценарий Python использовал мой HTML-код при отправке электронного письма, чтобы электронное письмо при получении в папке «Входящие» выглядело хорошо, как новостное письмо. Любое предложение или решение, как я могу этого достичь?

Ниже приведен мой HTML-код.

<table width="689" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="#353A71">
<tr>
     <td valign="middle" align="center">

     <table width="689" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" align="center">
    <tr align="left"> 
         <td valign="top" colspan="2"> 

          <table width="100%" border="0" cellpadding="3" cellspacing="0" bgcolor="#FFFFFF">
        <tr> 
             <td width="0%">&nbsp;</td>
            <td valign="top" width="100%">

               <center><h1 style="font-family:helvetica;">Top Reddit Posts</h1></center>



                <td width="0%">&nbsp;</td>
        </tr>
        <tr>

             <td width="0%">&nbsp;</td>
               <td>&nbsp;</td>     

            <td width="0%">&nbsp;</td>
        </tr>
          <tr> 
             <td width="0%" bgcolor="#FFFFFF">&nbsp;</td>
            <td align="center" class="profileCaptionWhiteBold" width="100%" valign="top" bgcolor="#FFFFFF"> 
               </td>
               <td width="0%" bgcolor="#FFFFFF">&nbsp;</td>
        </tr>
        </table>

Итак, я хочу, чтобы выход сценария был следующим:

Топ сообщений Reddit

Ответы [ 3 ]

8 голосов
/ 02 июня 2019

Скажем, HTML, который вы сгенерировали в другом месте, содержится в строке messageHTML, тогда все, что вам нужно добавить, это:

msg.attach(MIMEText(messageHTML, 'html'))

Оставьте также простой текст, чтобы две строки выглядели как

msg.attach(MIMEText(messagePlain, 'plain'))
msg.attach(MIMEText(messageHTML, 'html'))

Чтобы настроить HTML, создайте переменную messageHTML. Затем вы можете создать таблицу следующим образом (при условии, что вам нужна 1 строка с 2 столбцами, data_1 и data_2):

messagePlain = data_1 + " " + data_2
messageHTML = '<table><tr><td>' + data_1 + '</td><td>' + data_2 + '</td></tr></table>'

msg.attach(MIMEText(messagePlain, 'plain'))
msg.attach(MIMEText(messageHTML, 'html'))

Я бы порекомендовал начать с простой таблицы, возможно, даже не с динамически полученных данных, чтобы убедиться, что HTML-код корректно отображается при отправке, а затем он расширяет HTML-код до содержимого и стиля, которые вы захотите позже.

2 голосов
/ 08 июня 2019

Ваш пример кода был не очень понятным, но я думаю, что вы просто пытаетесь встроить существующий HTML-фрагмент (отчет для фрейма данных из Reddit) в большую HTML-страницу, которая представляет его красиво.

Для этого вы можете просто использовать шаблон, содержащийся в многострочной строке, а затем подставить в него значения для меток {}:

# Placeholder for current html report from dataframe (replace with your code)
df = pd.DataFrame([{'Title': 'Story 1 title', 'Description': 'Story 1 description'}])
redditHTML = df.to_html()

# HTML news letter template
template='''
<table width="689" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="#353A71">
    <tr>
        <td valign="middle" align="center">
            <table width="689" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" align="center">
                <tr align="left"> 
                    <td valign="top" colspan="2"> 
                        <table width="100%" border="0" cellpadding="3" cellspacing="0" bgcolor="#FFFFFF">
                            <tr> 
                                <td width="0%">&nbsp;</td>
                                <td valign="top" width="100%">
                                    <center><h1 style="font-family:helvetica;">Top Reddit Posts</h1></center>

                                    {}

                                </td>
                                <td width="0%">&nbsp;</td>
                            </tr>
                            <tr>
                                <td width="0%">&nbsp;</td>
                                <td>&nbsp;</td>     
                                <td width="0%">&nbsp;</td>
                            </tr>
                            <tr> 
                                <td width="0%" bgcolor="#FFFFFF">&nbsp;</td>
                                <td align="center" class="profileCaptionWhiteBold" width="100%" valign="top" bgcolor="#FFFFFF"></td>
                                <td width="0%" bgcolor="#FFFFFF">&nbsp;</td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>
'''

completeHTML = template.format(redditHTML)

msg.attach(MIMEText(completeHTML, 'html'))

Обратите внимание, что в вашем примере HTML-кода отсутствовал </td>, чтобы закрыть раздел, содержащий Top Reddit Posts, плюс отсутствовал завершающий </td> </tr> </table>, чтобы завершить новостное письмо

0 голосов
/ 03 июня 2019

Вы можете создать электронное письмо в формате HTML (в Windows) следующим образом:

    import win32com.client as win32   
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)   
    mail.HtmlBody = html_string
    mail.To = ''
    mail.Subject = ''

и т. Д.

...