It is a index page for mlmmj, it aims at provide informations about the existing mailing lists, and provide a helper to allow subscribing/unsubscribing via a webpage.
Configuration
with nginx
Here is an example of using mlmmj-webview with nginx and fastcgi
location / {
try_files $uri @mlmmj-webview;
}
location /assets {
root /usr/local/mlmmj/www/;
}
location @mlmmj-webview {
gzip off;
include fastcgi_params;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param MLMMJ_WEBVIEW_MAILING_LISTS /usr/local/mlmmj/lists;
fastcgi_param MLMMJ_WEBVIEW_TEMPLATES /usr/local/mlmmj/www/templates;
fastcgi_param SCRIPT_FILENAME /usr/local/bin/mlmmj-webview;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $args;
fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
}
Templates
2 templates are supported:
index
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/><link rel="stylesheet" type="text/css" href="/assets/mlmmj-webview.css"/>
<title>Mailing lists</title>
</head>
<body>
<header>
<img src="/assets/logo.png"/><h1>mailing lists</h1>
</header>
<table class="table">
<tbody>
@@mw_mailinglists@@
</tbody>
</table>
<footer>
generated by<a href="@@mw_url@@">@@mw_name@@</a>
</footer>
</body>
</html>
subscription
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" type="text/css" href="/assets/mlmmj-webview.css"/>
<title>Mailing lists: subscription for @@ml_name@@</title>
</head>
<body>
<header>
<img src="/assets/logo.png"/><h1>Subscription for @@ml_name@@</h1>
</header>
<main>
<center>
<table>
<tr>
<td>Browse the archives: </td>
<td><a href="https://lists.domain.org/archives/@@ml_name@@/">here</a></td>
</tr>
<tr>
<td>Subscribe to the digest: </td>
<td><a href="mailto:@@ml_name@@+subscribe-digest@domain.org" title="Subscribe to the digest of this list">@@ml_name@@+subscribe-digest@domain.org</a></td>
</tr>
<tr>
<td>Unsubscribe to the digest: </td>
<td><a href="mailto:@@ml_name@@+unsubscribe-digest@domain.org" title="Unsubscribe to this list">@@ml_name@@+unsubscribe-digest@domain.org</a></td>
</tr>
<tr>
<td>Subscribe: </td>
<td><a href="mailto:@@ml_name@@+subscribe@domain.org" title="Subscribe to this list">@@ml_name@@+subscribe@domain.org</a></td>
</tr>
<tr>
<td>Unsubscribe: </td>
<td><a href="mailto:@@ml_name@@+unsubscribe@domain.org" title="Unsubscribe to this list">@@ml_name@@+unsubscribe@domain.org</a></td>
</tr>
<tr>
<td>Subscribe without receiving mails: </td>
<td><a href="mailto:@@ml_name@@+subscribe-nomail@domain.org" title="Subscribe to this list">@@ml_name@@+subscribe-nomail@domain.org</a></td>
</tr>
<tr>
<td>Unsubscribe without receiving mails: </td>
<td><a href="mailto:@@ml_name@@+unsubscribe-nomail@domain.org" title="Subscribe to this list">@@ml_name@@+unsubscribe-nomail@domain.org</a></td>
</tr>
</table>
</center>
<hr/>
<form action="/action" method="post">
<p>Subscribe or unsubscribe online directly:</p>
<label for="email">Your email address: </label>
<input type="text" name="email" id="email" placeholder="foo@bar.net"/><br/>
<input type="hidden" name="ml" value="@@ml_name@@"/>
<input type="Submit" name="Subscribe" value="Subscribe"/><input type="Submit" name="Unsubscribe" value="Unsubscribe"/>
</form>
</main>
<footer>
generated by <a href="@@mw_url@@">@@mw_name@@</a>
</footer>
</body>
</html>
How subscription works
The (un)subscription will write to a temporary file in /var/spool/mlmmj-webview/{subscribe,unsubscribe}
It expects a script to on regular basis have a look at this location on regular basis (for example via crontab.
here is an example of this script:
#!/bin/sh
set -eu
tmpdir=/usr/local/mlmmj/tmp/
mls=/usr/local/mlmmj/lists
tml=$(mktemp -d ${tmpdir}/subscribe.XXXXX)
for f in $(find /var/spool/mlmmj-webview/subscribe -type f); do
ml=$(head -1 $f)
email=$(tail -1 $f | tr -d '[:space:]')
testemail=$(tail -1 $f | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')
rm -f $f
case $testemail in
*@domain.org)
awk -v mail="${testemail%@domain.org}" 'BEGIN { found=1 } $1 == mail { found=0; exit } END { exit found }' /usr/local/mlmmj/virtual && continue
;;
esac
if [ -d ${mls}/${ml} ]; then
echo $email >> ${tml}/${ml}
fi
done
for f in $(find ${tml} -type f); do
for m in $(sort -u ${f}); do
/usr/local/bin/mlmmj-sub -L ${mls}/${f##*/} -a $m -C
done
done
rm -rf "${tml}"
tml=$(mktemp -d ${tmpdir}/unsubscribe.XXXXX)
for f in $(find /var/spool/mlmmj-webview/unsubscribe -type f); do
ml=$(head -1 $f)
email=$(tail -1 $f | tr -d '[:space:]')
testemail=$(tail -1 $f | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')
rm -f $f
case $testemail in
*@domain.org)
awk -v mail="${testemail%@domain.org}" 'BEGIN { found=1 } $1 == mail { found=0; exit } END { exit found }' /usr/local/mlmmj/virtual && continue
;;
esac
if [ -d ${mls}/${ml} ]; then
echo $email >> ${tml}/${ml}
fi
done
for f in $(find ${tml} -type f); do
for m in $(sort -u ${f}); do
/usr/local/bin/mlmmj-unsub -L ${mls}/${f##*/} -a $m -C
done
done
rm -rf "${tml}"
a crontab configuration could be for example added in /usr/local/etc/cron.d/mlmmj-webview
@120 mlmmj /usr/local/mlmmj/bin/mlsubscriptions.sh