Как прикрепить файл html в каталоге проекта и отправить его по почте? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь отправить отчет о покрытии, созданный после выполнения контрольных примеров, который создается в папке htmlcov,

import os
from django.conf import settings
from utils import email_utils


def pytest_sessionfinish(session, exitstatus):
    to = ['xyz123@gmail.com']
    body = 'test'
    subject = 'coverage test'
    attachment = 'htmlcov/index.html'
    coverage_html = os.path.join(settings.BASE_DIR + '/' + attachment)
    email_utils.send_email_with_attachment(to, body, subject, coverage_html,
                                          'application/html',
                                          'index.html')

, при этом я получаю следующую ошибку:

ERROR | 2020-03-12 10:07:57,180 | MainThread | email_utils.send_email_with_attachment.69 | a bytes-like object is required, not 'str'
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/core/mail/message.py", line 342, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python3.5/dist-packages/sgbackend/mail.py", line 66, in send_messages
    mail = self._build_sg_mail(email)
  File "/usr/local/lib/python3.5/dist-packages/sgbackend/mail.py", line 125, in _build_sg_mail
    base64_attachment = base64.b64encode(attachment[1])
  File "/usr/lib/python3.5/base64.py", line 59, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: a bytes-like object is required, not 'str'

Я проверил, существует ли файл в пути, используя оператор if, и да, он существует, это связано с тем, как я здесь работаю с файлами? Какой подход должен быть правильным?

это отправка электронной почты, которую я использую:

def send_email_with_attachment(to_email, body, subject, attachment_content=None, main_type=None, file_name=None):
    data = {'from_email': settings.DEFAULT_FROM_EMAIL, 'to': to_email,
            'subject': subject, 'body': body}

    logger.info("sending email")
    email = EmailMessage(**data)
    email.content_subtype = "html"

    if attachment_content:
        email.attach(file_name, attachment_content, main_type)
    try:
        email.send()
        logger.info("Email sent")
    except BaseException as e:
        logger.exception(e)

1 Ответ

0 голосов
/ 13 марта 2020

Привет, Джуниор, поместите свой html файл в папку шаблонов, напишите код ниже и убедитесь, что в файле settings.py вы написали настройки шаблонов.

import os
from django.conf import settings
from utils import email_utils


def pytest_sessionfinish(session, exitstatus):
    to = ['xyz123@gmail.com']
    body = 'test'
    subject = 'coverage test'
    attachment = "index.html"
    coverage_html = os.path.join(settings.BASE_DIR + '/' + attachment)
    email_utils.send_email_with_attachment(to, body, subject, coverage_html,
                                           'application/html',
                                           "index.html")
...