Sending email for the first time users get a newsletter.

This commit is contained in:
Samuel Clay 2016-05-12 19:50:43 -07:00
parent a64556068d
commit 7d14785ed1
4 changed files with 69 additions and 13 deletions

View file

@ -5,12 +5,14 @@ from cgi import escape
from django.db import models
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.core.mail import EmailMultiAlternatives
from django.core.urlresolvers import reverse
from django.conf import settings
from django.template.loader import render_to_string
from django.utils.html import linebreaks
from apps.rss_feeds.models import Feed, MStory, MFetchHistory
from apps.reader.models import UserSubscription, UserSubscriptionFolders
from apps.profile.models import Profile
from apps.profile.models import Profile, MSentEmail
from utils import log as logging
from utils.story_functions import linkify
from utils.scrubber import Scrubber
@ -18,12 +20,12 @@ from utils.scrubber import Scrubber
class EmailNewsletter:
def receive_newsletter(self, params):
user = self.user_from_email(params['recipient'])
user = self._user_from_email(params['recipient'])
if not user:
return
sender_name, sender_username, sender_domain = self.split_sender(params['from'])
feed_address = self.feed_address(user, "%s@%s" % (sender_username, sender_domain))
sender_name, sender_username, sender_domain = self._split_sender(params['from'])
feed_address = self._feed_address(user, "%s@%s" % (sender_username, sender_domain))
usf = UserSubscriptionFolders.objects.get(user=user)
usf.add_folder('', 'Newsletters')
@ -40,6 +42,7 @@ class EmailNewsletter:
logging.user(user, "~FCCreating newsletter feed: ~SB%s" % (feed))
r = redis.Redis(connection_pool=settings.REDIS_PUBSUB_POOL)
r.publish(user.username, 'reload:%s' % feed.pk)
self._check_if_first_newsletter(user)
if feed.feed_title != sender_name:
feed.feed_title = sender_name
@ -55,8 +58,8 @@ class EmailNewsletter:
)
story_hash = MStory.ensure_story_hash(params['signature'], feed.pk)
story_content = self.get_content(params)
story_content = self.clean_content(story_content)
story_content = self._get_content(params)
story_content = self._clean_content(story_content)
story_params = {
"story_feed_id": feed.pk,
"story_date": datetime.datetime.fromtimestamp(int(params['timestamp'])),
@ -78,14 +81,48 @@ class EmailNewsletter:
usersub.needs_unread_recalc = True
usersub.save()
self.publish_to_subscribers(feed)
self._publish_to_subscribers(feed)
MFetchHistory.add(feed_id=feed.pk, fetch_type='push')
logging.user(user, "~FCNewsletter feed story: ~SB%s~SN / ~SB%s" % (story.story_title, feed))
return story
def _check_if_first_newsletter(self, user, force=False):
if not user.email:
return
subs = UserSubscription.objects.filter(user=user)
found_newsletter = False
for sub in subs:
if sub.feed.is_newsletter:
found_newsletter = True
break
if not found_newsletter and not force:
return
def user_from_email(self, email):
params = dict(receiver_user_id=user.pk, email_type='first_newsletter')
try:
sent_email = MSentEmail.objects.get(**params)
if not force:
# Return if email already sent
return
except MSentEmail.DoesNotExist:
sent_email = MSentEmail.objects.create(**params)
text = render_to_string('mail/email_first_newsletter.txt', {})
html = render_to_string('mail/email_first_newsletter.xhtml', {})
subject = "Your email newsletters are now being sent to NewsBlur"
msg = EmailMultiAlternatives(subject, text,
from_email='NewsBlur <%s>' % settings.HELLO_EMAIL,
to=['%s <%s>' % (user, user.email)])
msg.attach_alternative(html, "text/html")
msg.send(fail_silently=True)
logging.user(user, "~BB~FM~SBSending first newsletter email to: %s" % user.email)
def _user_from_email(self, email):
tokens = re.search('(\w+)\+(\w+)@newsletters.newsblur.com', email)
if not tokens:
return
@ -101,10 +138,10 @@ class EmailNewsletter:
return profile.user
def feed_address(self, user, sender):
def _feed_address(self, user, sender):
return 'newsletter:%s:%s' % (user.pk, sender)
def split_sender(self, sender):
def _split_sender(self, sender):
tokens = re.search('(.*?) <(.*?)@(.*?)>', sender)
if not tokens:
@ -116,7 +153,7 @@ class EmailNewsletter:
return sender_name, sender_username, sender_domain
def get_content(self, params):
def _get_content(self, params):
if 'body-html' in params:
return params['body-html']
if 'stripped-html' in params:
@ -124,13 +161,13 @@ class EmailNewsletter:
if 'body-plain' in params:
return linkify(linebreaks(params['body-plain']))
def clean_content(self, content):
def _clean_content(self, content):
scrubber = Scrubber()
content = scrubber.scrub(content)
content = content.replace('!important', '')
return content
def publish_to_subscribers(self, feed):
def _publish_to_subscribers(self, feed):
try:
r = redis.Redis(connection_pool=settings.REDIS_PUBSUB_POOL)
listeners_count = r.publish(str(feed.pk), 'story:new')

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View file

@ -0,0 +1,9 @@
{% extends "mail/email_base.txt" %}
{% block body %}Your email newsletters are now being sent to NewsBlur
You have just received your first email newsletter in NewsBlur. You can find your newsletters under the Newsletters folder.
Feel free to rename newsletters to better fit their name. Sometimes newsletters come in as names when they should be the name of the organization. Easy to change!
You can also move and delete newsletters just as if they were independent feeds. Training evne works on newsletters, so you can hide the newsletters you don't want to read while highlighting the ones you do.{% endblock body %}

View file

@ -0,0 +1,10 @@
{% extends "mail/email_base.xhtml" %}
{% load utils_tags %}
{% block body %}
<p style="font-size: 24px; color:#555555; margin-top: 18px;margin-bottom: 10px;padding-top:6px;">Your email newsletters are now being sent to NewsBlur</p>
<img src="http://{% current_domain %}/media/img/reader/newsletters_folder.png" style="width:239px;height:407px;border:1px solid #E0E0E0;margin: 0 24px 24px 0;float: left;" alt="">
<p style="line-height: 20px;">You have just received your first email newsletter in NewsBlur. You can find your newsletters under the <b>Newsletters</b> folder.</p>
<p style="line-height: 20px;">Feel free to rename newsletters to better fit their name. Sometimes newsletters come in as names when they should be the name of the organization. Easy to change!</p>
<p style="line-height: 20px;">You can also move and delete newsletters just as if they were independent feeds. Training evne works on newsletters, so you can hide the newsletters you don't want to read while highlighting the ones you do.</p>
{% endblock %}