WedX - журнал о программировании и компьютерных науках

Python: какой правильный тип MIME для прикрепления html-файла к электронной почте

У меня есть скрипт, который отправляет электронные письма с содержимым html... работает, как и ожидалось... У меня проблемы с отправкой вложения с электронным письмом.

Вложение представляет собой html-файл, хранящийся в активном каталоге скрипта... "test.html"

Как прикрепить html файл к письму? Я пробовал фрагменты из различных других сообщений, которые я нашел по этому поводу, но каждый возвращал один и тот же вывод «нет такого файла или каталога».

код следующим образом:

import smtplib
import os
import email.encoders
import email.mime.text
import email.mime.base
import mimetools
import base64



from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

    # me == Outgoing email address
    # you == Recipient's email address
me = "secret"
you = "secret"

    # Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "TEST"
msg['From'] = me
msg['To'] = you
emailMsg = email.MIMEMultipart.MIMEMultipart('alternative')

    # Create the body of the message (a plain-text and an HTML version).
html = """\
    <html>
    <head></head>
    <body>test</p>
</body>
</html>"""


    # Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
filename = "C:/CHRIS/ServerStatus/Oceaneering_Server_Status.html"
f = file(filename)
attachment = MIMEText(f.read(), _subtype='html')
attachment.add_header('Content-Disposition', 'attachment', filename=filename)

    # Attach parts into message container.
    # According to RFC 2046, the last part of a multipart message, in this case
    # the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
msg.attach(attachment)

    # Send the message via local SMTP server.
mail = smtplib.SMTP('smtp.gmail.com', 587)

mail.ehlo()

    # mail.login(username, password) to Outgoing email account
mail.login('secret', 'secret')
mail.sendmail(me, you, msg.as_string())
mail.quit()

я обновил свой код в надежде вернуть этот вопрос в тему... я добился небольшого прогресса с помощью Дирка и этой ссылки: Прикрепить txt-файл в Python smtplib...

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

Итак, чтобы переформулировать мой вопрос... Каковы корректирующие действия для изменения типа MIME этого кода, чтобы правильно прикрепить файл .html к электронному письму на основе html?

Относительный путь и каталог моего py-скрипта и html-файла, который необходимо отправить, выглядит следующим образом: C:\CHRIS\ServerStatus\

Это вывод, который я получаю с кодом, который у меня есть: введите здесь описание изображения

Вот как html-документ выглядит вне сценария электронной почты (как он должен выглядеть): введите здесь описание изображения

17.11.2015

  • Этот код работает для меня в Linux, с каким-то случайным html-файлом, получая почту в gmail, поэтому я боюсь, что не вижу вашей проблемы... Это может быть связано с кодировкой, кодировкой файла или почтовым клиентом, который вы используют. Официальные документы: docs.python.org/2/library/email-examples. .html#id2 Примечание. Рассматривали ли вы установку конвертов и использование приведенного ниже кода? Это должно позаботиться о мельчайших деталях, кросс-платформенных проблемах и т. д. 19.11.2015
  • Спасибо, dirk, я поигрался с модулем конвертов, но не смог заставить его работать правильно. В конечном итоге я переключаю этот код для работы с smtp 25 без ssl и работы на сервере, который у нас есть, но для целей тестирования я структурировал его с помощью gmail 587.. Во всем этом коде есть еще немного вне этой области, и у меня есть ощущение, что мне потребуется внести немало изменений, которые я играл с кодировкой и кодировкой, но все равно не повезло. Я обновил исходный пост с изображениями, чтобы отразить html-документ. 20.11.2015
  • Дирк, когда я реплицирую ваш код с помощью модуля конверта, я получаю сообщение об ошибке: объект Slice не имеет атрибута ниже..? 20.11.2015
  • ошибка slice..., вероятно, связана со строками, которые вы передаете для пути, адреса электронной почты или чего-то еще. трассировка стека поможет... 20.11.2015
  • Но, глядя на скриншоты, настоящий виновник, скорее всего, не код Python, а ваше понимание того, как работают html-файлы... Судя по тому, что вы показываете, html-файл выглядит нормально, за исключением того, что в нем отсутствуют стили (и наверное функциональность) Держу пари, это связано с тем, что некоторые файлы css и/или javascript, на которые есть ссылки в оригинале, недоступны для копии по электронной почте. Вы можете решить эту проблему, включив в html любую желаемую разметку/стиль, но вам нужно будет изменить файл: matthewjamestaylor.com/blog/. 20.11.2015
  • Дирк, я думаю, это встроенное. Правила оформления находятся в заголовке html. 23.11.2015
  • Так что, видимо, я погуглил... Сценарий выше работает. Проблема заключается в том, как клиент Gmail отображает предварительный просмотр HTML-документа. При загрузке HTML-документ выглядит так, как должен. 23.11.2015

Ответы:


1

Я бы посоветовал вам использовать библиотеку, а не иметь дело со встроенными почтовыми модулями, довольно не питоническими, такими как настоятельно рекомендуемые конверты:

https://tomekwojcik.github.io/envelopes/index.html

установить с помощью:

pip install envelopes

Код Python:

import os
from envelopes import Envelope

filename = "C:/CHRIS/ServerStatus/Oceaneering_Server_Status.html"

envelope = Envelope(
    from_addr=(me),
    to_addr=(you),
    subject=u'Test',
    text_body=u'Plain text version',
    html_body=html
)
envelope.add_attachment(filename)

envelope.send('smtp.gmail.com', login='secret', password='secret', tls=True)
17.11.2015
  • Извините, насчет этого.. каталог html-файла — C:\CHRIS\ServerStatus\Server_Status.html.. Каталог скрипта Python, генерирующего электронную почту, — C:\CHRIS\ServerStatus\ServerStatus.py.. Я смог отправить электронное письмо, но я просто не смог физически прикрепить файл .html к электронному письму. 18.11.2015
  • Я добавил эти строки, и он сделал вложение ... однако вложение, похоже, отправляется в текстовом формате, а не в исходном html-файле? имя_файла = C:/CHRIS/ServerStatusServer_Status.html f = файл(имя файла) вложение = MIMEText(f.read()) вложение.add_header('Content-Disposition', 'вложение', имя файла=имя файла) msg.attach(вложение) 18.11.2015
  • MIMEText(fp.read(), _subtype='html') - это, вероятно, ответ, который вы ищете, но я должен согласиться, что это делает вопрос не по теме, если он не перефразирован. Во-первых, потому что этот ответ на самом деле не подходит для исходного вопроса, а во-вторых, потому что он не является полезным дополнением к SO (люди с вашей проблемой не найдут этот вопрос, а люди, которые найдут вопрос, вряд ли столкнется с вашей проблемой: - )) 18.11.2015
  • Спасибо, я переформулировал вопрос и сообщение. Надеюсь, это снова по теме? Однако это изменение, которое вы рекомендовали, не дало того, что я искал.. :( 18.11.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]