You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
9.3 KiB
196 lines
9.3 KiB
# 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
|
|
|
|
# Иногда письма о счетах, которые идут нашим манагерам попадают в спам
|
|
# Добавил проверку на этот случай. Пусть еще разок попробуют
|
|
if self.error[0:54] == "(554, b'5.7.1 Message rejected under suspicion of SPAM":
|
|
self.status = 'Q'
|
|
|
|
else:
|
|
self.sent_date = datetime.datetime.now()
|
|
self.status = 'S'
|
|
self.save()
|
|
|
|
def save(self, *args, **kwargs):
|
|
if not self.result:
|
|
template = u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' \
|
|
u'<html>' \
|
|
u'<head>' \
|
|
u'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' \
|
|
u'<title></title>' \
|
|
u'</head>' \
|
|
u'<body>' \
|
|
u'<table width=100%>{TEXT}' \
|
|
u'<tr><td style="padding-bottom: 20px;">С уважением,<Br>{NAME}</td></tr>' \
|
|
u'<tr><td style="padding-bottom: 20px;"><img src="{DOMAIN}/static/img/logo.png"></td></tr>' \
|
|
u'<tr><td>Пожалуйста, по любым вопросам смело пишите на {SUPPORT}</td></tr>' \
|
|
u'</table>' \
|
|
u'</body>' \
|
|
u'</html>'
|
|
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'СМС'
|
|
|