modified
Este commit está contenido en:
@@ -1,4 +1,5 @@
|
||||
version: "2.3"
|
||||
version: "2"
|
||||
|
||||
services:
|
||||
wildduck:
|
||||
build: ./wildduck
|
||||
@@ -13,14 +14,18 @@ services:
|
||||
- "587:587"
|
||||
- "993:993"
|
||||
expose:
|
||||
- 25
|
||||
- 80
|
||||
- 12080
|
||||
volumes:
|
||||
- ./entrypoint.sh:/entrypoint.sh:ro
|
||||
- /opt/docker/secure:/secure:ro
|
||||
- ./wildduck/config:/wildduck/config
|
||||
- ./wildduck-mta/config:/wildduck-mta/config
|
||||
- ./haraka/config:/haraka/config
|
||||
- ./wildduck/config:/wildduck/config:ro
|
||||
- ./wildduck-mta/config:/wildduck-mta/config:ro
|
||||
- ./haraka/config:/haraka/config:ro
|
||||
- ./attachments:/home/node/attachments
|
||||
- ./zonemta-wildduck.js:/wildduck-mta/plugins/zonemta-wildduck.js:ro
|
||||
- ./maildropper.js:/wildduck/lib/maildropper.js:ro
|
||||
depends_on:
|
||||
- redis
|
||||
- mongo
|
||||
@@ -67,9 +72,12 @@ services:
|
||||
expose:
|
||||
- 3000
|
||||
volumes:
|
||||
- ./webmail/config:/webmail/config
|
||||
- ./webmail/views:/webmail/views
|
||||
- ./webmail/logo.png:/webmail/public/logo.png
|
||||
- ./webmail/config:/webmail/config:ro
|
||||
- ./webmail/views/index.hbs:/webmail/views/index.hbs:ro
|
||||
- ./webmail/views/layout.hbs:/webmail/views/layout.hbs:ro
|
||||
- ./webmail/views/layout-popup.hbs:/webmail/views/layout-popup.hbs:ro
|
||||
- ./webmail/views/layout-webmail.hbs:/webmail/views/layout-webmail.hbs:ro
|
||||
- ./webmail/logo.png:/webmail/public/logo.png:ro
|
||||
depends_on:
|
||||
- redis
|
||||
- mongo
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/bin/bash
|
||||
sudo service rspamd start
|
||||
cd /haraka
|
||||
node haraka.js &
|
||||
NODE_ENV=production node haraka.js &
|
||||
cd /wildduck
|
||||
node server.js &
|
||||
NODE_ENV=production node server.js &
|
||||
cd /wildduck-mta
|
||||
npm start --production &
|
||||
NODE_ENV=production npm start &
|
||||
/bin/sleep infinity
|
||||
|
||||
@@ -3,7 +3,7 @@ reject_all=false
|
||||
single_recipient=true
|
||||
empty_return_path=true
|
||||
bad_rcpt=true
|
||||
bounce_spf=true
|
||||
bounce_spf=false
|
||||
non_local_msgid=true
|
||||
|
||||
[reject]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
disabled = false
|
||||
selector = dkim
|
||||
domain = hatthieves.es
|
||||
headers_to_sign = From, Sender, Reply-To, Subject, Date, Message-ID, To, Cc, MIME-Version
|
||||
dkim.private.key = /secure/dkim_private.key
|
||||
disabled=false
|
||||
selector=dkim
|
||||
domain=hatthieves.es
|
||||
headers_to_sign=From, Sender, Reply-To, Subject, Date, Message-ID, To, Cc, MIME-Version
|
||||
dkim.private.key=/../../secure/dkim_private.key
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
; disable checks or reject for each test if you are worried about strictness
|
||||
|
||||
;dns_timeout=30
|
||||
dns_timeout=30
|
||||
|
||||
[check]
|
||||
; match_re=true
|
||||
bare_ip=true
|
||||
; bare_ip=false
|
||||
; dynamic=true
|
||||
; big_company=true
|
||||
; literal_mismatch: 1 = exact IP match, 2 = IP/24 match, 3 = /24 or RFC1918
|
||||
; literal_mismatch=2
|
||||
valid_hostname=true
|
||||
forward_dns=true
|
||||
rdns_match=true
|
||||
; forward_dns=true
|
||||
; rdns_match=true
|
||||
; host_mismatch: hostname differs between EHLO invocations
|
||||
host_mismatch=true
|
||||
; proto_mismatch: host sent EHLO but then tries to sent HELO or vice-versa
|
||||
@@ -22,15 +22,15 @@ host_mismatch=true
|
||||
; proto_mismatch=false
|
||||
proto_mismatch=true
|
||||
; rdns_match=false
|
||||
rdns_match=true
|
||||
rdns_match=false
|
||||
; dynamic=false
|
||||
; bare_ip=false
|
||||
bare_ip=true
|
||||
bare_ip=false
|
||||
; literal_mismatch=false
|
||||
; valid_hostname=false
|
||||
valid_hostname=true
|
||||
; forward_dns=false
|
||||
forward_dns=true
|
||||
; forward_dns=true
|
||||
; big_company=true
|
||||
|
||||
[skip]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
timeout=30
|
||||
allow_mx_ip=0
|
||||
reject_no_mx=1
|
||||
re_bogus_ip=^(?:0\.0\.0\.0|255\.255\.255\.255|127\.)
|
||||
re_bogus_ip=^(?:0\.0\.0\.0|255\.255\.255\.255|127\.|172\.)
|
||||
|
||||
@@ -10,7 +10,7 @@ user=
|
||||
; password
|
||||
pass=
|
||||
; host
|
||||
host=127.0.0.1
|
||||
host=172.200.0.103
|
||||
; port
|
||||
port=27017
|
||||
; database name
|
||||
@@ -23,7 +23,7 @@ delivery=email_delivery_results
|
||||
|
||||
; Absolute path to store attachments
|
||||
[attachments]
|
||||
path=/home/node/Haraka/attachments
|
||||
path=/home/node/attachments
|
||||
|
||||
[enable]
|
||||
queue=yes
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
|
||||
; uncomment to disable tls for outbound mail
|
||||
; enable_tls=false
|
||||
enable_tls=true
|
||||
|
||||
; maxTempFailures (default: 13)
|
||||
|
||||
; ipv6_enabled (default: false)
|
||||
ipv6_enabled=true
|
||||
|
||||
; load_pid_queue
|
||||
; flush_queue
|
||||
@@ -24,7 +26,9 @@
|
||||
|
||||
; pool_timeout: default : 300
|
||||
; pool_timeout=0
|
||||
pool_timeout=30
|
||||
|
||||
; pool_concurrency_max: default: 10
|
||||
; set to zero to disable pools
|
||||
; pool_concurrency_max=0
|
||||
pool_concurrency_max=20
|
||||
|
||||
@@ -24,6 +24,7 @@ access
|
||||
# block mails from known bad hosts (see config/dnsbl.zones for the DNS zones queried)
|
||||
#dnsbl
|
||||
redis
|
||||
#mongodb
|
||||
|
||||
# HELO
|
||||
#early_talker
|
||||
@@ -76,3 +77,4 @@ queue/lmtp
|
||||
|
||||
#watch
|
||||
wildduck
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
; address to listen on (default: all IPv6 and IPv4 addresses, port 25)
|
||||
; use "[::0]:25" to listen on IPv6 and IPv4 (not all OSes)
|
||||
; listen=[::0]:25
|
||||
listen=[::0]:25
|
||||
|
||||
; Note you can listen on multiple IPs/ports using commas:
|
||||
;listen=127.0.0.1:2529,127.0.0.2:2529,127.0.0.3:2530
|
||||
@@ -24,7 +24,7 @@ public_ip=82.223.3.135
|
||||
|
||||
; Run using cluster to fork multiple backend processes
|
||||
;nodes=cpus
|
||||
nodes=4
|
||||
nodes=6
|
||||
|
||||
; Daemonize
|
||||
;daemonize=true
|
||||
|
||||
@@ -29,6 +29,6 @@ ciphers=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-G
|
||||
|
||||
; no_tls_hosts - disable TLS for servers with broken TLS.
|
||||
[no_tls_hosts]
|
||||
; 127.0.0.1
|
||||
127.0.0.1
|
||||
; 192.168.1.1
|
||||
; 172.16.0.0/16
|
||||
|
||||
@@ -49,7 +49,7 @@ sender:
|
||||
|
||||
srs:
|
||||
# must be shared with ZoneMTA SRS config, otherwise messages sent from ZoneMTA are not recognized by Haraka
|
||||
secret: 'asecretcat'
|
||||
secret: 'a secret hat'
|
||||
|
||||
attachments:
|
||||
type: 'gridstore'
|
||||
|
||||
@@ -3,6 +3,5 @@ RUN apt update && apt -y install git python make sudo
|
||||
RUN git clone https://github.com/nodemailer/wildduck-webmail /webmail
|
||||
RUN chown node.node -R /webmail
|
||||
WORKDIR /webmail
|
||||
RUN git checkout 5c54625a8b192823184ba7f5da41f3414e76db94
|
||||
RUN sudo -u node npm install
|
||||
RUN sudo -u node npm i
|
||||
RUN sudo -u node npm run bowerdeps
|
||||
|
||||
@@ -15,6 +15,7 @@ title="Wild Duck Mail - HatThieves.es"
|
||||
enableSpecial=true # if true the allow creating addresses with special usernames
|
||||
# allowed domains for new addresses
|
||||
domains=["hatthieves.es"]
|
||||
generalNotification=""
|
||||
|
||||
[api]
|
||||
# url="http://127.0.0.1:8080"
|
||||
@@ -53,7 +54,7 @@ title="Wild Duck Mail - HatThieves.es"
|
||||
|
||||
[u2f]
|
||||
# set to false if not using HTTPS
|
||||
enabled=false
|
||||
enabled=true
|
||||
# must be https url or use default
|
||||
#appId="https://127.0.0.1:8080"
|
||||
appId="https://webmail.hatthieves.es"
|
||||
|
||||
@@ -18,53 +18,62 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<p>
|
||||
If enabled then an autoreply message is sent to all incoming messages. If a contact sends multiple messages then the autoreply is sent at most once in every four hours.
|
||||
</p>
|
||||
<p>
|
||||
If enabled then an autoreply message is sent to all incoming messages. If a contact sends
|
||||
multiple messages then the autoreply is sent at most once in every four hours.
|
||||
</p>
|
||||
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="status" value="false" {{#unless values.status}}checked{{/unless}}>
|
||||
Autoreply is {{#unless values.status}}<span class="label label-default">disabled</span>{{else}}disabled{{/unless}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="status" value="true" {{#if values.status}}checked{{/if}}>
|
||||
Autoreply is {{#if values.status}}<span class="label label-info">enabled</span>{{else}}enabled{{/if}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="form-control" id="name" name="name" value="{{values.name}}" placeholder="Sender name in the autoreply From: header">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="subject">Subject</label>
|
||||
<input type="text" class="form-control" id="subject" name="subject" value="{{values.subject}}" placeholder="Leave blank to use the default subject">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="daterange">Time</label>
|
||||
<div class="form-group-sm daterangeElm" style="position: relative">
|
||||
<input type="text" id="daterange" class="form-control" value="">
|
||||
<i class="glyphicon glyphicon-calendar fa fa-calendar" style="position: absolute; bottom: 10px; right: 24px; top: auto; cursor: pointer;"></i>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="status" value="false"
|
||||
{{#unless values.status}}checked{{/unless}}>
|
||||
Autoreply is {{#unless values.status}}<span
|
||||
class="label label-default">disabled</span>{{else}}disabled{{/unless}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Message</label>
|
||||
<textarea class="form-control" name="text" value="{{values.text}}" rows="3">{{values.text}}</textarea>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="status" value="true" {{#if values.status}}checked{{/if}}>
|
||||
Autoreply is {{#if values.status}}<span
|
||||
class="label label-info">enabled</span>{{else}}enabled{{/if}}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> Update</button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="form-control" id="name" name="name" value="{{values.name}}"
|
||||
placeholder="Sender name in the autoreply From: header">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="subject">Subject</label>
|
||||
<input type="text" class="form-control" id="subject" name="subject"
|
||||
value="{{values.subject}}" placeholder="Leave blank to use the default subject">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="daterange">Time</label>
|
||||
<div class="form-group-sm daterangeElm" style="position: relative">
|
||||
<input type="text" id="daterange" class="form-control" value="">
|
||||
<i class="glyphicon glyphicon-calendar fa fa-calendar"
|
||||
style="position: absolute; bottom: 10px; right: 24px; top: auto; cursor: pointer;"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">Message</label>
|
||||
<textarea class="form-control" name="text" value="{{values.text}}"
|
||||
rows="3">{{values.text}}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-wrench"
|
||||
aria-hidden="true"></span> Update</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
</form>
|
||||
@@ -73,8 +82,11 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function(event) {
|
||||
$('#daterange').daterangepicker({
|
||||
const startValue = (document.getElementById('start').value || '').trim();
|
||||
const endValue = (document.getElementById('end').value || '').trim();
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function (event) {
|
||||
const rangeOptions = {
|
||||
"showDropdowns": true,
|
||||
"showISOWeekNumbers": true,
|
||||
"timePicker": true,
|
||||
@@ -116,27 +128,29 @@
|
||||
"firstDay": 1
|
||||
},
|
||||
|
||||
{{#if values.start}}
|
||||
"startDate": moment("{{values.start}}").format('DD/MM/YYYY HH:mm'),
|
||||
{{/if}}
|
||||
|
||||
{{#if values.end}}
|
||||
"endDate": moment("{{values.end}}").format('DD/MM/YYYY HH:mm'),
|
||||
{{/if}}
|
||||
|
||||
"alwaysShowCalendars": true
|
||||
}, function(start, end, label) {
|
||||
}
|
||||
|
||||
if (startValue) {
|
||||
rangeOptions.startDate = moment(startValue).format('DD/MM/YYYY HH:mm')
|
||||
}
|
||||
|
||||
if (endValue) {
|
||||
rangeOptions.endDate = moment(endValue).format('DD/MM/YYYY HH:mm')
|
||||
}
|
||||
|
||||
$('#daterange').daterangepicker(rangeOptions, function (start, end, label) {
|
||||
document.getElementById('start').value = start.valueOf();
|
||||
document.getElementById('end').value = end.valueOf();
|
||||
document.getElementById('daterange').value = start.format('DD/MM/YYYY HH:mm') + ' – ' + end.format('DD/MM/YYYY HH:mm');
|
||||
});
|
||||
|
||||
$('.daterangeElm i').click(function() {
|
||||
$('.daterangeElm i').click(function () {
|
||||
$(this).parent().find('input').click();
|
||||
});
|
||||
|
||||
{{#if values.start}}
|
||||
document.getElementById('daterange').value = moment("{{values.start}}").format('DD/MM/YYYY HH:mm') + ' – ' + moment("{{values.end}}").format('DD/MM/YYYY HH:mm');
|
||||
{{/if}}
|
||||
if (startValue && endValue) {
|
||||
document.getElementById('daterange').value = moment(startValue).format('DD/MM/YYYY HH:mm') + ' – ' + moment(endValue).format('DD/MM/YYYY HH:mm');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">Account configuration</h3></div>
|
||||
<h3 class="panel-title">Account configuration</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
Use the following configuration for your desktop email client.
|
||||
@@ -45,20 +46,20 @@
|
||||
</td>
|
||||
</tr>
|
||||
{{#if user}}
|
||||
<tr>
|
||||
<th>
|
||||
E-mail address
|
||||
</th>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>
|
||||
E-mail address
|
||||
</th>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}@{{serviceDomain}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
<tr>
|
||||
<th>
|
||||
@@ -94,23 +95,23 @@
|
||||
</th>
|
||||
<td>
|
||||
{{#if setup.imap.secure}}
|
||||
TLS/SSL
|
||||
TLS/SSL
|
||||
{{else}}
|
||||
STARTTLS
|
||||
STARTTLS
|
||||
{{/if}}
|
||||
</td>
|
||||
<td>
|
||||
{{#if setup.pop3.secure}}
|
||||
TLS/SSL
|
||||
TLS/SSL
|
||||
{{else}}
|
||||
STARTTLS
|
||||
STARTTLS
|
||||
{{/if}}
|
||||
</td>
|
||||
<td>
|
||||
{{#if setup.smtp.secure}}
|
||||
TLS/SSL
|
||||
TLS/SSL
|
||||
{{else}}
|
||||
STARTTLS
|
||||
STARTTLS
|
||||
{{/if}}
|
||||
</td>
|
||||
</tr>
|
||||
@@ -119,32 +120,40 @@
|
||||
Username
|
||||
</th>
|
||||
{{#if user}}
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
<td>
|
||||
{{user.username}}
|
||||
</td>
|
||||
|
||||
{{else}}
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
<td>
|
||||
Your username
|
||||
</td>
|
||||
{{/if}}
|
||||
</tr>
|
||||
<tr>
|
||||
<th>
|
||||
Password
|
||||
</th>
|
||||
{{#if use2fa}}
|
||||
<td colspan="3">
|
||||
Two factor authentication is enabled on your account.
|
||||
Generate application specific passwords <a
|
||||
href="https://mailtest-01.tahvel.info/account/security/asps">here</a> to use IMAP, POP3 and
|
||||
SMTP.
|
||||
</td>
|
||||
{{else}}
|
||||
<td>
|
||||
********
|
||||
</td>
|
||||
@@ -154,7 +163,8 @@
|
||||
<td>
|
||||
********
|
||||
</td>
|
||||
{{/if}}
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,3 +1,4 @@
|
||||
<script>
|
||||
window.location.href = "https://webmail.hatthieves.es/account/login";
|
||||
window.location.href = "/account/login";
|
||||
</script>
|
||||
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
{{flash_messages}}
|
||||
</div>
|
||||
|
||||
{{#if generalNotification}}
|
||||
<div class="panel panel-warning">
|
||||
<div class="panel-heading">{{{generalNotification}}}</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="form-popup">
|
||||
@@ -40,7 +46,8 @@
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<p class="text-muted">© 2019 <a href="/">{{serviceName}}</a>. <a href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
<p class="text-muted">© 2020 <a href="/">{{serviceName}}</a>. <a
|
||||
href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -23,40 +23,52 @@
|
||||
</div>
|
||||
|
||||
<div style="margin: 10px 0 10px 0;" class="text-center">
|
||||
<a href="/webmail/send" style="width: 100%" class="btn btn-default"><span class="glyphicon glyphicon-edit" aria-hidden="true"></span> Compose message</a>
|
||||
<a href="/webmail/send" style="width: 100%" class="btn btn-default"><span
|
||||
class="glyphicon glyphicon-edit" aria-hidden="true"></span> Compose message</a>
|
||||
</div>
|
||||
|
||||
<ul class="nav nav-sidebar">
|
||||
{{#each mailboxes}}
|
||||
<li id="mailbox-list-{{id}}" {{#if selected}} class="active" {{/if}}>
|
||||
<a href="/webmail/{{id}}">
|
||||
<span class="badge pull-right unseen-counter-{{id}}" {{#if unseen}}style="display: block;"{{else}}style="display: none;"{{/if}}>{{unseen}}</span>
|
||||
{{{prefix}}}
|
||||
{{#if icon}}
|
||||
<span class="glyphicon glyphicon-{{icon}}" aria-hidden="true"></span>
|
||||
{{else}}
|
||||
<span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span>
|
||||
{{/if}}
|
||||
<span>{{formatted}}</span> {{{suffix}}}
|
||||
</a>
|
||||
</li>
|
||||
<li id="mailbox-list-{{id}}" {{#if selected}} class="active" {{/if}}>
|
||||
<a href="/webmail/{{id}}">
|
||||
<span class="badge pull-right unseen-counter-{{id}}" {{#if unseen}}style="display: block;"
|
||||
{{else}}style="display: none;" {{/if}}>{{unseen}}</span>
|
||||
{{{prefix}}}
|
||||
{{#if icon}}
|
||||
<span class="glyphicon glyphicon-{{icon}}" aria-hidden="true"></span>
|
||||
{{else}}
|
||||
<span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span>
|
||||
{{/if}}
|
||||
<span>{{formatted}}</span> {{{suffix}}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
<li style="margin-top: 20px;">
|
||||
<a href="/webmail/create" class="text-muted"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Create folder</a>
|
||||
<a href="/webmail/create" class="text-muted"><span class="glyphicon glyphicon-plus"
|
||||
aria-hidden="true"></span> Create folder</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="webmail-main">
|
||||
|
||||
{{#if generalNotification}}
|
||||
<div class="panel panel-warning">
|
||||
<div class="panel-heading">{{{generalNotification}}}</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{{body}}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<p class="text-muted">© 2019 <a href="/">{{serviceName}}</a>. <a href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
<p class="text-muted">© 2020 <a href="/">{{serviceName}}</a>. <a
|
||||
href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -12,15 +12,24 @@
|
||||
{{flash_messages}}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="container">
|
||||
|
||||
{{#if generalNotification}}
|
||||
<div class="panel panel-warning">
|
||||
<div class="panel-heading">{{{generalNotification}}}</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{{body}}}
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<p class="text-muted">© 2019 <a href="/">{{serviceName}}</a>. <a href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
<p class="text-muted">© 2020 <a href="/">{{serviceName}}</a>. <a
|
||||
href="mailto:info@{{serviceDomain}}">info@{{serviceDomain}}</a>. </p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<li role="presentation" class="{{#if accMenuOverview}}active{{/if}}"><a href="/account/">Overview</a></li>
|
||||
<li role="presentation" class="{{#if accMenuProfile}}active{{/if}}"><a href="/account/profile">Profile</a></li>
|
||||
<li role="presentation" class="{{#if accMenuIdentities}}active{{/if}}"><a href="/account/identities">Identities</a></li>
|
||||
<li role="presentation" class="{{#if accMenuRestore}}active{{/if}}"><a href="/account/restore">Restore Messages</a></li>
|
||||
@@ -121,7 +121,7 @@
|
||||
<div class="form-group{{#if errors.action_targets}} has-error{{/if}}">
|
||||
<label for="action_targets">Forward it to address:</label>
|
||||
<input type="text" class="form-control input-sm" name="action_targets" id="action_targets" value="{{values.action_targets}}" placeholder="user@example.com">
|
||||
<span class="help-block">Somma separated list of email addresses or URLs</span>
|
||||
<span class="help-block">Comma separated list of email addresses or URLs</span>
|
||||
{{#if errors.action_targets}}
|
||||
<span class="help-block">{{errors.action_targets}}</span>
|
||||
{{/if}}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
<nav class="navbar navbar-default navbar-static-top">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
|
||||
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="{{#if user}}/webmail{{else}}/{{/if}}">
|
||||
<img alt="{{serviceName}}" src="/favicon-32x32.png" width="20" height="20">
|
||||
<img alt="{{serviceName}}" src="/favicon-32x32.png" width="20" height="20">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -16,70 +17,74 @@
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
|
||||
{{#if user}}
|
||||
<li {{#if activeWebmail}} class="active" {{/if}}>
|
||||
<a href="/webmail/">
|
||||
<span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> Webmail
|
||||
<span class="badge pull-right unseen-counter-{{inboxId}}" {{#if inboxUnseen}}style="display: block;"{{else}}style="display: none;"{{/if}}>{{inboxUnseen}}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeFilters}} class="active" {{/if}}>
|
||||
<a href="/account/filters">
|
||||
<span class="glyphicon glyphicon-filter" aria-hidden="true"></span> Filters
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeAutoreply}} class="active" {{/if}}>
|
||||
<a href="/account/autoreply">
|
||||
<span class="glyphicon glyphicon-calendar" aria-hidden="true"></span> Autoreply
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeHelp}} class="active" {{/if}}>
|
||||
<a href="/help">
|
||||
<span class="glyphicon glyphicon glyphicon-question-sign" aria-hidden="true"></span> Help
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
||||
<img src="{{user.gravatar}}" class="profile-image img-circle" width="20" height="20">
|
||||
<li {{#if activeWebmail}} class="active" {{/if}}>
|
||||
<a href="/webmail/">
|
||||
<span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> Webmail
|
||||
<span class="badge pull-right unseen-counter-{{inboxId}}"
|
||||
{{#if inboxUnseen}}style="display: block;" {{else}}style="display: none;"
|
||||
{{/if}}>{{inboxUnseen}}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeFilters}} class="active" {{/if}}>
|
||||
<a href="/account/filters">
|
||||
<span class="glyphicon glyphicon-filter" aria-hidden="true"></span> Filters
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeAutoreply}} class="active" {{/if}}>
|
||||
<a href="/account/autoreply">
|
||||
<span class="glyphicon glyphicon-calendar" aria-hidden="true"></span> Autoreply
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeHelp}} class="active" {{/if}}>
|
||||
<a href="/help">
|
||||
<span class="glyphicon glyphicon glyphicon-question-sign" aria-hidden="true"></span> Help
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
|
||||
aria-expanded="false">
|
||||
<img src="{{user.gravatar}}" class="profile-image img-circle" width="20" height="20">
|
||||
|
||||
{{#if user.name}}
|
||||
{{user.name}}
|
||||
{{else}}
|
||||
{{user.username}}
|
||||
{{/if}}
|
||||
{{#if user.name}}
|
||||
{{user.name}}
|
||||
{{else}}
|
||||
{{user.username}}
|
||||
{{/if}}
|
||||
|
||||
<span class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li {{#if activeHome}} class="active" {{/if}}>
|
||||
<a href="/account/">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> Account
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeSecurity}} class="active" {{/if}}>
|
||||
<a href="/account/security">
|
||||
<span class="glyphicon glyphicon-lock" aria-hidden="true"></span> Security
|
||||
</a>
|
||||
</li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/account/logout"><span class="glyphicon glyphicon-log-out" aria-hidden="true"></span> Log out</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{{else}}
|
||||
{{#if allowJoin}}
|
||||
<li {{#if activeCreate}} class="active" {{/if}}>
|
||||
<a href="/account/create">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> Create account
|
||||
<span class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li {{#if activeHome}} class="active" {{/if}}>
|
||||
<a href="/account/">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> Account
|
||||
</a>
|
||||
</li>
|
||||
{{/if}}
|
||||
<li {{#if activeLogin}} class="active" {{/if}}>
|
||||
<a href="/account/login">
|
||||
<span class="glyphicon glyphicon-log-in" aria-hidden="true"></span> Log in
|
||||
</a>
|
||||
</li>
|
||||
<li {{#if activeSecurity}} class="active" {{/if}}>
|
||||
<a href="/account/security">
|
||||
<span class="glyphicon glyphicon-lock" aria-hidden="true"></span> Security
|
||||
</a>
|
||||
</li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/account/logout"><span class="glyphicon glyphicon-log-out"
|
||||
aria-hidden="true"></span> Log out</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{{else}}
|
||||
{{#if allowJoin}}
|
||||
<li {{#if activeCreate}} class="active" {{/if}}>
|
||||
<a href="/account/create">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> Create account
|
||||
</a>
|
||||
</li>
|
||||
{{/if}}
|
||||
<li {{#if activeLogin}} class="active" {{/if}}>
|
||||
<a href="/account/login">
|
||||
<span class="glyphicon glyphicon-log-in" aria-hidden="true"></span> Log in
|
||||
</a>
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
</nav>
|
||||
La diferencia del archivo ha sido suprimido porque es demasiado grande
Cargar Diff
@@ -9,3 +9,7 @@ redis="redis://172.200.0.102:6379/2"
|
||||
|
||||
# Database name for ZoneMTA data in MongoDB. In most cases it should be the same as in the connection string
|
||||
sender="zone-mta"
|
||||
|
||||
users="wildduck"
|
||||
|
||||
gridfs="wildduck"
|
||||
|
||||
@@ -3,5 +3,8 @@
|
||||
[default]
|
||||
maxConnections=5
|
||||
|
||||
["hatthieves.es"]
|
||||
maxConnections=20
|
||||
|
||||
["gmail.com"]
|
||||
maxConnections=10
|
||||
|
||||
@@ -5,4 +5,4 @@ addMissing=["message-id", "date"]
|
||||
# If true then delays messages with future Date: headers until that time has arrived
|
||||
futureDate=false
|
||||
# Add X-Originating-IP header
|
||||
xOriginatingIP=true
|
||||
xOriginatingIP=false
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
enabled=false
|
||||
#enabled="receiver"
|
||||
# only check authentication for interfaces with following names
|
||||
interfaces=["feeder"]
|
||||
#interfaces=["feeder"]
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
|
||||
# List local IP addresses that can be used for outbound tcp connections
|
||||
# Server process must be able to locally bind to these addresses
|
||||
default=["0.0.0.0", "::"]
|
||||
#default=["0.0.0.0", "::"]
|
||||
|
||||
# or alternatively, to provide hostnames as well:
|
||||
#
|
||||
#[[default]]
|
||||
#address="1.2.3.4"
|
||||
#name="ip-1.hostname"
|
||||
[[default]]
|
||||
address="0.0.0.0"
|
||||
name="hatthieves.es"
|
||||
#
|
||||
#[[default]]
|
||||
#address="1.2.3.5"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[bounces]
|
||||
preferIPv6=false
|
||||
ignoreIPv6=true
|
||||
processes=1
|
||||
connections=2
|
||||
processes=2
|
||||
connections=20
|
||||
pool="default"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[default]
|
||||
preferIPv6=false
|
||||
ignoreIPv6=true
|
||||
processes=1
|
||||
connections=5
|
||||
processes=2
|
||||
connections=20
|
||||
pool="default"
|
||||
|
||||
# If you want to send messages for this zone to next MTA instead of actual MX, then
|
||||
|
||||
@@ -5,7 +5,7 @@ RUN wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
|
||||
RUN echo "deb [arch=amd64] http://rspamd.com/apt-stable/ stretch main" > /etc/apt/sources.list.d/rspamd.list
|
||||
RUN echo "deb-src [arch=amd64] http://rspamd.com/apt-stable/ stretch main" >> /etc/apt/sources.list.d/rspamd.list
|
||||
RUN apt update
|
||||
RUN apt --no-install-recommends install -y rspamd
|
||||
RUN apt --no-install-recommends install -y rspamd && apt clean
|
||||
RUN setcap 'cap_net_bind_service=+ep' /usr/local/bin/node
|
||||
RUN git clone https://github.com/nodemailer/wildduck /wildduck
|
||||
RUN git clone https://github.com/zone-eu/zone-mta-template /wildduck-mta
|
||||
@@ -21,4 +21,4 @@ RUN npm i --production
|
||||
RUN npm i -S zonemta-wildduck zonemta-limiter
|
||||
WORKDIR /haraka
|
||||
RUN npm i
|
||||
RUN npm i -S haraka-plugin-wildduck haraka-plugin-rspamd haraka-plugin-limit haraka-plugin-karma haraka-plugin-redis
|
||||
RUN npm i -S haraka-plugin-wildduck haraka-plugin-rspamd haraka-plugin-limit haraka-plugin-karma haraka-plugin-redis haraka-plugin-mongodb
|
||||
|
||||
@@ -13,10 +13,18 @@ accessToken = "nohaytoken"
|
||||
|
||||
[accessControl]
|
||||
# If true then require a valid access token to perform API calls
|
||||
enabled = false
|
||||
# If a client provides a token then it is validated even if using a token is not required
|
||||
enabled=false
|
||||
|
||||
# Secret for HMAC
|
||||
# Changing this value invalidates all tokens
|
||||
#secret = "sAiHB6XcSWJgsMrMl_vJzcfVlhhenJLi"
|
||||
secret="a secret cat"
|
||||
|
||||
# Generated access token TTL in seconds. Token TTL gets extended by this value every time the token is used. Defaults to 14 days
|
||||
tokenTTL=1209600
|
||||
|
||||
# Generated access token max lifetime in seconds. Defaults to 180 days
|
||||
tokenLifetime=15552000
|
||||
|
||||
[roles]
|
||||
# @include "roles.json"
|
||||
@@ -32,7 +40,7 @@ enabled = false
|
||||
|
||||
# A reverse-DNS style identifier (com.example.myprofile, for example) that identifies the profile.
|
||||
# This string is used to determine whether a new profile should replace an existing one or should be added. Username is prepended to this value.
|
||||
identifier = "es.hatthieves"
|
||||
identifier = "es.hatthieves.ns1"
|
||||
|
||||
# A human-readable name for the profile. This value is displayed on the Detail screen. It does not have to be unique.
|
||||
displayName = "Wildduck Mail"
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
ident="wildduck"
|
||||
|
||||
# how many processes to start
|
||||
processes = "2"
|
||||
processes=2
|
||||
|
||||
# default quota storage in MB (can be overriden per user)
|
||||
maxStorage=1024
|
||||
|
||||
# default smtp recipients for 24h (can be overriden per user)
|
||||
maxRecipients=2000
|
||||
emailDomain = "hatthieves.es"
|
||||
emailDomain="hatthieves.es"
|
||||
|
||||
# default forwarded messages for 24h (can be overriden per user)
|
||||
maxForwards=2000
|
||||
@@ -33,11 +33,11 @@ maxForwards=2000
|
||||
#cipher="aes192"
|
||||
secret="a secret cat"
|
||||
|
||||
cipher = "aes192"
|
||||
cipher = "aes192"
|
||||
#secret = "E2jYD-p2u68-qUEOJ1KkC3xmzySyTGRY"
|
||||
[u2f]
|
||||
# Fully qualified URL of your website (must use HTTPS!)
|
||||
appId = "http://172.200.0.101"
|
||||
appId = "https://webmail.hatthieves.es"
|
||||
|
||||
[attachments]
|
||||
# @include "attachments.toml"
|
||||
|
||||
@@ -16,15 +16,3 @@ signTransportDomain=true
|
||||
|
||||
# do not change this
|
||||
hashAlgo="sha256"
|
||||
|
||||
enabled="sender"
|
||||
|
||||
# Domain name in the dkim signature. Leave blank to use the domain of From: address
|
||||
domain="hatthieves.es"
|
||||
|
||||
# Selector value in the dkim signature
|
||||
selector="dkim"
|
||||
|
||||
# Key location. Relative to working directory
|
||||
path="/secure/dkim_private.key"
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
},
|
||||
|
||||
"userlisting": {
|
||||
"read:any": ["*", "!audit"]
|
||||
"read:any": ["*"]
|
||||
},
|
||||
|
||||
"users": {
|
||||
"create:any": ["*", "!audit"],
|
||||
"read:any": ["*", "!audit"],
|
||||
"update:any": ["*", "!audit"],
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
@@ -40,6 +40,20 @@
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"attachments": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"storage": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"mailboxes": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
@@ -94,13 +108,13 @@
|
||||
},
|
||||
|
||||
"userlisting": {
|
||||
"read:any": ["*", "!audit"]
|
||||
"read:any": ["*"]
|
||||
},
|
||||
|
||||
"users": {
|
||||
"create:any": ["*", "!audit"],
|
||||
"read:any": ["*", "!audit"],
|
||||
"update:any": ["*", "!audit"],
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
@@ -153,8 +167,8 @@
|
||||
},
|
||||
|
||||
"users": {
|
||||
"read:any": ["*", "!audit"],
|
||||
"update:any": ["*", "!audit"]
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"]
|
||||
},
|
||||
|
||||
"asps": {
|
||||
@@ -170,6 +184,20 @@
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"attachments": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"storage": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
"delete:any": ["*"]
|
||||
},
|
||||
|
||||
"mailboxes": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
@@ -209,12 +237,12 @@
|
||||
},
|
||||
|
||||
"userlisting": {
|
||||
"read:own": ["*", "!audit"]
|
||||
"read:own": ["*", "!tags", "!metaData", "!disabledScopes"]
|
||||
},
|
||||
|
||||
"users": {
|
||||
"read:own": ["*", "!audit"],
|
||||
"update:own": ["*", "!audit"]
|
||||
"read:own": ["*", "!tags", "!metaData", "!disabledScopes"],
|
||||
"update:own": ["*", "!tags", "!metaData", "!disabledScopes"]
|
||||
},
|
||||
|
||||
"asps": {
|
||||
@@ -230,6 +258,20 @@
|
||||
"delete:own": ["*"]
|
||||
},
|
||||
|
||||
"attachments": {
|
||||
"create:own": ["*"],
|
||||
"read:own": ["*"],
|
||||
"update:own": ["*"],
|
||||
"delete:own": ["*"]
|
||||
},
|
||||
|
||||
"storage": {
|
||||
"create:own": ["*"],
|
||||
"read:own": ["*"],
|
||||
"update:own": ["*"],
|
||||
"delete:own": ["*"]
|
||||
},
|
||||
|
||||
"mailboxes": {
|
||||
"create:own": ["*"],
|
||||
"read:own": ["*"],
|
||||
@@ -253,6 +295,18 @@
|
||||
},
|
||||
|
||||
"auth": {
|
||||
"authentication": {
|
||||
"create:any": ["*", "!token"]
|
||||
}
|
||||
},
|
||||
|
||||
"attachments": {
|
||||
"attachments": {
|
||||
"read:any": ["*"]
|
||||
}
|
||||
},
|
||||
|
||||
"tokenAuth": {
|
||||
"authentication": {
|
||||
"create:any": ["*"]
|
||||
}
|
||||
@@ -260,6 +314,10 @@
|
||||
|
||||
"audit": {
|
||||
"users": {
|
||||
"read:any": ["*"]
|
||||
},
|
||||
|
||||
"audit": {
|
||||
"create:any": ["*"],
|
||||
"read:any": ["*"],
|
||||
"update:any": ["*"],
|
||||
@@ -267,3 +325,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Referencia en una nueva incidencia
Block a user