luci-app-email: configure EmailRelay
authorSergey Ponomarev <stokito@gmail.com>
Tue, 8 Aug 2023 22:44:39 +0000 (01:44 +0300)
committerFlorian Eckert <fe@dev.tdt.de>
Wed, 9 Aug 2023 06:53:57 +0000 (08:53 +0200)
The EmailRelay is an SMTP and POP3 server.
It's the only server that has UCI config.
That's why the app is called just Email.
If any new mail server added we can create a separate tab within the same app.

Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
* Improve translation handling
* Update i18n
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
applications/luci-app-email/Makefile [new file with mode: 0644]
applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js [new file with mode: 0644]
applications/luci-app-email/po/templates/email.pot [new file with mode: 0644]
applications/luci-app-email/root/usr/share/luci/menu.d/luci-app-email.json [new file with mode: 0644]
applications/luci-app-email/root/usr/share/rpcd/acl.d/luci-app-email.json [new file with mode: 0644]

diff --git a/applications/luci-app-email/Makefile b/applications/luci-app-email/Makefile
new file mode 100644 (file)
index 0000000..c9060bc
--- /dev/null
@@ -0,0 +1,12 @@
+# See /LICENSE for more information.
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI app for email server configuration (EmailRelay)
+LUCI_DEPENDS:=+luci-base +emailrelay
+PKG_MAINTAINER:=Sergey Ponomarev <stokito@gmail.com>
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js b/applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js
new file mode 100644 (file)
index 0000000..71e98e6
--- /dev/null
@@ -0,0 +1,293 @@
+'use strict';
+'require view';
+'require form';
+
+return view.extend({
+       render: function () {
+               var docsRefAttrs = 'target="_blank" rel="noreferrer" href="https://emailrelay.sourceforge.net/';
+               var m, s, o;
+
+               m = new form.Map('emailrelay', _('Email Server Configuration'),
+                       _('E-MailRelay Server Configuration.') + '<br />' +
+                       _('For further information <a %s>check the documentation</a>')
+                               .format('href="https://openwrt.org/docs/guide-user/services/email/emailrelay" target="_blank" rel="noreferrer"')
+               );
+
+               s = m.section(form.GridSection, 'emailrelay', _('Instance config'));
+               s.anonymous = false;
+               s.addremove = true;
+               s.nodescriptions = true;
+
+
+               o = s.tab('smtp_server', _('SMTP Server'));
+               o = s.tab('smtp_client', _('SMTP Client'));
+               o = s.tab('pop_server', _('POP3'));
+               o = s.tab('advanced', _('Advanced Settings'));
+
+               o = s.taboption('smtp_server', form.Flag, 'enabled', _('Enabled'));
+               o.rmempty = false;
+
+               o = s.taboption('smtp_server', form.ListValue, 'mode', _('Mode'),
+                       _('See <a %s>Running E-MailRelay</a>')
+                               .format(docsRefAttrs + '#userguide_md_Running_E_MailRelay"')
+               );
+               o.value('server', _('Server: receive incoming mail'));
+               o.value('proxy', _('Proxy: submission outgoing mail, store and forward to smarthost SMTP server'));
+               o.value('cmdline', _('Manual command line options (deprecated)'));
+               o.default = 'server';
+               o.rmempty = false;
+
+               o = s.taboption('smtp_server', form.Value, 'port', _('SMTP Port'),
+                       _('SMTP Port to listen for incoming emails.') + '<br />' +
+                       _('Incoming mail by default received on <em>25</em> port.') + '<br />' +
+                       _('Outcoming mail by usually received on <em>587</em> or <em>465</em> (TLS only) ' +
+                               'but the <em>25</em> is also used often.')
+               );
+               o.datatype = 'port';
+               o.default = '25';
+
+               o = s.taboption('smtp_server', form.Flag, 'remote_clients', _('Allow remote clients'),
+                       _('Allow connections from the public internet.') + '<br />' +
+                       _('<b>You may receive spam so be careful</b>.') + '<br />' +
+                       _('Enable ports in firewall.') + '<br />' +
+                       _('See <a %s>--remote-clients</a>')
+                               .format(docsRefAttrs + '#__remote_clients"')
+               );
+               o.modalonly = true;
+               o.default = '0';
+
+               o = s.taboption('smtp_server', form.Flag, 'anonymous', _('Anonymous'),
+                       _('Reduce the amount of information leaked to remote clients.') + '<br />' +
+                       _('See <a %s>--anonymous</a>')
+                               .format(docsRefAttrs + '#__anonymous"')
+               );
+               o.modalonly = true;
+               o.default = '0';
+
+               o = s.taboption('smtp_server', form.Value, 'domain', _('Domain'),
+                       _('Specifies the server\'s domain name that is used in SMTP EHLO.') + '<br />' +
+                       _('By default, the local hostname is used.') + '<br />' +
+                       _('See <a %s>--domain</a>')
+                               .format(docsRefAttrs + '#__domain"')
+               );
+               o.datatype = 'hostname';
+               o.optional = true;
+               o.rmempty = false;
+               o.depends('anonymous', '0');
+
+               o = s.taboption('smtp_server', form.FileUpload, 'server_auth', _('Auth file'),
+                       _('Server/proxy authorization file.') + '<br />' +
+                       _('See <a %s>Authentication</a>')
+                               .format(docsRefAttrs + '#reference_md_Authentication"')
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.default = '/etc/emailrelay.auth';
+               o.optional = true;
+               o.rmempty = true;
+               o.modalonly = true;
+
+               o = s.taboption('smtp_server', form.Flag, 'server_tls', _('Enable TLS for server'),
+                       _('Use TLS encryption for SMTP and POP connections.') + '<br />' +
+                       _('Configure <a %s>acme.sh to issue a TLS cert</a>.')
+                               .format('href="https://openwrt.org/docs/guide-user/services/tls/acmesh" target="_blank" rel="noreferrer"') + '<br />' +
+                       _('See <a %s>TLS encryption</a>')
+                               .format(docsRefAttrs + '#reference_md_TLS_encryption"')
+               );
+               o.default = '0';
+               o.optional = true;
+               o.rmempty = true;
+               o.modalonly = true;
+
+               o = s.taboption('smtp_server', form.FileUpload, 'server_tls_key', _('TLS private key'),
+                       _('Path to TLS private key.') + '<br />' +
+                       _('E.g. ') + '<code>/etc/ssl/acme/example.com.key</code>'
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.optional = true;
+               o.rmempty = true;
+               o.modalonly = true;
+               o.depends('server_tls', '1');
+
+               o = s.taboption('smtp_server', form.FileUpload, 'server_tls_certificate', _('TLS certificate'),
+                       _('Path to TLS cert.') + '<br />' +
+                       _('E.g. ') + '<code>/etc/ssl/acme/example.com.fullchain.crt</code>'
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('server_tls', '1');
+
+               o = s.taboption('smtp_server', form.Value, 'server_tls_verify', _('CA certificate'),
+                       _('Verify an SMTP and POP client\'s certificates ' +
+                               'against trusted CA certificates in the specified file or directory.') + '<br />' +
+                       _('In many use cases this should be your self-signed root certificate.') + '<br />' +
+                       _('Use <code>&lt;default&gt;</code> to use the system trusted CAs.')
+               );
+               o.datatype = 'or(file, directory, "<default>")';
+               o.default = '<default>';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('server_tls', '1');
+
+               o = s.taboption('smtp_server', form.Value, 'spool_dir', _('Mail storage directory'),
+                       _('The directory used for holding received mail messages.') + '<br />' +
+                       _('<b>Note:</b> The <code>/var/</code> is a small in-memory folder and you\'ll lose mail in reboot.') + '<br />' +
+                       _('Instead, use a mounted disk with enough of space.')
+               );
+               o.datatype = 'directory';
+               o.default = '/var/spool/emailrelay';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+
+
+               o = s.taboption('smtp_client', form.Value, 'smarthost', _('Smarthost'),
+                       _('The SMTP server to forward emails')
+               );
+               o.datatype = 'host';
+               o.optional = false;
+               o.rmempty = false;
+               o.depends('mode', 'proxy');
+
+               o = s.taboption('smtp_client', form.FileUpload, 'client_auth', _('Client authorization file'),
+                       _('A file that contains credentials for SMTP smarthost client.') + '<br />' +
+                       _('See <a %s>Authentication</a>')
+                               .format(docsRefAttrs + '#reference_md_Authentication"')
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.default = '/etc/emailrelay.auth';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('mode', 'proxy');
+
+               o = s.taboption('smtp_client', form.Flag, 'client_tls', _('Enable SMTP client TLS'),
+                       _('Use TLS encryption for SMTP proxy client.') + '<br />' +
+                       _('See example for <a %s>Gmail</a>')
+                               .format(docsRefAttrs + '#userguide_md_Google_mail"')
+               );
+               o.default = '0';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('mode', 'proxy');
+
+               o = s.taboption('smtp_client', form.FileUpload, 'client_tls_key', _('TLS private key'),
+                       _('Path to TLS private key.')
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.optional = true;
+               o.rmempty = true;
+               o.modalonly = true;
+               o.depends('client_tls', '1');
+
+               o = s.taboption('smtp_client', form.FileUpload, 'client_tls_certificate', _('TLS certificate'),
+                       _('Path to TLS cert.')
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('client_tls', '1');
+
+               o = s.taboption('smtp_client', form.Value, 'client_tls_verify', _('CA certificate'),
+                       _('Verify an SMTP server\'s certificate ' +
+                               'against trusted CA certificates in the specified file or directory.') + '<br />' +
+                       _('Use <code>&lt;default&gt;</code> to use the system trusted CAs.')
+               );
+               o.datatype = 'or(file, directory, "<default>")';
+               o.default = '<default>';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('client_tls', '1');
+
+
+               o = s.taboption('pop_server', form.Flag, 'pop', _('Enable POP3'),
+                       _('The POP3 used to fetch a mail.') + '<br />' +
+                       _('See <a %s>Running as a POP server</a>')
+                               .format(docsRefAttrs + '#userguide_md_Running_as_a_POP_server"')
+               );
+               o.default = '0';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('mode', 'server');
+
+               o = s.taboption('pop_server', form.FileUpload, 'pop_auth', _('POP Auth file'),
+                       _('A file containing POP accounts and their credentials.')
+               );
+               o.datatype = 'file';
+               o.root_directory = '/';
+               o.default = '/etc/emailrelay.auth';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('pop', '1');
+
+               o = s.taboption('pop_server', form.Flag, 'pop_by_name', _('POP by name'),
+                       _('Modifies the spool directory used by the POP server to be a sub-directory ' +
+                               'with the same name as the POP authentication user-id.')
+               );
+               o.default = '1';
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.depends('pop', '1');
+
+
+               o = s.taboption('advanced', form.Value, 'dnsbl', _('DNSBL'),
+                       _('<a %s>DNS Block List (DNSBL)</a> used to block connections from known spammers.')
+                               .format('href="https://en.wikipedia.org/wiki/DNSBL" target="_blank" rel="noreferrer"') + '<br />' +
+                       _('Starts with the transport DNS server\'s address:port, a timeout in milliseconds, a rejection threshold and list of DNSBL servers.') + '<br />' +
+                       _('E.g. ') + '<code>127.0.0.1:53,5000,1,zen.spamhaus.org,bl.mailspike.net</code><br />' +
+                       _('If the threshold number of servers deny the incoming connection\'s network address then it\'s dropped.') + '<br />' +
+                       _('A threshold of zero is useful for testing and means only to log a result code but allow a connection.') + '<br />' +
+                       _('See <a %s>Connection blocking</a>')
+                               .format(docsRefAttrs + '#reference_md_Connection_blocking"')
+               );
+               o.datatype = 'string';
+               o.optional = true;
+               o.rmempty = true;
+               o.modalonly = true;
+
+               o = s.taboption('advanced', form.Value, 'address_verifier', _('Address verifier'),
+                       _('Runs the specified external program to verify a message recipient\'s email address.') + '<br />' +
+                       _('See <a %s>Address verification</a>')
+                               .format(docsRefAttrs + '#reference_md_Address_verification"')
+               );
+               // o.default = "allow:/etc/emailrelay.auth";
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+
+               o = s.taboption('advanced', form.Value, 'filter', _('Filter'),
+                       _('Runs the specified external filter program whenever a mail message is stored.') + '<br />' +
+                       _('See <a %s>--filter</a>')
+                               .format(docsRefAttrs + '#__filter"')
+               );
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+
+               o = s.taboption('advanced', form.Value, 'extra_cmdline', _('Extra command line options'),
+                       _('Specify additional arguments that should be passed to the EmailRelay.') + '<br />' +
+                       _('See <a %s>Command line reference</a>')
+                               .format(docsRefAttrs + '#reference_md_Reference"')
+               );
+               o.optional = true;
+               o.rmempty = false;
+               o.modalonly = true;
+               o.modalonly = true;
+
+               return m.render();
+       },
+});
diff --git a/applications/luci-app-email/po/templates/email.pot b/applications/luci-app-email/po/templates/email.pot
new file mode 100644 (file)
index 0000000..d66420b
--- /dev/null
@@ -0,0 +1,357 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:248
+msgid ""
+"<a %s>DNS Block List (DNSBL)</a> used to block connections from known "
+"spammers."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:139
+msgid ""
+"<b>Note:</b> The <code>/var/</code> is a small in-memory folder and you'll "
+"lose mail in reboot."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:51
+msgid "<b>You may receive spam so be careful</b>."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:226
+msgid "A file containing POP accounts and their credentials."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:158
+msgid "A file that contains credentials for SMTP smarthost client."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:253
+msgid ""
+"A threshold of zero is useful for testing and means only to log a result "
+"code but allow a connection."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:262
+msgid "Address verifier"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:25
+msgid "Advanced Settings"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:50
+msgid "Allow connections from the public internet."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:49
+msgid "Allow remote clients"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:59
+msgid "Anonymous"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:78
+msgid "Auth file"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:69
+msgid "By default, the local hostname is used."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:124
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:201
+msgid "CA certificate"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:157
+msgid "Client authorization file"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:92
+msgid "Configure <a %s>acme.sh to issue a TLS cert</a>."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:247
+msgid "DNSBL"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:67
+msgid "Domain"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:11
+msgid "E-MailRelay Server Configuration."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:104
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:115
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:251
+msgid "E.g."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:10
+msgid "Email Server Configuration"
+msgstr ""
+
+#: applications/luci-app-email/root/usr/share/luci/menu.d/luci-app-email.json:3
+msgid "Email server"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:214
+msgid "Enable POP3"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:170
+msgid "Enable SMTP client TLS"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:90
+msgid "Enable TLS for server"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:52
+msgid "Enable ports in firewall."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:27
+msgid "Enabled"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:281
+msgid "Extra command line options"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:272
+msgid "Filter"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:12
+msgid "For further information <a %s>check the documentation</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:252
+msgid ""
+"If the threshold number of servers deny the incoming connection's network "
+"address then it's dropped."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:127
+msgid "In many use cases this should be your self-signed root certificate."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:42
+msgid "Incoming mail by default received on <em>25</em> port."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:16
+msgid "Instance config"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:140
+msgid "Instead, use a mounted disk with enough of space."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:137
+msgid "Mail storage directory"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:36
+msgid "Manual command line options (deprecated)"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:30
+msgid "Mode"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:237
+msgid ""
+"Modifies the spool directory used by the POP server to be a sub-directory "
+"with the same name as the POP authentication user-id."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:43
+msgid ""
+"Outcoming mail by usually received on <em>587</em> or <em>465</em> (TLS "
+"only) but the <em>25</em> is also used often."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:225
+msgid "POP Auth file"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:236
+msgid "POP by name"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:24
+msgid "POP3"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:114
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:192
+msgid "Path to TLS cert."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:103
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:182
+msgid "Path to TLS private key."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:35
+msgid ""
+"Proxy: submission outgoing mail, store and forward to smarthost SMTP server"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:60
+msgid "Reduce the amount of information leaked to remote clients."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:273
+msgid ""
+"Runs the specified external filter program whenever a mail message is stored."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:263
+msgid ""
+"Runs the specified external program to verify a message recipient's email "
+"address."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:23
+msgid "SMTP Client"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:40
+msgid "SMTP Port"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:41
+msgid "SMTP Port to listen for incoming emails."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:22
+msgid "SMTP Server"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:61
+msgid "See <a %s>--anonymous</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:70
+msgid "See <a %s>--domain</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:274
+msgid "See <a %s>--filter</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:53
+msgid "See <a %s>--remote-clients</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:264
+msgid "See <a %s>Address verification</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:80
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:159
+msgid "See <a %s>Authentication</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:283
+msgid "See <a %s>Command line reference</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:254
+msgid "See <a %s>Connection blocking</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:31
+msgid "See <a %s>Running E-MailRelay</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:216
+msgid "See <a %s>Running as a POP server</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:94
+msgid "See <a %s>TLS encryption</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:172
+msgid "See example for <a %s>Gmail</a>"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:79
+msgid "Server/proxy authorization file."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:34
+msgid "Server: receive incoming mail"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:149
+msgid "Smarthost"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:68
+msgid "Specifies the server's domain name that is used in SMTP EHLO."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:282
+msgid "Specify additional arguments that should be passed to the EmailRelay."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:250
+msgid ""
+"Starts with the transport DNS server's address:port, a timeout in "
+"milliseconds, a rejection threshold and list of DNSBL servers."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:113
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:191
+msgid "TLS certificate"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:102
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:181
+msgid "TLS private key"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:215
+msgid "The POP3 used to fetch a mail."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:150
+msgid "The SMTP server to forward emails"
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:138
+msgid "The directory used for holding received mail messages."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:128
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:204
+msgid "Use <code>&lt;default&gt;</code> to use the system trusted CAs."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:91
+msgid "Use TLS encryption for SMTP and POP connections."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:171
+msgid "Use TLS encryption for SMTP proxy client."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:125
+msgid ""
+"Verify an SMTP and POP client's certificates against trusted CA certificates "
+"in the specified file or directory."
+msgstr ""
+
+#: applications/luci-app-email/htdocs/luci-static/resources/view/email/emailrelay.js:202
+msgid ""
+"Verify an SMTP server's certificate against trusted CA certificates in the "
+"specified file or directory."
+msgstr ""
diff --git a/applications/luci-app-email/root/usr/share/luci/menu.d/luci-app-email.json b/applications/luci-app-email/root/usr/share/luci/menu.d/luci-app-email.json
new file mode 100644 (file)
index 0000000..eee5786
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "admin/services/email": {
+               "title": "Email server",
+               "order": 50,
+               "action": {
+                       "type": "view",
+                       "path": "email/emailrelay"
+               },
+               "depends": {
+                       "acl": [ "luci-app-email" ]
+               }
+       }
+}
diff --git a/applications/luci-app-email/root/usr/share/rpcd/acl.d/luci-app-email.json b/applications/luci-app-email/root/usr/share/rpcd/acl.d/luci-app-email.json
new file mode 100644 (file)
index 0000000..1a3147e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "luci-app-email": {
+               "read": {
+                       "uci": [
+                               "emailrelay"
+                       ]
+               },
+               "write": {
+                       "uci": [
+                               "emailrelay"
+                       ]
+               }
+       }
+}