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')