remotes/origin/stage6
Alexander Burdeinyi 9 years ago
parent 2043a7983e
commit 2a3cd3ec43
  1. 33
      emencia/django/newsletter/mailer.py
  2. 28
      emencia/django/newsletter/management/commands/send_newsletter.py
  3. 35
      emencia/django/newsletter/models.py
  4. 4
      emencia/django/newsletter/settings.py
  5. 6
      emencia/django/newsletter/templates/newsletter/AutomaticEmail.html

@ -19,7 +19,6 @@ from logging import getLogger
log = getLogger('mail')
from itertools import chain
try:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
@ -84,6 +83,7 @@ else:
LINK_RE = re.compile(r"https?://([^ \n]+\n)+[^ \n]+", re.MULTILINE)
cid_rx = re.compile(r'^<(?P<id>.*)>$')
def html2text(html):
@ -153,6 +153,7 @@ class NewsLetterSender(object):
#
self.announce = self.newsletter.dailymail
self.local_dev = getattr(settings, 'LOCAL_DEV', False)
def build_message(self, contact, announce_context=None):
"""
@ -190,6 +191,8 @@ class NewsLetterSender(object):
message.attach(message_alt)
for attachment in self.attachments:
if self.newsletter.dailymail and hasattr(attachment, 'cid') and not attachment.cid in content_html:
continue
message.attach(attachment)
if self.announce and announce_context:
@ -267,7 +270,9 @@ class NewsLetterSender(object):
def build_daily_attachments(self):
attachments = []
for cid, path in dailymail_attahcments.iteritems():
attachments.append(self.gen_attachment_by_path(path, cid))
atchm = self.gen_attachment_by_path(path, cid)
atchm.cid = 'cid:' + cid
attachments.append(atchm)
return attachments
def build_announce_attachments(self, context):
@ -439,15 +444,13 @@ class NewsLetterSender(object):
if self.newsletter.status == Newsletter.WAITING:
self.newsletter.status = Newsletter.SENDING
if self.newsletter.status == Newsletter.SENDING and \
self.newsletter.mails_sent() >= \
self.newsletter.mailing_list.expedition_set().count():
if self.newsletter.status == Newsletter.SENDING and not self.expedition_list:
self.newsletter.status = Newsletter.SENT
if self.newsletter.ab_testing:
self.newsletter.ab_final_stage = True
if self.announce and not self.expedition_list:
self.newsletter.status = Newsletter.SENT
# if self.announce and not self.expedition_list:
# self.newsletter.status = Newsletter.SENT
self.newsletter.save()
@ -521,6 +524,9 @@ class NewsLetterSender(object):
print >>sys.stderr, 'smtp connection raises %s' % exception
status = ContactMailingStatus.ERROR
if self.newsletter.dailymail and status in [ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT]:
contact.last_mailing_date = datetime.now().date()
contact.save()
params = {
'newsletter': self.newsletter,
'contact': contact,
@ -551,7 +557,7 @@ class Mailer(NewsLetterSender):
if not self.can_send:
return
if not self.smtp:
if not self.smtp and not self.local_dev:
self.smtp_connect()
if self.newsletter.dailymail:
@ -583,9 +589,11 @@ class Mailer(NewsLetterSender):
# pass
if send:
message = self.build_message(contact, announce_context)
self.smtp.sendmail(self.newsletter.header_sender,
if not self.local_dev:
self.smtp.sendmail(self.newsletter.header_sender,
contact.email,
message.as_string())
# print(message)
except (Exception, ) as e:
exception = e
print(exception)
@ -615,7 +623,8 @@ class Mailer(NewsLetterSender):
# маркируем оставшиеся контакты на второй этап
self.mark_contacts_for_second_stage()
self.smtp.quit()
if not self.local_dev:
self.smtp.quit()
self.update_newsletter_status()
def smtp_connect(self):
@ -625,6 +634,8 @@ class Mailer(NewsLetterSender):
@property
def expedition_list(self):
"""Build the expedition list"""
self.second_stage_expedition_list_ids = []
self.credits = self.newsletter.server.credits()
if self.credits <= 0:
return []
@ -636,8 +647,6 @@ class Mailer(NewsLetterSender):
qs = qs[:self.credits]
self.second_stage_expedition_list_ids = []
if self.test:
return qs

@ -1,9 +1,14 @@
"""Command for sending the newsletter"""
from datetime import datetime, timedelta
from time import sleep
from django.conf import settings
from django.utils.translation import activate
from django.core.management.base import NoArgsCommand
from emencia.django.newsletter.settings import SEND_HOUR_LOOP
from emencia.django.newsletter.mailer import Mailer
from emencia.django.newsletter.models import Newsletter
class Command(NoArgsCommand):
@ -11,21 +16,24 @@ class Command(NoArgsCommand):
help = 'Send the newsletter in queue'
def handle_noargs(self, **options):
from emencia.django.newsletter.mailer import Mailer
from emencia.django.newsletter.models import Newsletter
verbose = int(options['verbosity'])
self.end_time = datetime.now() + timedelta(minutes=30)
self.verbose = int(options['verbosity'])
activate(settings.LANGUAGE_CODE)
if SEND_HOUR_LOOP:
while self.end_time > datetime.now():
self.send()
sleep(30)
else:
self.send()
if self.verbose:
print 'End session sending'
def send(self):
for newsletter in Newsletter.objects.exclude(
status__in=[Newsletter.DRAFT,
Newsletter.SENT,
Newsletter.CANCELED,]):
mailer = Mailer(newsletter, verbose=verbose)
mailer = Mailer(newsletter, verbose=self.verbose)
if mailer.can_send:
mailer.run()
if verbose:
print 'End session sending'

@ -663,6 +663,31 @@ class Newsletter(models.Model):
if self.status == item[0]:
return unicode(item[1])
return 'bug'
#
# def get_expedition_count(self):
# add_sent = False
# if self.dailymail:
# qs = self.get_dailymail_subscribers()
# add_sent = True
# else:
# qs = self.mailing_list.expedition_set()
# if self.theme_for_filter:
# # qs = qs
# status_params = {'status': ContactMailingStatus.SENT}
# if self.ab_testing and not self.ab_final_stage:
# status_params = {'status__in': [ContactMailingStatus.SENT, ContactMailingStatus.AB_WAITING]}
# another_mailing_sent = ContactMailingStatus.objects.filter(
# newsletter__mailing_list=self.mailing_list,
# creation_date__gte=datetime.now() - timedelta(days=5),
# **status_params,
# ).exclude(newsletter_id=self.pk).values_list('contact__id', flat=True)
# qs = qs\
# .filter(contactsettings__theme=self.theme_for_filter)\
# .exclude(id__in=another_mailing_sent)
# count = qs.count()
# if add_sent:
# count += self.mails_sent()
# return count
def clone(self):
clone = copy.copy(self)
@ -698,19 +723,19 @@ class Newsletter(models.Model):
periodic_filter = []
periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.WEEK,
last_mailing_date=self.sending_date - timedelta(days=7),
last_mailing_date__lte=self.sending_date - timedelta(days=7),
))
periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.WEEK_2,
last_mailing_date=self.sending_date - timedelta(days=14),
last_mailing_date__lte=self.sending_date - timedelta(days=14),
))
month = relativedelta.relativedelta(month=1)
periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.MONTH,
last_mailing_date=self.sending_date - month,
last_mailing_date__lte=self.sending_date - month,
))
periodic_filter.append(Q(last_mailing_date__isnull=True))
qs = Contact.objects.subscribers().filter(
qs = Contact.objects.valid_subscribers().filter(
reduce(operator.or_, periodic_filter),
periodic_day=self.sending_date.isoweekday(),
dailymailing=True,
@ -737,7 +762,7 @@ class NewsletterRecommend(models.Model):
permissions = (('can_change_status', 'Can change status'),)
def event(self):
return self.exposition or conference
return self.exposition or self.conference
class Link(models.Model):

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""Settings for emencia.django.newsletter"""
import string
from django.conf import settings
@ -45,3 +46,6 @@ ACTIVATION_TEMPLATE = 'client/newsletters/activation_template.html'
DEFAULT_SMPTSERVER_ID = 1
REMOVE_INACTIVATED_CONTACTS_DAYS = 3
# если отмечено будет крутить отправку в течении 30 минут
SEND_HOUR_LOOP = True

