mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Sending email for the first time users get a newsletter.
This commit is contained in:
parent
a64556068d
commit
7d14785ed1
4 changed files with 69 additions and 13 deletions
|
@ -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')
|
||||
|
|
BIN
media/img/reader/newsletters_folder.png
Normal file
BIN
media/img/reader/newsletters_folder.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
9
templates/mail/email_first_newsletter.txt
Normal file
9
templates/mail/email_first_newsletter.txt
Normal 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 %}
|
10
templates/mail/email_first_newsletter.xhtml
Normal file
10
templates/mail/email_first_newsletter.xhtml
Normal 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 %}
|
Loading…
Add table
Reference in a new issue