diff --git a/emencia/django/newsletter/mailer.py b/emencia/django/newsletter/mailer.py index 5ed78c3e..631809cf 100644 --- a/emencia/django/newsletter/mailer.py +++ b/emencia/django/newsletter/mailer.py @@ -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.*)>$') 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 diff --git a/emencia/django/newsletter/management/commands/send_newsletter.py b/emencia/django/newsletter/management/commands/send_newsletter.py index 5754901a..9ceaba5b 100644 --- a/emencia/django/newsletter/management/commands/send_newsletter.py +++ b/emencia/django/newsletter/management/commands/send_newsletter.py @@ -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' diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index f2224049..04f11825 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -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): diff --git a/emencia/django/newsletter/settings.py b/emencia/django/newsletter/settings.py index c2aa0c5a..6b3687fd 100644 --- a/emencia/django/newsletter/settings.py +++ b/emencia/django/newsletter/settings.py @@ -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 \ No newline at end of file diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html index 89f050d6..4cdedbe7 100644 --- a/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html @@ -421,7 +421,7 @@ - {{ news.preview|safe|truncatechars_html:60 }} + {{ news.preview|safe|truncatewords_html:25 }} @@ -574,8 +574,8 @@ {% trans "Участие в выставках" %} - {% trans "Новости" %} - {% trans "Статьи" %} + {% trans "Новости" %} + {% trans "Статьи" %}