v1.5
|
@ -1,5 +1,10 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 1.5.0 2016-05-05
|
||||||
|
|
||||||
|
* Fixed a bug in unsubscribing through the admin interface
|
||||||
|
* Added individual link click stats
|
||||||
|
|
||||||
## 1.4.1 2016-05-04
|
## 1.4.1 2016-05-04
|
||||||
|
|
||||||
* Added support for RSS templates
|
* Added support for RSS templates
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "mailtrain",
|
"name": "mailtrain",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.4.1",
|
"version": "1.5.0",
|
||||||
"description": "Self hosted email newsletter app",
|
"description": "Self hosted email newsletter app",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
BIN
public/images/img01.png
Normal file
After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 71 KiB |
BIN
public/images/img02.png
Normal file
After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 107 KiB |
BIN
public/images/img03.png
Normal file
After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 88 KiB |
BIN
public/images/img04.png
Normal file
After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 82 KiB |
BIN
public/images/img05.png
Normal file
After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 50 KiB |
BIN
public/images/img06.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
public/images/img07.png
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
public/images/img08.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
public/images/img09.png
Normal file
After Width: | Height: | Size: 101 KiB |
|
@ -378,7 +378,7 @@ router.post('/subscription/unsubscribe', passport.parseForm, passport.csrfProtec
|
||||||
return res.redirect('/lists/view/' + list.id);
|
return res.redirect('/lists/view/' + list.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
subscriptions.unsubscribe(list.id, subscription.email, err => {
|
subscriptions.unsubscribe(list.id, subscription.email, false, err => {
|
||||||
if (err) {
|
if (err) {
|
||||||
req.flash('danger', err && err.message || err || 'Could not unsubscribe user');
|
req.flash('danger', err && err.message || err || 'Could not unsubscribe user');
|
||||||
return res.redirect('/lists/subscription/' + list.id + '/edit/' + subscription.cid);
|
return res.redirect('/lists/subscription/' + list.id + '/edit/' + subscription.cid);
|
||||||
|
|
|
@ -139,8 +139,7 @@ function checkEntries(parent, entries, callback) {
|
||||||
from: parent.from,
|
from: parent.from,
|
||||||
address: parent.address,
|
address: parent.address,
|
||||||
subject: entry.title || parent.subject,
|
subject: entry.title || parent.subject,
|
||||||
list: parent.list,
|
list: parent.segment ? parent.list + ':' + parent.segment : parent.list,
|
||||||
segment: parent.segment,
|
|
||||||
html
|
html
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,21 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h2>RSS Campaigns</h2>
|
||||||
|
<p>Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed then Mailtrain auto-generates a new campaign using entry data as message contents and sends it to selected subscribers.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h2>GPG Encryption</h2>
|
||||||
|
<p>If a list includes a custom field for a GPG Public Key then subscribers can upload their GPG public keys when signing up or managing preferences. Subscriber that have a key set get all messages from the list in an encrypted form.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h2>Click stats</h2>
|
||||||
|
<p>After a campaign is sent, check individual click statistics for every link included in the message.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<h2>Open source</h2>
|
<h2>Open source</h2>
|
||||||
|
@ -66,19 +81,31 @@
|
||||||
<!-- Wrapper for slides -->
|
<!-- Wrapper for slides -->
|
||||||
<div class="carousel-inner" role="listbox">
|
<div class="carousel-inner" role="listbox">
|
||||||
<div class="item active">
|
<div class="item active">
|
||||||
<img src="/images/img01_lists.png" alt="Lists">
|
<img src="/images/img01.png">
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<img src="/images/img02_list.png" alt="List">
|
<img src="/images/img02.png">
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<img src="/images/img03_fields.png" alt="Custom fields">
|
<img src="/images/img03.png">
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<img src="/images/img04_segment.png" alt="List segments">
|
<img src="/images/img04.png">
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<img src="/images/img05_subscribe.png" alt="List segments">
|
<img src="/images/img05.png">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="/images/img06.png">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="/images/img07.png">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="/images/img08.png">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="/images/img09.png">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|