aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2014-06-25 23:03:14 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2014-06-25 23:03:14 +0300
commitf2a9e11edb99a192ecd57c896b19fc186e867382 (patch)
treef0657b6246fa2eba6a57d9148fbfc3fb201dbcb7
downloadmailman-f2a9e11edb99a192ecd57c896b19fc186e867382.tar.gz
mailman-f2a9e11edb99a192ecd57c896b19fc186e867382.tar.bz2
Initial (hmmm) commit.
Most sources are more than 10 years old and have (of course) undergone plenty of changes during that time. However, that's the first time they are put under a version control system. Better late than never.
-rwxr-xr-xbin/foreachmail305
-rwxr-xr-xbin/mailsync36
-rwxr-xr-xbin/mboxtohtml64
-rw-r--r--htdocs/mail.css123
-rw-r--r--htdocs/mail.html12
-rw-r--r--htdocs/mail.html.en154
-rw-r--r--htdocs/mail.html.pl154
-rw-r--r--htdocs/mail.html.uk154
-rw-r--r--htdocs/maillist.css145
-rw-r--r--httpconf/mail.conf72
10 files changed, 1219 insertions, 0 deletions
diff --git a/bin/foreachmail b/bin/foreachmail
new file mode 100755
index 0000000..51ab3f6
--- /dev/null
+++ b/bin/foreachmail
@@ -0,0 +1,305 @@
+#! /usr/bin/guile -s
+# Emacs, its -*- scheme -*-
+!#
+;;;; Copyright (C) 2010 Sergey Poznyakoff
+;;;;
+;;;; This program is free software; you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation; either version 3, or (at your option)
+;;;; any later version.
+;;;;
+;;;; This program is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+(set! %load-path (cons "/usr/local/share/guile/site" %load-path))
+(use-modules (ice-9 regex)
+ (ice-9 getopt-long)
+ (ice-9 rdelim)
+ (ice-9 popen)
+ (ice-9 format)
+ (srfi srfi-1)
+ (mailutils mailutils))
+
+(define version-string "1.0")
+
+(define EX_OK 0)
+(define EX_USAGE 64)
+(define EX_DATAERR 65)
+(define EX_NOINPUT 66)
+(define EX_NOUSER 67)
+(define EX_NOHOST 68)
+(define EX_UNAVAILABLE 69)
+(define EX_SOFTWARE 70)
+(define EX_OSERR 71)
+(define EX_OSFILE 72)
+(define EX_CANTCREAT 73)
+(define EX_IOERR 74)
+(define EX_TEMPFAIL 75)
+(define EX_PROTOCOL 76)
+(define EX_NOPERM 77)
+(define EX_CONFIG 78)
+
+(define result EX_OK)
+
+(define tmpname "/tmp/gXXXXXX")
+(define program-name (car (command-line)))
+(define dry-run-mode #f)
+(define verbose #f)
+(define log-file-name #f)
+(define command-pattern #f)
+(define input-file #f)
+(define state-file #f)
+
+(define (berror . args)
+ (with-output-to-port
+ (current-error-port)
+ (lambda ()
+ (display program-name)
+ (display ": ")
+ (for-each display args)
+ (newline))))
+
+(define (make-mailbox)
+ (let ((old-mask (umask #o077)))
+ (let ((tmpfile (mkstemp! tmpname)))
+ (with-output-to-port
+ tmpfile
+ (lambda ()
+ (do ((ln (read-line) (read-line)))
+ ((eof-object? ln))
+ (display ln)
+ (newline))))
+ (close-output-port tmpfile))
+ (umask old-mask)))
+
+
+(define (cleanup)
+ (for-each
+ (lambda (file)
+ (catch #t
+ (lambda ()
+ (delete-file file))
+ (lambda args #f)))
+ (list tmpname)))
+
+(define (string-balanced-paren-index str opar cpar ind)
+ (let ((leng (string-length str)))
+ (let loop ((count 1)
+ (ind ind))
+; (format #t "IN:~A~%" ind)
+ (cond
+ ((= count 0)
+ ind)
+ ((= ind leng)
+ #f)
+ ((string-index str (lambda (c)
+ (or (char=? c opar) (char=? c cpar)))
+ ind)
+ => (lambda (n)
+; (format #t "RS:~A ~A~%" n (string-ref str n))
+ (loop
+ (if (char=? (string-ref str n) opar)
+ (1+ count)
+ (1- count))
+ (+ n 1))))
+ (else
+ #f)))))
+
+(define (tokenize str)
+ (let loop ((fields '())
+ (str str))
+ (cond
+ ((string-index str #\$)
+ => (lambda (w)
+ (let ((p (case (string-ref str (1+ w))
+ ((#\$)
+ (cons (cons 'string "$") (+ w 2)))
+ ((#\{)
+ (let ((n (string-index str #\} (+ w 2))))
+ (cond
+ (n
+ (cons (cons 'var (substring str (+ w 2) n))
+ (+ n 1)))
+ (else
+ (cons (cons 'string "${") (+ w 2))))))
+ ((#\()
+ (let ((n (string-balanced-paren-index str
+ #\( #\) (+ w 2))))
+ (cond
+ (n
+ (cons ;(cons 'eval (substring str (+ w 1) n))
+ (cons 'eval (tokenize (substring str (+ w 1) n)))
+ n))
+ (else
+ (cons (cons 'string "$(") (+ w 2))))))
+ (else
+ (cons (cons 'string "$") (+ w 1))))))
+ (loop
+ (append fields
+ (if (= 0 w)
+ (list (car p))
+ (list (cons 'string (substring str 0 w)) (car p))))
+ (substring str (cdr p))))))
+ ((string-null? str)
+ fields)
+ (else
+ (append fields (list (cons 'string str)))))))
+
+(define message #f)
+
+(define (expand-pattern pattern msg)
+ (set! message msg)
+ (let loop ((output '())
+ (pattern pattern))
+ (if (null? pattern)
+ (string-join (reverse output) "")
+ (let ((instr (car pattern)))
+ (loop
+ (cons
+ (case (car instr)
+ ((string)
+ (cdr instr))
+ ((var)
+ (let ((value (mu-message-get-header msg (cdr instr))))
+ (or value "")))
+ ((eval)
+; (let ((value (with-output-to-string
+; (lambda ()
+; (eval-string
+; (expand-pattern (cdr instr) msg))))))
+ (let ((value (eval-string (expand-pattern (cdr instr) msg))))
+ (if value
+ (if (not (string? value))
+ (format #f "~A" value)
+ value)
+ ""))))
+ output)
+ (cdr pattern))))))
+
+(define (pipemsg cmd msg)
+ (let ((port (open-output-pipe cmd)))
+ (with-output-to-port
+ port
+ (lambda ()
+ (display "From ")
+ (display (mu-message-get-envelope msg))
+ (newline)
+ (with-input-from-port
+ (mu-message-get-port msg "r" #t)
+ (lambda ()
+ (do ((line (read-line) (read-line)))
+ ((eof-object? line))
+ (display line)
+ (newline))))))
+ (close-pipe port)))
+
+(define (save-state count)
+ (if state-file
+ (with-output-to-file
+ state-file
+ (lambda ()
+ (display count)
+ (newline)))))
+
+(define (read-state)
+ (if (and state-file (file-exists? state-file))
+ (with-input-from-file
+ state-file
+ (lambda ()
+ (string->number (read-line))))
+ 0))
+
+(define (make-url mbox)
+ (if (or (string-prefix? "file:" mbox)
+ (string-prefix? "mbox:" mbox)
+ (string-prefix? "local:" mbox)
+ (let ((n (string-index mbox #\:)))
+ (and n (string=? (substring mbox n (+ n 3)) "://"))))
+ mbox
+ (string-append "file:" mbox)))
+
+(define (display-version)
+ (display "foreachmail version ")
+ (display version-string)
+ (display ", with Mailutils version ")
+ (display mu-version)
+ (newline)
+ (exit EX_OK))
+
+(define (display-usage)
+ (display "foreachmail [OPTION] COMMAND\n")
+ (display "Execute COMMAND for each message in the input mailbox\n")
+ (display "Options are:\n")
+ (display " -v, --verbose verbose mode\n")
+ (display " -n, --dry-run do nothing, print what would have been done\n")
+ (display " -f, --file MBOX read mail from MBOX\n")
+ (display " --state-file FILE keep state info in FILE\n")
+ ;; FIXME: options?
+ (newline)
+ (display "Informative options:\n")
+ (display " --version Display program version and quit\n")
+ (display " --help Display this help message\n")
+ (exit EX_OK))
+
+(define grammar
+ `((help (single-char #\h))
+; (log-file (value #t))
+ (file (single-char #\f) (value #t))
+ (state-file (value #t))
+ (dry-run (single-char #\n))
+ (verbose (single-char #\v))
+ (version)
+ (verbose (single-char #\v))))
+
+(for-each
+ (lambda (x)
+ (cond
+ ((pair? x)
+ (case (car x)
+ ((log-file)
+ (set! log-file-name (cdr x)))
+ ((file)
+ (set! input-file (cdr x)))
+ ((state-file)
+ (set! state-file (cdr x)))
+ ((verbose)
+ (set! verbose #t))
+ ((dry-run)
+ (set! verbose #t)
+ (set! dry-run-mode #t))
+ ((version)
+ (display-version))
+ ((help)
+ (display-usage))
+ ('()
+ (set! command-pattern (tokenize (string-join (cdr x)))))))))
+ (getopt-long (command-line) grammar))
+
+(if (not input-file)
+ (make-mailbox))
+(let ((mbox (mu-mailbox-open
+ (string-append "file:" (or input-file tmpname)) "r")))
+ (let ((start (read-state))
+ (count (mu-mailbox-messages-count mbox)))
+ (do ((i (1+ start) (1+ i)))
+ ((> i count))
+ (let ((msg (mu-mailbox-get-message mbox i)))
+ (let ((cmd (expand-pattern command-pattern msg)))
+ (if verbose
+ (format (current-error-port) "~A: ~A~%"
+ i cmd))
+ (if (not dry-run-mode)
+ (pipemsg cmd msg)))))
+ (if (not dry-run-mode)
+ (save-state count))))
+
+
+(cleanup)
+
+
+
diff --git a/bin/mailsync b/bin/mailsync
new file mode 100755
index 0000000..0187c62
--- /dev/null
+++ b/bin/mailsync
@@ -0,0 +1,36 @@
+#! /bin/sh
+
+PATH=/srv/mailman/bin:$PATH
+
+listfile=/etc/mail/mailman/SAVANE
+indexrootdir=/srv/mailman/var/namazu/index
+archiverootdir=/srv/mailman/var/archives/html
+mboxrootdir=/srv/mailman/var/archives
+
+awk '
+/^[ ]*#/ { next }
+NF==0 { next }
+$1 != "mailman" { print NR,$1 }
+' $listfile |
+while read line name
+do
+ if [ ! -d $mboxrootdir/private/$name ]; then
+ echo >&2 "$listfile:$line no such mailing list: $name"
+ continue
+ fi
+
+ if [ ! -f $mboxrootdir/private/$name.mbox/$name.mbox ]; then
+ echo >&1 "Skipping empty list $name"
+ continue
+ fi
+
+ outputdir=$indexrootdir/$name
+
+ echo "Converting $name"
+ mboxtohtml $name
+
+ test -d $outputdir || mkdir $outputdir
+ inputdir=$archiverootdir/$name
+ echo "Indexing $inputdir"
+ mknmz -O $outputdir --allow='msg[0-9][0-9]*\.html' $inputdir
+done
diff --git a/bin/mboxtohtml b/bin/mboxtohtml
new file mode 100755
index 0000000..a470815
--- /dev/null
+++ b/bin/mboxtohtml
@@ -0,0 +1,64 @@
+#! /bin/sh
+
+PATH=/srv/mailman/bin:/usr/local/bin:$PATH
+mboxrootdir=/srv/mailman/var/archives/private
+htmlroot=/srv/mailman/var/archives/html
+base_url=http://mail.gnu.org.ua/mailman/listarchive
+opts=
+
+while [ $# -ne 0 ]
+do
+ case $1 in
+ -v|--verbose|-n|--dry-run)
+ opts="$opts $1"
+ shift;;
+ -h|--help)
+ echo "usage: $0 [-nv][--verbose][--dry-run] listid"
+ exit 0;;
+ -*)
+ echo >&2 "$0: unknown option"
+ exit 1;;
+ --)
+ break;;
+ *)
+ break;;
+ esac
+done
+
+if [ $# -ne 1 ]; then
+ echo >&2 "usage: $0 [-nv][--verbose][--dry-run] listid"
+ exit 1
+fi
+
+listid=$1
+shift
+
+if [ $# -gt 0 ]; then
+ echo >&2 "$0: too many arguments"
+ exit 1
+fi
+
+mbox=$mboxrootdir/$listid.mbox/$listid.mbox
+
+foreachmail $opts \
+ --state-file $htmlroot/$audience/$listid/.state \
+ --file $mbox -- \
+ 'listid='$listid';
+ topdir='$htmlroot';
+ timestamp="$(car (mktime (mu-message-get-envelope-date message)))";
+ period="$(strftime "%Y-%m" (mu-message-get-envelope-date message))";
+ periodh="$(strftime "%B, %Y" (mu-message-get-envelope-date message))";
+ dirname="$$topdir/$$listid/$$period";
+ test -d $$dirname || mkdir -m 02775 $$dirname ;
+ echo "$$timestamp" > $$topdir/$$listid/.timestamp;
+ mhonarc \
+ -add \
+ -rcfile /srv/mailman/etc/main.mrc \
+ -outdir "$$dirname" \
+ -definevar "gray_period=$$period" \
+ -definevar "gray_period_pretty=\"$$periodh\"" \
+ -definevar "gray_base_url='$base_url'" \
+ -definevar "gray_listname=$$listid"'
+
+# -definevar gray_listname=bug-dico' < /var/mailman/archives/private/bug-dico.mbox/bug-dico.mbox
+
diff --git a/htdocs/mail.css b/htdocs/mail.css
new file mode 100644
index 0000000..527fad8
--- /dev/null
+++ b/htdocs/mail.css
@@ -0,0 +1,123 @@
+body, table, form {
+ padding: 0em;
+ margin: 0;
+}
+
+body {
+ font-family: serif;
+ font-size: 120%;
+ color: #333;
+ background: white;
+ padding: 4px;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+h1 {
+ text-align: center;
+ padding: 0px;
+}
+
+div#main {
+ clear: both;
+}
+
+/* Main menu (tabs) */
+
+ul.nav {
+ list-style-type: none;
+ border-bottom: solid 2px black;
+ margin: 0;
+ display: block;
+ clear: both;
+}
+
+li.navtopitem a {
+ color: black;
+ text-decoration: none;
+ padding-left: 0.75em;
+ padding-right: 0.75em;
+}
+
+ul.nav li a:hover {
+ background-color: black;
+ color: white;
+}
+
+li.navtopitem {
+ display: inline;
+ margin-left: 5%;
+ position: relative;
+ line-height: 110%;
+}
+
+span.navtoptitle {
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+li.navtopitem:hover {
+ background-color: black;
+ color: white;
+}
+
+li.navtopitem:hover > ul {
+ visibility: visible;
+}
+
+li.translations {
+ margin-left: 20%;
+/* float: right;*/
+}
+
+li.translations ul.navsubmenu {
+ left: auto;
+ right: 0;
+}
+
+ul.navsubmenu {
+ z-index: 100; /* big z-index to be always on top */
+ display: block;
+ visibility: hidden;
+ text-align: left;
+ position: absolute;
+ top: 100%;
+ left: -0.75em;
+ min-width: 13em;
+ border: 2px solid black;
+ /*border-top: 2px solid white;*/
+ padding: 0;
+ background-color: white;
+}
+
+ul.navsubmenu li {
+ margin: 2px;
+}
+
+ul.navsubmenu li a {
+ margin: 0;
+ display: block;
+ line-height: normal;
+ text-decoration: none;
+}
+
+/* -- */
+#footer {
+ border-top: 2px solid black;
+ font-size: small;
+ padding-top: 10px;
+ margin-top: 1em;
+}
+
+address {
+ display: inline;
+}
+
+span.hint {
+ float: right;
+}
+
+/* -- */
+span.host {
+ font-weight: bold;
+}
diff --git a/htdocs/mail.html b/htdocs/mail.html
new file mode 100644
index 0000000..1115855
--- /dev/null
+++ b/htdocs/mail.html
@@ -0,0 +1,12 @@
+URI: mail.html.pl
+Content-language: pl
+Content-type: text/html; charset=UTF-8
+
+URI: mail.html.uk
+Content-language: uk
+Content-type: text/html; charset=UTF-8
+
+URI: mail.html.en
+Content-language: en
+Content-type: text/html; charset=UTF-8
+
diff --git a/htdocs/mail.html.en b/htdocs/mail.html.en
new file mode 100644
index 0000000..1846443
--- /dev/null
+++ b/htdocs/mail.html.en
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>mail.gnu.org.ua</title>
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <link rel="stylesheet" type="text/css" href="/mail.css" />
+ <link rev="made" href="mailto:gray@gnu.org.ua" />
+</head>
+
+
+<body>
+
+<h1>Welcome to <span class="host">mail.gnu.org.ua</span></h1>
+
+<ul class="nav">
+ <li class="navtopitem"><span class="navtoptitle">Mailing lists</span>
+ <ul class="navsubmenu" id="submenu1">
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listinfo/">List
+ Directory</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/admin/">Administration</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listarchive/">Archives</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">GNU</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://puszcza.gnu.org.ua">Puszcza</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://www.gnu.org.ua">GNU in Ukraine</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://ftp.gnu.org.ua">GNU FTP</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">Other Links</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://gray.gnu.org.ua">Administrator</a>
+ </li>
+ <li class="navsubitem">
+ <a href="https://mail.gnu.org.ua/user/">Post office</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://validator.w3.org/check/referer">Valid XHTML 1.0</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem translations"><span class="navtoptitle">Translations</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="pl/mail.html">Polski</a>
+ </li>
+ <li class="navsubitem">
+ <a href="uk/mail.html">Українська</a>
+ </li>
+ </ul>
+ </li>
+
+</ul>
+
+<div id="main">
+ <h2>What is <span class="host">mail.gnu.org.ua?</span></h2>
+
+ <p>
+ <span class="host">mail.gnu.org.ua</span> serves as the central
+ site for mailing lists used
+ by <a href="http://puszcza.gnu.org.ua">Puszcza.gnu.org.ua</a> and
+ various projects registered there. The mailing lists are a good
+ place to get help with problems you are having, report bugs in
+ software, or make comments or suggestions.</p>
+
+ <h2>Subscription and list management</h2>
+
+ <p>
+ In order to receive messages from a mailing list you must
+ subscribe to it. Additionally, many lists either require that
+ you be subscribed in order to send messages to the list, or that
+ your message must be approved by a moderator if you are not
+ subscribed. We provide
+ a <a href="http://mail.gnu.org.ua/mailman/listinfo/">
+ catalog</a> of the various mailing lists, where for each list you
+ will find its detailed description along with a link to a page
+ where you can subscribe to it.
+ </p>
+
+ <p>
+ If you are already subscribed to a list, you can use these pages
+ to change your preferences for a list. For instance, if you are
+ subscribed you can use the page to change your subscription so
+ that you receive a digest of the day's e-mails, instead of
+ receiving each one individually.
+ </p>
+
+ <p>
+ If you are a project administrator and you wish to create
+ a mailing list for your project, go to the
+ <a href="http://puszcza.gnu.org.ua">administrator interface</a>
+ of your project, select "<i>Mailing Lists</i>" in the
+ "<i>Administration</i>" bar and follow the instructions found there.
+ If none of the proposed list names suits you, write to the
+ <a href="mailto:savannah-hackers@gnu.org.ua">system administrators</a>
+ and ask them to create the list for you.
+ </p>
+
+ <p>
+ Project administrators can
+ <a href="http://mail.gnu.org.ua/mailman/admin/">manage</a> their
+ mailing lists.
+ </p>
+
+ <h2>Mailing list archives</h2>
+
+ <p>
+ This server also keeps <a href="http://mail.gnu.org.ua/pipermail/">
+ list archives</a>. You can search them for particular threads, or you can
+ browse by thread or date.
+ </p>
+</div> <!-- main -->
+
+<div id="footer">
+<address>Copyright &copy; 2010 Sergey Poznyakoff</address>.
+<p>
+Verbatim copying and distribution of this entire article is
+permitted worldwide without royalty in any medium provided
+this notice is preserved.
+</p>
+<p>
+ Report mail-related problems and send sugestions
+ to <a href="mailto:postmaster@gnu.org.ua">List
+ Administrator</a>.
+</p>
+<p>
+ Report broken links and other corrections (or suggestions) to
+<a href="mailto:webmasters@gnu.org.ua"><em>webmasters</em></a>.
+</p>
+</div>
+
+
+</body>
+</html>
diff --git a/htdocs/mail.html.pl b/htdocs/mail.html.pl
new file mode 100644
index 0000000..38ea5ba
--- /dev/null
+++ b/htdocs/mail.html.pl
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>mail.gnu.org.ua</title>
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <link rel="stylesheet" type="text/css" href="/mail.css" />
+ <link rev="made" href="mailto:gray@gnu.org.ua" />
+</head>
+
+
+<body>
+
+<h1>Witaj w <span class="host">mail.gnu.org.ua</span></h1>
+
+<ul class="nav">
+ <li class="navtopitem"><span class="navtoptitle">Listy wysyłkowe</span>
+ <ul class="navsubmenu" id="submenu1">
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listinfo/">Katalog</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/admin/">Zarządzanie</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listarchive/">Archiwa</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">GNU</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://puszcza.gnu.org.ua">Puszcza</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://www.gnu.org.ua">GNU na Ukrainie</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://ftp.gnu.org.ua">GNU FTP</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">Inne odsyłacze</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://gray.gnu.org.ua">Administrator</a>
+ </li>
+ <li class="navsubitem">
+ <a href="https://mail.gnu.org.ua/user/">Poczta użytkownika</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://validator.w3.org/check/referer">Sprawdz XHTML 1.0</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem translations"><span class="navtoptitle">Tłumaczenia</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="en/mail.html">English</a>
+ </li>
+ <li class="navsubitem">
+ <a href="uk/mail.html">Українська</a>
+ </li>
+ </ul>
+ </li>
+</ul>
+
+<div id="main">
+ <h2>Co to jest <span class="host">mail.gnu.org.ua?</span></h2>
+
+ <p>
+ Serwer <span class="host">mail.gnu.org.ua</span> jest centrum
+ obsługi list, których używa system
+ <a href="http://puszcza.gnu.org.ua">Puszcza.gnu.org.ua</a>
+ oraz różne projekty tam zamieszczone. Listy wysyłkowe są
+ wspaniałym sposobem uzyskania pomocy technicznej, zgłoszenia
+ błędów oprogramowania oraz zamieszczenia swoich komentarzy i
+ propozycji.
+ </p>
+
+ <h2>Subskrybowanie i zarządzanie listami</h2>
+
+ <p>
+ Aby dostawać wiadomości z listy należy ją zasubskrybować.
+ Niektóre listy są skonfigurowane w sposób, który umożliwia
+ dostarczanie do nich tylko wiadomości wysłanych
+ prenumeratorami. W takim wypadku reszta wiadomości może być
+ skierowana do kolej moderacji. Dokładne informacje o każdej
+ liście, włącznie z URL-em subskrybowania, można otrzymać w
+ <a href="http://mail.gnu.org.ua/mailman/listinfo/">katalogu
+ list</a>.
+ </p>
+
+ <p>
+ Subskrybenci list znajdą na stronach katalogu możliwość zmiany
+ swoich ustawień. Na przykład, mogą skonfigurować swoją
+ subskrypcję tak, aby dostawać całą dzienną pocztę z listy w jednej
+ wiadomości, zamiast zwykłego dostarczania pojedynczych wiadomości.
+ </p>
+
+ <p>
+ Jeśli jesteś administratorem projektu i chcesz utwórzyć
+ listę wysyłkową, odwiedź stronę <a href="http://puszcza.gnu.org.ua">
+ interfejsu zarządzania</a> Twoim projektem, wybierz "<i>Listy
+ wysyłkowe</i>" w pasku "<i>Zarządzanie</i>" a następnie kieruj
+ się instrukcjami, które znajdziesz na tamtej stronie. W wypadku
+ gdyby żadna z zaproponowanych przez nią nazw Ci nie pasowała,
+ napisz do <a href="mailto:savannah-hackers@gnu.org.ua">
+ administratorów systemu</a> i poproś ich o utwórzenie listy.
+ </p>
+
+ <p>
+ Administratrzy projektów mogą również
+ <a href="http://mail.gnu.org.ua/mailman/admin/">zarządzać</a> swoimi
+ listami wysyłkowymi.
+ </p>
+
+ <h2>Archiwa</h2>
+
+ <p>
+ Nasza witryna umożliwia również dostęp do
+ <a href="http://mail.gnu.org.ua/pipermail/">archiwów</a> list
+ wysyłkowych. Archiwa dostarczają możliwość szukania według
+ różnych kriteriów, np. daty, wątku, itp.
+ </p>
+</div> <!-- main -->
+
+<div id="footer">
+<address>Copyright &copy; 2006, 2010 Sergey Poznyakoff</address>.
+<p>
+Zezwala się na wykonywanie i dystrybucję wiernych kopii tego
+tekstu, bez tantiem, niezależnie od nośnika, pod warunkiem
+zachowania niniejszego zezwolenia oraz informacji o prawach
+autorskich.
+</p>
+<p>
+ Pytania w sprawie systemu pocztowego <span class="host">gnu.org.ua</span>
+oraz systemu list wysyłkowych prosimy wysyłać do
+ <a href="mailto:postmaster@gnu.org.ua"><em>postmastera</em></a>.
+</p>
+<p>
+Informacje o niedziałających odnośnikach oraz propozycje dotyczące tej
+strony prosimy wysyłać
+do <a href="mailto:webmasters@gnu.org.ua"><em>webmasterów</em></a>.
+</p>
+</div>
+
+</body>
+</html>
diff --git a/htdocs/mail.html.uk b/htdocs/mail.html.uk
new file mode 100644
index 0000000..852f2b3
--- /dev/null
+++ b/htdocs/mail.html.uk
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>mail.gnu.org.ua</title>
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <link rel="stylesheet" type="text/css" href="/mail.css" />
+ <link rev="made" href="mailto:gray@gnu.org.ua" />
+</head>
+
+
+<body>
+
+<h1>Вітаємо в <span class="host">mail.gnu.org.ua</span></h1>
+
+<ul class="nav">
+ <li class="navtopitem"><span class="navtoptitle">Списки розсилки</span>
+ <ul class="navsubmenu" id="submenu1">
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listinfo/">Каталог</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/admin/">Адміністрування</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://mail.gnu.org.ua/mailman/listarchive/">Архіви</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">GNU</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://puszcza.gnu.org.ua">Пуща</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://www.gnu.org.ua">GNU в Україні</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://ftp.gnu.org.ua">GNU FTP</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem"><span class="navtoptitle">Інші посилання</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="http://gray.gnu.org.ua">Адміністратор</a>
+ </li>
+ <li class="navsubitem">
+ <a href="https://mail.gnu.org.ua/user/">Скринька користувача</a>
+ </li>
+ <li class="navsubitem">
+ <a href="http://validator.w3.org/check/referer">Перевірка XHTML 1.0</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="navtopitem translations"><span class="navtoptitle">Переклади</span>
+ <ul class="navsubmenu">
+ <li class="navsubitem">
+ <a href="en/mail.html">English</a>
+ </li>
+ <li class="navsubitem">
+ <a href="pl/mail.html">Polska</a>
+ </li>
+ </ul>
+ </li>
+</ul>
+
+<div id="main">
+
+ <h2>Що є <span class="host">mail.gnu.org.ua</span>?</h2>
+
+ <p>
+ Система <span class="host">mail.gnu.org.ua</span>
+ координує списки розсилки для порталу розробників
+ <span class="host">gnu.org.ua</span>
+ <a href="http://puszcza.gnu.org.ua">Пуща</a> і різних проектів
+ з цього порталу. Списки розсилки є тим засобом, через який
+ користувач вільного програмного забезпечення може отримати
+ технічну підтримку, повідомити розробників про помилки у
+ ПЗ, а також надіслати їм свої зауваження і пропозиції.
+ </p>
+
+ <h2>Підписка та керування списками розсилки</h2>
+
+ <p>
+ Щоб отримувати пошту зі списку розсилки, треба на нього
+ підписатися. Крім цього, залежно від конфігурації списку,
+ підписка може бути необхідною, щоб надсилати повідомлення
+ його абонентам. Ми ведемо <a href="http://mail.gnu.org.ua/mailman/listinfo/">
+ каталог</a> списків розсилки, в якому ви можете знайти докладну
+ інформацію про кожний список разом із посиланням до сторінки,
+ через яку ви можете на нього підписатися.
+ </p>
+
+ <p>
+ Якщо ви вже підписалися на які-небудь списки, ці сторінки
+ дадуть вам можливість налаштувати свою підписку. Наприклад,
+ ви можете налаштувати список так, щоб уся пошта збіралася у одне
+ повідомлення і відсилалася вам раз на добу, або коли це
+ повідомлення осягне певний розмір.
+ </p>
+
+ <p>
+ Якщо ви адміністратор якого-небудь проекту і хочете створити список
+ розсилки, зайдіть на сторінку <a href="http://puszcza.gnu.org.ua">
+ адміністрування</a> вашого проекту та виберіть "<i>Mailing
+ Lists</i>" в полосі "<i>Administration</i>", потім керуйтеся
+ інструкціями наведеними на тій сторінці. А якщо жодна з
+ запропонованих назв не підходить для вашого списку, напишіть до
+ <a href="mailto:savannah-hackers@gnu.org.ua">сисадмінів</a> та
+ попросіть їх створити список із потрібною назвою.
+ </p>
+
+ <p>
+ Адміністратори списків мають доступ до
+ <a href="http://mail.gnu.org.ua/mailman/admin/">інтерфейсу
+ налаштування</a> списків.
+ </p>
+
+ <h2>Архіви</h2>
+
+ <p>
+ Ми також ведемо <a href="http://mail.gnu.org.ua/pipermail/">
+ архіви списків</a>. В них ви можете шукати повідомлення за
+ різноманітними критеріями, на прикл