src/web/handlers_mirrors.py \
src/web/handlers_nopaste.py \
src/web/location.py \
+ src/web/newsletter.py \
src/web/people.py \
src/web/ui_modules.py
templates_modulesdir = $(templatesdir)/modules
+templates_newsletter_DATA = \
+ src/templates/newsletter/subscribed.html
+
+templates_newsletterdir = $(templatesdir)/newsletter
+
templates_people_DATA = \
src/templates/people/base.html \
src/templates/people/calls.html \
<div class="col-12 col-lg-4 mb-4">
<h6>{{ _("Subscribe to our Newsletter") }}</h6>
- <form method="POST" action="/subscribe">
+ <form method="POST" action="https://{{ "dev" if debug else "www" }}.ipfire.org/newsletter/subscribe">
{% raw xsrf_form_html() %}
<label class="sr-only" for="email">{{ _("Email Address") }}</label>
- <input type="text" class="form-control mb-2 mr-sm-2" id="email"
+ <input type="email" class="form-control mb-2 mr-sm-2" id="email" name="email"
placeholder="{{ _("Your Email Address") }}">
<button type="submit" class="btn btn-primary btn-block mb-2">{{ _("Subscribe") }}</button>
--- /dev/null
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Successfully subscribed") }}{% end block %}
+
+{% block content %}
+ <div class="row justify-content-center my-5">
+ <div class="col-12 col-md-6">
+ <div class="card bg-success text-white p-md-5">
+ <div class="card-body text-center">
+ <span class="fas fa-check fa-5x my-4"></span>
+
+ <p class="lead">
+ {{ _("You have been successfully subscribed to our newsletter") }}
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+{% end block %}
from . import blog
from . import download
from . import location
+from . import newsletter
from . import people
from . import ui_modules
(r"/donate", DonateHandler),
(r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
+ # Newsletter
+ (r"/newsletter/subscribe", newsletter.SubscribeHandler),
+
# RSS feed
(r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
now = datetime.date.today()
ns.update({
+ "debug" : self.application.settings.get("debug", False),
"format_size" : util.format_size,
"format_time" : util.format_time,
"hostname" : self.hostname,
--- /dev/null
+#!/usr/bin/python3
+
+import email.mime.text
+import logging
+import tornado.gen
+import tornado.process
+
+from . import handlers_base as base
+
+class SubscribeHandler(base.BaseHandler):
+ @tornado.gen.coroutine
+ def post(self):
+ address = self.get_argument("email")
+
+ # Create an email with us as sender
+ m = email.mime.text.MIMEText("")
+ m.add_header("To", "ipfire-announce-join@lists.ipfire.org")
+ m.add_header("From", address)
+ m.add_header("Sender", "no-reply@ipfire.org")
+ m.add_header("Subject", "Subscribe")
+
+ logging.debug("Sending email:\n%s" % m.as_string())
+
+ # Call sendmail
+ p = tornado.process.Subprocess(["sendmail", "-t"],
+ stdin=tornado.process.Subprocess.STREAM)
+
+ # Pipe the email into sendmail
+ yield tornado.gen.Task(p.stdin.write, m.as_bytes())
+
+ # Close standard input
+ p.stdin.close()
+
+ # Wait until sendmail is done
+ ret = yield p.wait_for_exit()
+
+ logging.info("%s has subscribed to the newsletter" % address)
+
+ self.render("newsletter/subscribed.html", address=address)