2011-01-13 5 views
3

Я хочу, чтобы заменить встроенные send_mail функции, которая работает только с простым текстовыми сообщениями электронной почты, с моей умной send_mail функцией, которая генерирует как HTML и текстовые версии автоматически. Все работает так, как ожидалось, для моих собственных писем, определенных в моем собственном приложении. Я могу сделать это в views.py таким образом:Сделать Django построить в send_mail функции работы с HTML по умолчанию

from django.core import mail 
from utils import send_mail as send_html_mail 
mail.send_mail = send_html_mail 

Но проблема все еще появляется с электронной почтой в третьей стороне приложений. Там все импорт уже завершен до моего кода с помощью исправления обезьяны send_mail.

Возможно ли переопределить эту функцию перед импортом всех приложений django? Или может быть другое решение этой проблемы. Я действительно не хочу исправлять код с отправкой писем этих сторонних приложений. Очень просто разместить html-шаблон.

ответ

1

Я написал приложение для быстрого перехода от текстовых сообщений электронной почты к электронной почте на основе html для всех приложений проекта. Он будет работать без изменения кода Django или кода других приложений третьей части.

Проверьте это здесь: https://github.com/ramusus/django-email-html

0

Как насчет смены django и подставить исходный код вашей собственной функцией? Фактически вы можете просто добавить свою собственную функцию и не удалять старое, поскольку последнее определение будет импортировано. Мне не нравятся такие решения, потому что мне не нравятся исправления внешних библиотек (вам нужно помнить о их исправлении при обновлении), но это быстро решит вашу проблему.

+0

благодарит за сообщение. это возможно, но я нашел немного более чистое решение, если я могу назвать такие решения, как это :-). Без изменения кода django – ramusus

+0

Если вам интересно, ознакомьтесь с этим приложением https://github.com/ramusus/django-email-html – ramusus

+0

Как именно вы замените старую функцию отправки? Почему теперь это происходит, когда другие модули импортируют его? Я хотел бы знать, чтобы снова использовать этот трюк. – gruszczy

2

С Django документы: http://docs.djangoproject.com/en/dev/topics/email/#sending-alternative-content-types

from django.core.mail import EmailMultiAlternatives 

subject, from_email, to = 'hello', '[email protected]', '[email protected]' 
text_content = 'This is an important message.' 
html_content = '<p>This is an <strong>important</strong> message.</p>' 
msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) 
msg.attach_alternative(html_content, "text/html") 
msg.send() 

Нет send_mail() требуется.

+0

Проблема, связанная с электронной почтой внутри сторонних приложений, которую я не хочу переписывать. Они используют встроенную функцию send_mail, но я хочу переключить все электронные письма моего сайта на html-версию. – ramusus

+0

Если вам интересно, ознакомьтесь с этим приложением https://github.com/ramusus/django-email-html – ramusus

4

Django 1.2 позволяет вставных бэкэндов электронной почты: http://docs.djangoproject.com/en/1.2/topics/email/#defining-a-custom-e-mail-backend

+0

. Моя проблема глубже. Я уже использую пользовательский бэкэнд из почтового приложения. Это приложение сначала отправило электронное письмо в Db, а затем отправило его по заданию cron. По некоторым причинам писать обертку вокруг ** почтового сервера электронной почты почтовым сообщением невозможно. Поскольку эти приложения используют несколько способов отправки электронной почты в БД. – ramusus

+0

Если вы ссылаетесь на 'django-mailer', у него есть собственный бэкэнд, который помещает сообщения в БД. Однако есть настройка для изменения бэкэнда, который отправляет почту: 'MAILER_EMAIL_BACKEND' –

+0

Да, это понятно для меня, спасибо. Он должен работать, но я вижу одну плохую сторону этого пути. Мы будем генерировать, помещать в БД, получать из неправильно созданного сообщения электронной почты БД и только в последний момент сделать его правильным (с html и текстовыми телами). Это совсем не хорошо. Например, если мне нужно покрыть эту систему с помощью тестов, мне нужно будет переключить брандмауэр электронной почты на локальную память и работать с плохо сгенерированными сообщениями электронной почты. – ramusus

2

Похоже, многие люди неправильно понимают ваш вопрос.

Для переопределения импорта из сторонних модулей может потребоваться перезапись sys.modules['django.core.mail'].

Он работает в простых тестах, но он не прошел тщательную проверку.

import sys 
from django.core import mail 

def my_send_mail(*args, **kwargs): 
    print "Sent!11" 

mail.send_mail = my_send_mail 
sys.modules['django.core.mail'] = mail 


from django.core.mail import send_mail 
send_mail('blah') 
# output: Sent!11 

Например, если я ставлю этот код в моей settings.py и запустить manage.py shell и импортировать send_mail, я получаю мою версию.

Моя скорлупа сессия

In [1]: from django.core.mail import send_mail 
In [2]: send_mail() 
Sent!11 

Отказ
Я никогда не делал ничего подобного, и не знаю, есть ли какие-либо фанки последствия.

+0

Если вам интересно, ознакомьтесь с этим приложением github.com/ramusus/django-email-html – ramusus

 Смежные вопросы

  • Нет связанных вопросов^_^