60 lines
2.3 KiB
Python
60 lines
2.3 KiB
Python
|
|
import logging
|
||
|
|
import traceback
|
||
|
|
|
||
|
|
from django.core.mail.backends.base import BaseEmailBackend
|
||
|
|
from .models import FeedbackFromForm, EmailConnectionSettings
|
||
|
|
from django.core.mail import get_connection
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class CustomMailBackend(BaseEmailBackend):
|
||
|
|
def send_messages(self, email_messages):
|
||
|
|
try:
|
||
|
|
email_settings: EmailConnectionSettings = EmailConnectionSettings.objects.all().first()
|
||
|
|
smtp_backend = get_connection(
|
||
|
|
backend="django.core.mail.backends.smtp.EmailBackend",
|
||
|
|
host=email_settings.host,
|
||
|
|
port=email_settings.port,
|
||
|
|
use_tls=email_settings.use_tls,
|
||
|
|
use_ssl=email_settings.use_ssl,
|
||
|
|
**{
|
||
|
|
'username': email_settings.username if email_settings.username else None,
|
||
|
|
'password': email_settings.password if email_settings.password else None,
|
||
|
|
'ssl_keyfile': email_settings.ssl_keyfile if email_settings.use_ssl else None,
|
||
|
|
'ssl_certfile': email_settings.ssl_certfile if email_settings.use_ssl else None
|
||
|
|
}
|
||
|
|
)
|
||
|
|
except Exception as e:
|
||
|
|
logger.error(f"Failed to initialize SMTP connection: {e}")
|
||
|
|
print(traceback.format_exc())
|
||
|
|
for email in email_messages:
|
||
|
|
FeedbackFromForm.objects.create(
|
||
|
|
email=email.to[0],
|
||
|
|
subject=email.subject,
|
||
|
|
body=email.body,
|
||
|
|
success=False,
|
||
|
|
error_message=str(e)
|
||
|
|
)
|
||
|
|
return 0
|
||
|
|
for email in email_messages:
|
||
|
|
if email_settings and email_settings.username:
|
||
|
|
email.from_email = email_settings.username
|
||
|
|
feedback: FeedbackFromForm = FeedbackFromForm.objects.create(
|
||
|
|
email=email.to[0],
|
||
|
|
subject=email.subject,
|
||
|
|
body=email.body,
|
||
|
|
)
|
||
|
|
|
||
|
|
try:
|
||
|
|
smtp_backend.send_messages([email])
|
||
|
|
feedback.success = True
|
||
|
|
feedback.save()
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
feedback.error_message = str(e)
|
||
|
|
feedback.save()
|
||
|
|
logger.error(f"Failed to send email to {email.to[0]}: {e}")
|
||
|
|
print(traceback.format_exc())
|
||
|
|
|
||
|
|
return len(email_messages)
|