def test_send_mass_mail(self): with self.settings(MAILER_EMAIL_BACKEND= "django.core.mail.backends.locmem.EmailBackend"): mails = ( ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ) mailer.send_mass_mail(mails) self.assertEqual(Message.objects.count(), 4) self.assertEqual(Message.objects.deferred().count(), 0) engine.send_all() self.assertEqual(Message.objects.count(), 0) self.assertEqual(Message.objects.deferred().count(), 0) self.assertEqual(len(mail.outbox), 4) for i, sent in enumerate(mail.outbox): # Default "plain text" self.assertEqual(sent.subject, "Subject ☺") self.assertEqual(sent.from_email, "mass{0}@example.com".format(i)) self.assertEqual(sent.to, ["recipient{0}@example.com".format(i)])
def test_send_mass_mail(self): with self.settings(MAILER_EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend"): mails = ( ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ("Subject ☺", "Body", "*****@*****.**", ["*****@*****.**"]), ) mailer.send_mass_mail(mails) self.assertEqual(Message.objects.count(), 4) self.assertEqual(Message.objects.deferred().count(), 0) engine.send_all() self.assertEqual(Message.objects.count(), 0) self.assertEqual(Message.objects.deferred().count(), 0) self.assertEqual(len(mail.outbox), 4) for i, sent in enumerate(mail.outbox): # Default "plain text" self.assertEqual(sent.subject, "Subject ☺") self.assertEqual(sent.from_email, "mass{0}@example.com".format(i)) self.assertEqual(sent.to, ["recipient{0}@example.com".format(i)])
def notify_topic_subscribers(post): """ 邮件订阅提醒通过email送出 :param post: :return: """ topic = post.topic if post != topic.head: old_lang = translation.get_language() # Define constants for templates rendering delete_url = reverse('bb:delete_subscription', args=[post.topic.id]) current_site = Site.objects.get_current() from_email = settings.DEFAULT_FROM_EMAIL subject = render_to_string('mail/subscription_email_subject.html', { 'site': current_site, 'post': post }) # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) mails = tuple() for user in topic.subscribers.exclude(pk=post.user.pk): try: validate_email(user.email) except: # Invalid email continue if user.email == '*****@*****.**' % getattr( user, compat.get_username_field()): continue lang = utils.get_bb_profile( user).language or settings.LANGUAGE_CODE translation.activate(lang) message = render_to_string( 'mail/subscription_email_body.html', { 'site': current_site, 'post': post, 'delete_url': delete_url, 'user': user }) mails += ((subject, message, from_email, [user.email]), ) # Send mails send_mass_mail(mails, fail_silently=True) # Reactivate previous language translation.activate(old_lang)
def notify_topic_subscribers(post): """ 邮件订阅提醒通过email送出 :param post: :return: """ topic = post.topic if post != topic.head: old_lang = translation.get_language() # Define constants for templates rendering delete_url = reverse('bb:delete_subscription', args=[post.topic.id]) current_site = Site.objects.get_current() from_email = settings.DEFAULT_FROM_EMAIL subject = render_to_string('mail/subscription_email_subject.html', {'site': current_site, 'post': post}) # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) mails = tuple() for user in topic.subscribers.exclude(pk=post.user.pk): try: validate_email(user.email) except: # Invalid email continue if user.email == '*****@*****.**' % getattr(user, compat.get_username_field()): continue lang = utils.get_bb_profile(user).language or settings.LANGUAGE_CODE translation.activate(lang) message = render_to_string('mail/subscription_email_body.html', {'site': current_site, 'post': post, 'delete_url': delete_url, 'user': user}) mails += ((subject, message, from_email, [user.email]),) # Send mails send_mass_mail(mails, fail_silently=True) # Reactivate previous language translation.activate(old_lang)
def notify_topic_subscribers(post): topic = post.topic old_lang = translation.get_language() # Define constants for templates rendering context_vars = { 'delete_url': reverse('pybb:delete_subscription', args=[post.topic.id]), 'site_url': get_setting('site', 'global', 'siteurl'), 'is_new_topic': post == topic.head, 'post': post, 'post_url': reverse('pybb:post', args=[post.id]), 'forum_url': reverse('pybb:forum', args=[topic.forum.id]), } from_email = settings.DEFAULT_FROM_EMAIL mails = tuple() if post == topic.head: subject_template = 'pybb/mail_templates/moderator_email_subject.html' users = topic.forum.moderators.all() else: subject_template = 'pybb/mail_templates/subscription_email_subject.html' users = topic.subscribers.exclude(pk=post.user.pk) subject = render_to_string(template_name=subject_template, context={ 'site_url': context_vars['site_url'], 'post': post, 'topic': topic }) # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) for user in users: message = get_email_message(user, **context_vars) if message: message = add_tendenci_footer(message, content_type="text") mails += ((subject, message, from_email, [user.email]), ) # Send mails send_mass_mail(mails, fail_silently=True) # Reactivate previous language translation.activate(old_lang)
def campaign_submit(request, pk): if request.method != "POST": return HttpResponseNotAllowed(["POST"]) campaigns = Campaign.objects.select_related("email_template") campaign = get_object_or_404(campaigns, pk=pk) messages = [] for user in campaign: email_ctx = { "user": user, } messages.append(( campaign.email_template.render_subject(email_ctx), campaign.email_template.render_body(email_ctx), campaign.from_address, [user.email], )) send_mass_mail(messages) campaign.sent = datetime.datetime.now() campaign.save() return redirect("campaign_review", campaign.pk)
def notify_topic_subscribers(post): topic = post.topic old_lang = translation.get_language() # Define constants for templates rendering context_vars = {'delete_url': reverse('pybb:delete_subscription', args=[post.topic.id]), 'site_url': get_setting('site', 'global', 'siteurl'), 'is_new_topic': post == topic.head, 'post': post, 'post_url': reverse('pybb:post', args=[post.id]), 'forum_url': reverse('pybb:forum', args=[topic.forum.id]), } from_email = settings.DEFAULT_FROM_EMAIL mails = tuple() if post == topic.head: subject_template = 'pybb/mail_templates/moderator_email_subject.html' users = topic.forum.moderators.all() else: subject_template = 'pybb/mail_templates/subscription_email_subject.html' users = topic.subscribers.exclude(pk=post.user.pk) subject = render_to_string(subject_template, {'site_url': context_vars['site_url'], 'post': post, 'topic': topic}) # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) for user in users: message = get_email_message(user, **context_vars) if message: message = add_tendenci_footer(message, content_type="text") mails += ((subject, message, from_email, [user.email]),) # Send mails send_mass_mail(mails, fail_silently=True) # Reactivate previous language translation.activate(old_lang)
def mail_delivery(): precedents = get_popular() yesterday = timezone.now() - timezone.timedelta(days=1) # Список пользователей с предпочтениями по которым не было рассылки больше дня participants = \ Participant.objects \ .filter(user__isnull=False, user__delivery_at__lte=yesterday, user__emailaddress__verified=True) \ .select_related('user') \ .prefetch_related(Prefetch( 'precedents', queryset=Precedent.objects.all(), to_attr='precedents_cache' ))[:50] participants_list = list(participants) if len(participants_list) > 0: precedent_ids = [item['precedent_id'] for item in precedents] emails = [] users = [] template = loader.get_template('mail.txt') for item in participants_list: user_precedents = [value.precedent_id for value in item.precedents_cache] # Проверка на отсутствие у пользователя предпочтений из кэшированного списка to_send = set(precedent_ids) - set(user_precedents) users.append(item.user) if len(to_send) > 0: precedents_list = [precedents[precedent_ids.index(value)] for key, value in enumerate(to_send) if key < 3] item.user.delivery_at = timezone.now() emails.append(( _('Popular precedents'), template.render({'precedents_list': precedents_list}), settings.DEFAULT_FROM_EMAIL, [item.user.email] )) if len(emails) > 0: mailer.send_mass_mail(tuple(emails), fail_silently=False) AppUser.objects.bulk_update(users, ['delivery_at'])