@ -421,7 +421,7 @@
</td>
</tr>
<tr>
<td style="font-family: Arial, sans-serif; color: #999999; font-size: 13px; padding-bottom: 20px; line-height: 1.5;">{{ news.preview|safe|truncatechars_html:60 }}</td>
<td style="font-family: Arial, sans-serif; color: #999999; font-size: 13px; padding-bottom: 20px; line-height: 1.5;">{{ news.preview|safe|truncatewords_html:25 }}</td>
</tr>
<tr>
<td>
@ -574,8 +574,8 @@
<td style="padding-top: 15px; padding-bottom: 15px;" align="center">
<a href="http://{{ domain }}/service/participation/" style="font-size: 15px;color: #ff6600;">{% trans "Участие в выставках" %}</a></td>
<td style="padding-top: 15px; padding-bottom: 15px;" align="center">
<a href="http://{{ domain }}/blogs/" style="font-size: 15px;color: #666666;">{% trans "Новости" %}</a></td>
<td style="padding-top: 15px; padding-bottom: 15px; padding-right: 15px;" align="center"><a href="#" style="font-size: 15px;color: #666666;">{% trans "Статьи" %}</a></td>
<a href="http://{{ domain }}/news/" style="font-size: 15px;color: #666666;">{% trans "Новости" %}</a></td>
<td style="padding-top: 15px; padding-bottom: 15px; padding-right: 15px;" align="center"><a href="http://{{ domain }}/blogs/" style="font-size: 15px;color: #666666;">{% trans "Статьи" %}</a></td>
</tr>
</table>

Loading…
Cancel
Save