# coding=utf-8 from __future__ import unicode_literals import datetime import smtplib from django.db import models from django.core.mail import EmailMessage, send_mail from lms.settings import DEFAULT_FROM_EMAIL, TESTING, TEST_EMAIL, NAME, DOMAIN, SUPPORT, SUPPORT_PHONE from redactor.fields import RedactorField from lms.tools import random_string, str_shielding def mail_access_token(): pass class MailTemplate(models.Model): key = models.CharField(verbose_name=u'Ключ шаблона', max_length=255, editable=False, blank=True) title = models.CharField(verbose_name=u'Название шаблона', max_length=255) text = models.TextField(verbose_name=u'Шаблон', default='', help_text='{TEXT} - Текст самого письма ' '{DOMAIN} - Домен отправителя' '{NAME} - Название компании,' '{SUPPORT} - Почта поддержки,' '{SUPPORT_PHONE} - Телефон поддержки') def __unicode__(self): return u'%s' % self.title def __str__(self): return '%s' % self.title def save(self, *args, **kwargs): if not self.key: self.key = random_string() super(MailTemplate, self).save(*args, **kwargs) class Meta: verbose_name = u'Шаблон письма' verbose_name_plural = u'Шаблоны писем' class MailBox(models.Model): MAIL_STATUS = ( ('Q', 'На очереди'), ('W', 'Ожидает даты доставки'), ('S', 'Отправлен'), ('E', 'Ошибка отправки'), ('D', 'Доставлен'), ('F', 'Адресат не найден') ) #token = models.CharField(verbose_name=u'Токен', max_length=255, default=mail_access_token, unique=True) status = models.CharField(verbose_name=u'Статус письма', choices=MAIL_STATUS, default='Q', max_length=1) custom = models.BooleanField(verbose_name=u'Кастомная обложка', default=False) _to = models.EmailField(verbose_name=u'Почта') queue_date = models.DateTimeField(verbose_name=u'Дата постановки задачи', default=datetime.datetime.now, help_text=u'Если указать дату доставки, письмо будет ожидать времени своего ' u'отправления') error = models.CharField(verbose_name=u'Ошибка отправки', blank=True, default='', max_length=255) sent_date = models.DateTimeField(verbose_name=u'Время отправки', blank=True, null=True, editable=False) title = models.CharField(verbose_name=u'Заголовок письма', max_length=255) text = models.TextField(verbose_name=u'Текст отправки', editable=False) result = RedactorField(verbose_name=u'Вид письма', blank=True, default='') _type = models.CharField(verbose_name=u'Тип письма', max_length=255, blank=True, default='') template = models.CharField(verbose_name=u'Ключ шаблона письма', max_length=100, blank=True, default='') def __unicode__(self): return u'%s %s' % (self._to, self.get_status_display()) def __str__(self): return '%s %s' % (self._to, self.get_status_display()) def send_letter(self): if not self.custom: msg = EmailMessage(self.title, self.result, u'{1} <{0}>'.format(DEFAULT_FROM_EMAIL, NAME), [self._to if not TESTING else TEST_EMAIL]) msg.content_subtype = "html" try: msg.send() except smtplib.SMTPDataError as e: self.status = 'E' self.error = e else: self.sent_date = datetime.datetime.now() self.status = 'S' else: try: send_mail( self.title, '', u'{1} <{0}>'.format(DEFAULT_FROM_EMAIL, NAME), [self._to], fail_silently=True, html_message=self.result ) except smtplib.SMTPDataError as e: self.status = 'E' self.error = e else: self.sent_date = datetime.datetime.now() self.status = 'S' self.save() def save(self, *args, **kwargs): if not self.result: template = u'' \ u'' \ u'' \ u'' \ u'' \ u'' \ u'' \ u'{TEXT}' \ u'' \ u'' \ u'' \ u'
С уважением,
{NAME}
Пожалуйста, по любым вопросам смело пишите на {SUPPORT}
' \ u'' \ u'' if self.template: try: _tmp = MailTemplate.objects.get(key=self.template) except MailTemplate.DoesNotExists: pass else: template = str_shielding(_tmp.text, ['{TEXT}', '{DOMAIN}', '{NAME}', '{SUPPORT}', '{SUPPORT_PHONE}']) self.result = template.format(**{'TEXT': self.text, 'DOMAIN': DOMAIN, 'NAME': NAME, 'SUPPORT': SUPPORT, 'SUPPORT_PHONE': SUPPORT_PHONE}) else: self.custom = True super(MailBox, self).save(*args, **kwargs) class Meta: verbose_name = u'Письмо' verbose_name_plural = u'Письма' class Sms(models.Model): STAT = ( ('S', 'Отправляется'), ('F', 'Отправлен'), ('E', 'Ошибка отправления') ) FROM = ( ('T', 'Tocka Koda'), ('C', 'CODEMY.RU') ) sent = models.BooleanField(verbose_name=u'Отправить', default=False, editable=False) _to = models.CharField(verbose_name=u'Получатель', max_length=255, help_text='+79660497379') _status = models.CharField(verbose_name=u'Статус сообщения', max_length=1, default='S', choices=STAT, editable=False) date = models.DateTimeField(verbose_name=u'Дата отправки', default=datetime.datetime.now, help_text='Не дальше 7ми дней') text = models.TextField(verbose_name=u'Текст') _from = models.CharField(verbose_name=u'Отправитель', max_length=1, default='C', choices=FROM) error = models.TextField(verbose_name=u'Описание отправки', blank=True, null=True, editable=False) debug = models.CharField(verbose_name=u'Строка запроса', max_length=255, blank=True) def __unicode__(self): return u'%s %s %s' % (self._to, self._status, self.text) def save(self, *args, **kwargs): #if not self.sent: # try: # url = "http://sms.ru/sms/send" # values = {'api_id': SMS, 'to': self._to, 'text': self.text.encode('utf-8'), # 'from': self.get__from_display(), 'time': str(time.mktime(self.date.timetuple()))[:10]} # data = urllib.urlencode(values) # self.debug = url # req = urllib2.Request(url, data) # res = urllib2.urlopen(req) # except urllib2.URLError as errstr: # self.error = errstr # self._status = 'E' # else: # sr = res.read().splitlines() # if sr is not None and int(sr[0]) == 100: # self._status = 'F' # if sr is not None and int(sr[0]) != 100: # self._status = 'E' # self.error = servicecodes[int(sr[0])] # self.sent = True super(Sms, self).save(*args, **kwargs) class Meta: verbose_name = u'СМС' verbose_name_plural = u'СМС'