Gmail API Не отправляет вложения электронной почты в формате PDF в Django

Я использую Gmail API для отправки электронных писем с вложениями в формате PDF из моего серверной части Django, но вложение не отображается в электронном письме — приходит только текст письма.

Вот логи, показывающие, что PDF-файл сгенерирован и прикреплен правильно: [ОТЛАДКА] Размер сгенерированного PDF-файла: 16988 байт[ОТЛАДКА] Прилагаемый PDF-файл: invoice_EJ70FEX.pdf (размер: 16988 байт) [ИНФОРМАЦИЯ] Электронное письмо успешно отправлено. Идентификатор сообщения: 19561950e1b649a0

Однако, когда я получаю электронное письмо, вложение не отображается.

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

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
from email.utils import formataddr
import base64

logger = logging.getLogger(__name__)

def send_damage_invoice(driver_data, pdf_content):
    """Send damage invoice email with PDF attachment."""
    try:
        logger.debug("Preparing damage invoice email for %s (%s)", 
                    driver_data['name'], driver_data['vrm'])

        subject = f'Damage Charges Invoice - {driver_data["vrm"]}'
        from_email = formataddr(('H&S Autocare', settings.DEFAULT_FROM_EMAIL))
        to_email = driver_data['email']

        # Create context for email template
        context = {
            'driver_name': driver_data['name'],
            'vrm': driver_data['vrm']
        }

        # Render email content
        html_content = render_to_string('emails/damage_invoice.html', context)
        text_content = strip_tags(html_content)

        # Create email message
        email = EmailMultiAlternatives(
            subject=subject,
            body=text_content,
            from_email=from_email,
            to=[to_email]
        )
        email.attach_alternative(html_content, "text/html")

        # Attach PDF
        filename = f'invoice_{driver_data["vrm"]}.pdf'
        logger.debug("Attaching PDF: %s (size: %d bytes)", filename, len(pdf_content))
        email.attach(filename, pdf_content, 'application/pdf')

        email.send(fail_silently=False)
        logger.info("Email sent successfully to %s", to_email)

        return True

    except Exception as e:
        logger.error("Failed to send damage invoice email: %s", str(e))
        raise

Вы можете попробовать закодировать содержимое PDF в base64, прежде чем прикреплять его.

import base64

# Encode the PDF content in base64
pdf_content_base64 = base64.b64encode(pdf_content).decode('utf-8')

# Attach PDF
email.attach(filename, base64.b64decode(pdf_content_base64), 'application/pdf')
Вернуться на верх