diff --git a/OneCprogsite/settings.py b/OneCprogsite/settings.py index b1819ce..e5b64b7 100644 --- a/OneCprogsite/settings.py +++ b/OneCprogsite/settings.py @@ -209,8 +209,9 @@ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = os.getenv('EMAIL_HOST') # или smtp.gmail.com, smtp.mail.ru EMAIL_PORT = int(os.getenv('EMAIL_PORT', 465)) -EMAIL_USE_SSL = os.getenv('EMAIL_USE_SSL', 'False').lower() == 'False' -EMAIL_USE_TLS = os.getenv('EMAIL_USE_TLS', 'False').lower() == 'False' +EMAIL_USE_SSL = True +# if os.getenv('EMAIL_USE_TLS', 'False').lower() == 'False': +# EMAIL_USE_TLS = True EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER') EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD') DEFAULT_FROM_EMAIL = EMAIL_HOST_USER diff --git a/programmer/admin.py b/programmer/admin.py index d13eefd..845341d 100644 --- a/programmer/admin.py +++ b/programmer/admin.py @@ -52,12 +52,8 @@ class CallbackAdmin(admin.ModelAdmin): actions = ['mark_as_read', 'mark_as_unread', 'mark_as_processed', 'resend_notification'] def resend_notification(self, request, queryset): - from .utils.email_notifications import send_callback_notification - count = 0 - for callback in queryset: - success = send_callback_notification(callback) - if success: - count += 1 + from .utils.email_notifications import send_multiple_callback_notifications + count = send_multiple_callback_notifications(queryset) self.message_user(request, f'Уведомления отправлены для {count} заявок') resend_notification.short_description = "Переотправить email уведомления" diff --git a/programmer/utils/email_notifications.py b/programmer/utils/email_notifications.py index fa902a8..82170a6 100644 --- a/programmer/utils/email_notifications.py +++ b/programmer/utils/email_notifications.py @@ -1,5 +1,4 @@ -# programmer/utils/email_notifications.py -from django.core.mail import send_mail, EmailMultiAlternatives +from django.core.mail import send_mail, get_connection from django.template.loader import render_to_string from django.conf import settings from django.utils.html import strip_tags @@ -63,3 +62,45 @@ def send_test_email(): except Exception as e: logger.error(f"Test email failed: {e}") return False + + +def send_multiple_callback_notifications(callbacks): + """ + Отправляет уведомления для нескольких заявок, используя одно SMTP-соединение. + Возвращает количество успешно отправленных. + """ + if not callbacks: + return 0 + + connection = get_connection() + try: + connection.open() + count = 0 + for callback in callbacks: + try: + subject = f'🚨 Новая заявка на обратный звонок от {callback.name}' + html_message = render_to_string('emails/callback_notification.html', { + 'callback': callback, + 'site_url': settings.ALLOWED_HOSTS[0] if settings.ALLOWED_HOSTS else 'localhost', + }) + plain_message = strip_tags(html_message) + + send_mail( + subject=subject, + message=plain_message, + from_email=settings.DEFAULT_FROM_EMAIL, + recipient_list=settings.ADMIN_EMAILS, + html_message=html_message, + connection=connection, # используем одно соединение + fail_silently=False, + ) + count += 1 + except Exception as e: + logger.error(f"Error sending email for callback #{callback.id}: {e}") + connection.close() + return count + except Exception as e: + logger.error(f"Connection error: {e}") + if connection: + connection.close() + return 0