Compare commits
679 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13c4acffa1 | ||
|
|
3a5b763018 | ||
|
|
3fa3fd5f69 | ||
|
|
983c388150 | ||
|
|
27f13c1ba3 | ||
|
|
6cfb74e96c | ||
|
|
9249b4a2d4 | ||
|
|
ad1ca42bde | ||
|
|
af086bbdbe | ||
|
|
d19abc60bc | ||
|
|
c041a9d45c | ||
|
|
24828615cf | ||
|
|
5e2552bcd5 | ||
|
|
be7dc1e6bd | ||
|
|
533a6f8faa | ||
|
|
c0645eadef | ||
|
|
d96debb2a6 | ||
|
|
e994fefb2d | ||
|
|
66844fbca8 | ||
|
|
1df3b46454 | ||
|
|
8ef0493f53 | ||
|
|
db9a3787b1 | ||
|
|
3655c7c902 | ||
|
|
9c284c4004 | ||
|
|
a5d6acfb96 | ||
|
|
3c4ee1b31e | ||
|
|
97b3a85090 | ||
|
|
09a50b6cfc | ||
|
|
5795d8be16 | ||
|
|
4060ac2223 | ||
|
|
087841d5b7 | ||
|
|
b5f51b0e2e | ||
|
|
0f4ba39141 | ||
|
|
514d179db1 | ||
|
|
bb0fd896b3 | ||
|
|
8fe9e695f3 | ||
|
|
c7dcfee882 | ||
|
|
79768c09f6 | ||
|
|
74693ee47c | ||
|
|
c1839b1ec1 | ||
|
|
6ca8ed437d | ||
|
|
94e42c9b52 | ||
|
|
33c0a99ffc | ||
|
|
bb85079d92 | ||
|
|
491f6b24bb | ||
|
|
1aa97c9914 | ||
|
|
c00910ca4b | ||
|
|
97d338e68a | ||
|
|
7f46876b0c | ||
|
|
425cdd5e77 | ||
|
|
20f1faf6d0 | ||
|
|
c25ba75d68 | ||
|
|
9208d7262f | ||
|
|
2de4995fec | ||
|
|
28daa22842 | ||
|
|
8e5ccf2754 | ||
|
|
626559f99b | ||
|
|
94edb48f08 | ||
|
|
a2a9512afa | ||
|
|
f0906073e3 | ||
|
|
a634c7b72d | ||
|
|
38eb266c25 | ||
|
|
c0972face6 | ||
|
|
35be1710a6 | ||
|
|
8acf9451fa | ||
|
|
8172f3eab8 | ||
|
|
3d98124bcd | ||
|
|
fee52e87ed | ||
|
|
b6aaf57be1 | ||
|
|
d0f07984b0 | ||
|
|
07b1e8d765 | ||
|
|
9dd447e23b | ||
|
|
eac4d553a9 | ||
|
|
c25c646909 | ||
|
|
02367d1447 | ||
|
|
2d4bac03ad | ||
|
|
a382f74680 | ||
|
|
ca86090011 | ||
|
|
37027cfce7 | ||
|
|
d18cf7cb25 | ||
|
|
d84254ccd8 | ||
|
|
161b27a204 | ||
|
|
b564b879aa | ||
|
|
c9df311a0d | ||
|
|
eff6c34632 | ||
|
|
88c174fb7a | ||
|
|
2b6f5ea3d0 | ||
|
|
eccadeca16 | ||
|
|
fed7146873 | ||
|
|
4783e61693 | ||
|
|
72e1b444ca | ||
|
|
5b769e23da | ||
|
|
30716b8bdf | ||
|
|
02995f0a15 | ||
|
|
f9e30bd87c | ||
|
|
4a7eb1eb6c | ||
|
|
2a8808bdec | ||
|
|
f57d4859f3 | ||
|
|
f6013aa29f | ||
|
|
206cce0b47 | ||
|
|
5c24390114 | ||
|
|
2a76451a98 | ||
|
|
1bbf3f235d | ||
|
|
12689965bd | ||
|
|
680ad4b67a | ||
|
|
76d9fc3865 | ||
|
|
4032e7128d | ||
|
|
fca3dc4e70 | ||
|
|
9a7fc1416a | ||
|
|
b3ac4465f2 | ||
|
|
da96ef183b | ||
|
|
e08f3e81d0 | ||
|
|
982e586e49 | ||
|
|
0d6a203a9d | ||
|
|
fd8ed3dfa6 | ||
|
|
2576379df5 | ||
|
|
88f5e6e4cf | ||
|
|
c3bc7988c9 | ||
|
|
6dcc33e390 | ||
|
|
4e9dc0c3c9 | ||
|
|
13bc6261e4 | ||
|
|
ca4804653d | ||
|
|
09abaff9b6 | ||
|
|
7a116c0364 | ||
|
|
42e2dbe35d | ||
|
|
003c36c98a | ||
|
|
5fa2aac569 | ||
|
|
5067b5c59a | ||
|
|
903bb70c5b | ||
|
|
9ba086fcff | ||
|
|
9004c9b8b5 | ||
|
|
e9217b8389 | ||
|
|
1a5e106bb8 | ||
|
|
7125077dec | ||
|
|
7408e625f6 | ||
|
|
2237e641b0 | ||
|
|
ffdef18bd6 | ||
|
|
a46d0fe581 | ||
|
|
35e0fa1b9d | ||
|
|
a1ac7fc19c | ||
|
|
da81f67254 | ||
|
|
27cf2c33a6 | ||
|
|
1e3392e417 | ||
|
|
dde7ccca97 | ||
|
|
72e931f4b4 | ||
|
|
928fbb372d | ||
|
|
3b1fdc6166 | ||
|
|
fd3a944850 | ||
|
|
55297424cd | ||
|
|
b8783b670a | ||
|
|
238d4e7f20 | ||
|
|
56fb74c502 | ||
|
|
e5268de0c7 | ||
|
|
120c29eff6 | ||
|
|
ae8f928fc0 | ||
|
|
393bf566da | ||
|
|
6c12e2fffb | ||
|
|
12d8872a09 | ||
|
|
da37555a3c | ||
|
|
7c07efc216 | ||
|
|
bcfce27ee2 | ||
|
|
9412c8e1e9 | ||
|
|
8a44a44688 | ||
|
|
40d8e65762 | ||
|
|
5b7b29ee3f | ||
|
|
1187cac5e1 | ||
|
|
ed81c076f2 | ||
|
|
aed80a74fa | ||
|
|
99540cd90b | ||
|
|
2d382f2d67 | ||
|
|
2124df36ec | ||
|
|
76e95bd585 | ||
|
|
0e5606d493 | ||
|
|
eb7dfb5771 | ||
|
|
7c1118df7d | ||
|
|
3552c59ff3 | ||
|
|
3c9cae5d06 | ||
|
|
6a9e5c1921 | ||
|
|
b54a51e3ba | ||
|
|
9881dd2074 | ||
|
|
603b6e7390 | ||
|
|
81b24f61e8 | ||
|
|
a2fea36c79 | ||
|
|
c3e89967fb | ||
|
|
f2c4e52fee | ||
|
|
d167c8ca7c | ||
|
|
90b8c3cc1f | ||
|
|
bce1487338 | ||
|
|
8112d31ce9 | ||
|
|
eaaf0125d1 | ||
|
|
1fcaef7c7e | ||
|
|
78bd5aea1c | ||
|
|
72d4fa2bc9 | ||
|
|
857ad50509 | ||
|
|
4a5c0a6d21 | ||
|
|
80658c30da | ||
|
|
c5be360a48 | ||
|
|
771e0ee6a2 | ||
|
|
ebaba8fb41 | ||
|
|
f10416e85a | ||
|
|
6fb0b93240 | ||
|
|
9c56e4c1b6 | ||
|
|
4ccefd6d5e | ||
|
|
02c802159a | ||
|
|
118ea0f3fb | ||
|
|
84c6b12d06 | ||
|
|
08987dfa22 | ||
|
|
727970514d | ||
|
|
672fca3347 | ||
|
|
7a3922c2e7 | ||
|
|
5b8deed06b | ||
|
|
9c639eebd4 | ||
|
|
82069ea3f0 | ||
|
|
35193f5530 | ||
|
|
f40fcd7ac0 | ||
|
|
fc24426291 | ||
|
|
d4f32c3e7d | ||
|
|
39a1de956f | ||
|
|
adfadab4cf | ||
|
|
828d96f8f0 | ||
|
|
01fa179767 | ||
|
|
988e09e65e | ||
|
|
dba8f1810d | ||
|
|
dbce059ae8 | ||
|
|
86bdce8407 | ||
|
|
cec5c1b16b | ||
|
|
d5162328ec | ||
|
|
ce0bf3366d | ||
|
|
b9b4a8cd77 | ||
|
|
0c40057767 | ||
|
|
5679d355aa | ||
|
|
0a5dbf6230 | ||
|
|
b2059be966 | ||
|
|
ed53d655d3 | ||
|
|
7c0f5b20d6 | ||
|
|
cb1ed349bf | ||
|
|
6b6cbcf977 | ||
|
|
b3c7c45140 | ||
|
|
ef55ca525c | ||
|
|
e67a0d464b | ||
|
|
3098343360 | ||
|
|
4ea12deae7 | ||
|
|
ed3388ed6e | ||
|
|
7c82be904f | ||
|
|
53b9c031c9 | ||
|
|
a412951a30 | ||
|
|
0bc901a722 | ||
|
|
1fc40bf932 | ||
|
|
13e3862ca7 | ||
|
|
8fa80c1589 | ||
|
|
f0f5cea5d1 | ||
|
|
040c1e529a | ||
|
|
39272ab05c | ||
|
|
e784556330 | ||
|
|
f647d1a0bc | ||
|
|
5ada669f43 | ||
|
|
28a5f8574d | ||
|
|
7de6acad11 | ||
|
|
bee81d1a54 | ||
|
|
b9ecc0ccc6 | ||
|
|
eacf27452e | ||
|
|
7bccfa69a8 | ||
|
|
e8dee22ecf | ||
|
|
f3ebf35c75 | ||
|
|
acbb586e71 | ||
|
|
0d164486b4 | ||
|
|
11a8e49f05 | ||
|
|
9fd7851cb6 | ||
|
|
15eb2806bf | ||
|
|
5035975c41 | ||
|
|
c6846fd8db | ||
|
|
b38deb18cf | ||
|
|
3f7e7ca3a6 | ||
|
|
1394955447 | ||
|
|
b5693edc63 | ||
|
|
f4ef0eed09 | ||
|
|
70c4e42f74 | ||
|
|
77e3fc0ebc | ||
|
|
a91a54b5f1 | ||
|
|
1a04c13da8 | ||
|
|
de43060ef8 | ||
|
|
bdfcc5b530 | ||
|
|
f2259c3302 | ||
|
|
6aafef88bd | ||
|
|
39f58c03ff | ||
|
|
6c3c64f873 | ||
|
|
c8b39c5d4a | ||
|
|
3541b7cc63 | ||
|
|
eb4cbc0f81 | ||
|
|
4641ae6d2b | ||
|
|
2c7a5a97e4 | ||
|
|
10ec2f999a | ||
|
|
2e1aa079c1 | ||
|
|
4b9dbf00a8 | ||
|
|
e8e133b53d | ||
|
|
00b5ae11db | ||
|
|
2f7b6e14c0 | ||
|
|
cde22be4c9 | ||
|
|
013d02d726 | ||
|
|
5180ce527c | ||
|
|
ada09f7922 | ||
|
|
6bd365e771 | ||
|
|
afba7b9c11 | ||
|
|
bd0a7050f2 | ||
|
|
9d610f56f7 | ||
|
|
29e4ca0768 | ||
|
|
d59d6b0d0d | ||
|
|
676c408f06 | ||
|
|
c9ae89e350 | ||
|
|
1f71d10899 | ||
|
|
13146be57e | ||
|
|
6b34b2728e | ||
|
|
fdda813163 | ||
|
|
0eb963eb21 | ||
|
|
c1834d3500 | ||
|
|
508e519a34 | ||
|
|
8b189ed145 | ||
|
|
c316c040c5 | ||
|
|
74796201ec | ||
|
|
fc99eb7b34 | ||
|
|
f3f0b98755 | ||
|
|
0817629869 | ||
|
|
716ed16f34 | ||
|
|
16469d7282 | ||
|
|
1bae5968ad | ||
|
|
c457ccfa60 | ||
|
|
d6c386651d | ||
|
|
1bbb86eab5 | ||
|
|
5716ca933e | ||
|
|
011f4e317b | ||
|
|
2d886554c8 | ||
|
|
7a7854bf3f | ||
|
|
afe0c1bf86 | ||
|
|
2b1c94d965 | ||
|
|
f430f410f0 | ||
|
|
a405d4cc6f | ||
|
|
fff802b5bf | ||
|
|
c135b37b07 | ||
|
|
32224202d6 | ||
|
|
e8c0f031ac | ||
|
|
6a6b3af2d7 | ||
|
|
9f861a4547 | ||
|
|
c09ac713a3 | ||
|
|
940b88a641 | ||
|
|
f7d8f20c87 | ||
|
|
a19e11d552 | ||
|
|
7915f2631f | ||
|
|
bb6b984610 | ||
|
|
bc85dff27e | ||
|
|
39c159bae9 | ||
|
|
508796eaab | ||
|
|
59eb4a5a00 | ||
|
|
42f557ff38 | ||
|
|
4133bab280 | ||
|
|
38db35f1d6 | ||
|
|
9c266cc8e5 | ||
|
|
0c73be7c6e | ||
|
|
3224a8ecad | ||
|
|
5987703631 | ||
|
|
20f37607bb | ||
|
|
58a83a93e6 | ||
|
|
09d77bc2de | ||
|
|
cc17962c86 | ||
|
|
71eed72e21 | ||
|
|
027b8f36df | ||
|
|
bc70be35c2 | ||
|
|
645a7f3c96 | ||
|
|
28ebcd5007 | ||
|
|
ebe90fc447 | ||
|
|
0067d97f26 | ||
|
|
5cc5b7c40a | ||
|
|
23c8dea27b | ||
|
|
12882cfacf | ||
|
|
6479f5177b | ||
|
|
07af9978e2 | ||
|
|
6490a43492 | ||
|
|
73add1b428 | ||
|
|
76923d80d8 | ||
|
|
4d70a8737e | ||
|
|
2cba045013 | ||
|
|
11bcae4c57 | ||
|
|
b287a85124 | ||
|
|
f97d0d9e43 | ||
|
|
339b3c1b24 | ||
|
|
fcad52b145 | ||
|
|
69c19dca55 | ||
|
|
82bb8c2fd9 | ||
|
|
f5668dea51 | ||
|
|
9890e1fb2a | ||
|
|
42c6bdb4df | ||
|
|
dc4b0d21ea | ||
|
|
f9c6c98180 | ||
|
|
43b6547e1c | ||
|
|
542793260b | ||
|
|
0d52364eac | ||
|
|
6d088504bd | ||
|
|
6ba55ee377 | ||
|
|
3c725bf634 | ||
|
|
ca6c0bc8fd | ||
|
|
4d25083847 | ||
|
|
cfeaa189f9 | ||
|
|
d8365bfbcf | ||
|
|
82140baa69 | ||
|
|
697caaab81 | ||
|
|
7143fb8c47 | ||
|
|
39cd0d5034 | ||
|
|
68aa797720 | ||
|
|
72cfadd5e8 | ||
|
|
5341ee4472 | ||
|
|
f5f09fad6e | ||
|
|
e9aa85ad01 | ||
|
|
f3a8f47b0a | ||
|
|
cbaac01790 | ||
|
|
0b885548ab | ||
|
|
a684739b9c | ||
|
|
73ca5fb3d3 | ||
|
|
23e288aadc | ||
|
|
91349d62ee | ||
|
|
f5f8d1d84b | ||
|
|
f9ef126e03 | ||
|
|
5dc9ee9516 | ||
|
|
89c55ba8fe | ||
|
|
d917f60352 | ||
|
|
64269e08c0 | ||
|
|
313b79538e | ||
|
|
4b60ee5361 | ||
|
|
482ce3bcd6 | ||
|
|
99914c50fd | ||
|
|
fe7e32dc82 | ||
|
|
6fc51d879b | ||
|
|
cc8e15748b | ||
|
|
ac62f26dfd | ||
|
|
0bdb2a16bc | ||
|
|
fb62e6b5a2 | ||
|
|
935cd7f706 | ||
|
|
480fc6c437 | ||
|
|
d13725ce33 | ||
|
|
dc8df56976 | ||
|
|
a6412f3f23 | ||
|
|
b3131496c6 | ||
|
|
27d43384c5 | ||
|
|
91300c1c5c | ||
|
|
820e5c667b | ||
|
|
8a0ff1153e | ||
|
|
a34090502d | ||
|
|
806dfc804a | ||
|
|
bd6026384a | ||
|
|
f506966abc | ||
|
|
9350bb9b9a | ||
|
|
3dca1a834c | ||
|
|
18fe8cd9f2 | ||
|
|
5ad02ae2e5 | ||
|
|
b6e4b0e557 | ||
|
|
d52d01924a | ||
|
|
8bf8a0328e | ||
|
|
b188c5790c | ||
|
|
9abee93328 | ||
|
|
151aeb9c06 | ||
|
|
699a25939f | ||
|
|
db3cb2aac1 | ||
|
|
eb9649db4e | ||
|
|
9e24064e35 | ||
|
|
14a6cfb5c6 | ||
|
|
0085b6f1e6 | ||
|
|
c04e58498d | ||
|
|
bb73933e1e | ||
|
|
82e738cc53 | ||
|
|
b5d6b93869 | ||
|
|
809fe78f82 | ||
|
|
28001213d4 | ||
|
|
76617a3c97 | ||
|
|
2b2ab864d1 | ||
|
|
70175f8c28 | ||
|
|
109842502a | ||
|
|
262e82a367 | ||
|
|
147a1359cd | ||
|
|
f5e7751835 | ||
|
|
ca26264d01 | ||
|
|
75a1bf967c | ||
|
|
c51e1b9eef | ||
|
|
77aac02b43 | ||
|
|
0b513768fb | ||
|
|
6478400cba | ||
|
|
74b72375cb | ||
|
|
53bf6085dc | ||
|
|
0a6632de4e | ||
|
|
8ec31df139 | ||
|
|
b7ece9f9b8 | ||
|
|
9091e54fda | ||
|
|
81a6a7cbf6 | ||
|
|
a1fb8442e3 | ||
|
|
0284b6a8e9 | ||
|
|
12294a6e5a | ||
|
|
50f2ea66c8 | ||
|
|
14687d09ba | ||
|
|
e543477c2e | ||
|
|
cfd233039e | ||
|
|
069fe195e0 | ||
|
|
6828231c28 | ||
|
|
1b0b3a2b1e | ||
|
|
9de58279a5 | ||
|
|
c6095cd72e | ||
|
|
52d89b2f5d | ||
|
|
1371ba5f5e | ||
|
|
ea658a174d | ||
|
|
b6c76a5e39 | ||
|
|
a47ba3474c | ||
|
|
3beceb90ec | ||
|
|
a9e41960a1 | ||
|
|
91e51a24c8 | ||
|
|
ebdfcbd18e | ||
|
|
efec26d0af | ||
|
|
b25325912a | ||
|
|
7d661ab80d | ||
|
|
2d4e769a25 | ||
|
|
6bb4c6e2f0 | ||
|
|
ae8c9f5a6b | ||
|
|
f353b2d9ae | ||
|
|
8f5036e769 | ||
|
|
50f9f379e9 | ||
|
|
6177571e4d | ||
|
|
b541d4c257 | ||
|
|
e89b32a3f4 | ||
|
|
ec8e82aaca | ||
|
|
d4cc142f64 | ||
|
|
f5538698d3 | ||
|
|
40720fb3ea | ||
|
|
5502297fce | ||
|
|
f70acfe893 | ||
|
|
dd8b0dba54 | ||
|
|
987cfde91f | ||
|
|
f55e5e26cd | ||
|
|
2b96abbef4 | ||
|
|
af38d5ab0c | ||
|
|
fc89b30e8a | ||
|
|
791fab688a | ||
|
|
c9b0832899 | ||
|
|
fa1b0ac32c | ||
|
|
75f0791965 | ||
|
|
c91c5c7493 | ||
|
|
299a654e97 | ||
|
|
494e52d8f0 | ||
|
|
3b7014d563 | ||
|
|
be0a0b4ac8 | ||
|
|
9ec3d3673e | ||
|
|
002198d3d3 | ||
|
|
b18a1d5217 | ||
|
|
08e95c08ca | ||
|
|
5a9f01d473 | ||
|
|
8efc51bc29 | ||
|
|
8bad30cd59 | ||
|
|
7f0447514c | ||
|
|
80893be68b | ||
|
|
091369915b | ||
|
|
e13593f29a | ||
|
|
d1dbba2d3a | ||
|
|
62d1a0c104 | ||
|
|
bb0d7bf6dc | ||
|
|
186c30d2ac | ||
|
|
35276c3101 | ||
|
|
dfaedb76f1 | ||
|
|
5a4b0a18ef | ||
|
|
f75280e4a3 | ||
|
|
a03d884ccc | ||
|
|
9968d708f1 | ||
|
|
381e76511d | ||
|
|
c688970b32 | ||
|
|
49b17d31be | ||
|
|
d3064579f4 | ||
|
|
92f4858323 | ||
|
|
d2c6cecca6 | ||
|
|
5bfdd75738 | ||
|
|
78f4fa7db9 | ||
|
|
20d6fbae48 | ||
|
|
2c2a1ed042 | ||
|
|
1e609acbaf | ||
|
|
3aaecca989 | ||
|
|
1c26c9e376 | ||
|
|
a51416a4af | ||
|
|
e843f7ef1f | ||
|
|
d333acabea | ||
|
|
386a02588b | ||
|
|
c8540ddba7 | ||
|
|
6fc22e5432 | ||
|
|
733b89bff5 | ||
|
|
bc17171c02 | ||
|
|
3b66fcada7 | ||
|
|
7139a27bf1 | ||
|
|
f585197e52 | ||
|
|
e5c25c395f | ||
|
|
7f5bd98a2e | ||
|
|
93d5254b3f | ||
|
|
6018995534 | ||
|
|
792c720c13 | ||
|
|
c40e255f3b | ||
|
|
d9ea64fac7 | ||
|
|
5a7272ff12 | ||
|
|
1b666cd25b | ||
|
|
db0cd8efb4 | ||
|
|
ea8aced2e6 | ||
|
|
e92113bd57 | ||
|
|
b4134b7774 | ||
|
|
fa0bda7b69 | ||
|
|
3ef4e1f6b7 | ||
|
|
e02e47c48e | ||
|
|
d23becb910 | ||
|
|
8504b78c76 | ||
|
|
b9e67635f4 | ||
|
|
46cd86e66a | ||
|
|
649a4fc9cf | ||
|
|
52bad80af8 | ||
|
|
d5cfc91fc4 | ||
|
|
b58dcfb511 | ||
|
|
29a1548532 | ||
|
|
bac906ba5b | ||
|
|
f2c74dd014 | ||
|
|
82ff7c421d | ||
|
|
88903bc6f5 | ||
|
|
90ba755abc | ||
|
|
efaa3058c0 | ||
|
|
d0f759acca | ||
|
|
31b887807a | ||
|
|
8903cb1367 | ||
|
|
933d3a435d | ||
|
|
a0d7b987ca | ||
|
|
a453df3503 | ||
|
|
75c103ccc9 | ||
|
|
198f145821 | ||
|
|
f818936012 | ||
|
|
dba6bf5ae9 | ||
|
|
3ae2dffb4d | ||
|
|
eaaef0d0f5 | ||
|
|
df42a2d149 | ||
|
|
e7d838ac2a | ||
|
|
9dfb2b8f2c | ||
|
|
dfb5463c94 | ||
|
|
04278b6cbf | ||
|
|
9e7aa423fd | ||
|
|
23f392efb2 | ||
|
|
6c56c8e298 | ||
|
|
8cee04dbcc | ||
|
|
f538e33dcf | ||
|
|
d8ebfbe020 | ||
|
|
7c2b4be954 | ||
|
|
6ec0fe7036 | ||
|
|
34d88144b2 | ||
|
|
d98f16333a | ||
|
|
8d224824ea | ||
|
|
d0b8de72e4 | ||
|
|
bfc898c2d8 | ||
|
|
f1ad2cf4d0 | ||
|
|
7a9d2c9725 | ||
|
|
bbef3b651e | ||
|
|
7f92bfd6b6 | ||
|
|
ca2cc4fc24 | ||
|
|
36e2e35ea8 | ||
|
|
7594226c50 | ||
|
|
acb5d7da38 | ||
|
|
2dfc91ac4d | ||
|
|
7375134474 | ||
|
|
175349a224 | ||
|
|
42314d3d75 | ||
|
|
a4f46ced49 | ||
|
|
48d736feef | ||
|
|
2e4a9e21f8 | ||
|
|
59766d289e | ||
|
|
319965a4af | ||
|
|
18ae6a4a0f | ||
|
|
e85eada522 | ||
|
|
def0a8b89d | ||
|
|
2662abedef | ||
|
|
3b79e5196a | ||
|
|
6d71fa96ad | ||
|
|
4761646616 | ||
|
|
bbf0a9a61c | ||
|
|
743eb81908 | ||
|
|
03d3351496 | ||
|
|
328001a417 | ||
|
|
d61ba8e651 |
@@ -1,30 +0,0 @@
|
|||||||
splits:
|
|
||||||
- prefix: "admin"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Admin.git"
|
|
||||||
- prefix: "clamav"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/ClamAV.git"
|
|
||||||
- prefix: "dovecot"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Dovecot.git"
|
|
||||||
- prefix: "fetchmail"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Fetchmail.git"
|
|
||||||
- prefix: "nginx-no-https"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/NGINX-no-HTTPS.git"
|
|
||||||
- prefix: "nginx"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/NGINX.git"
|
|
||||||
- prefix: "postfix"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Postfix.git"
|
|
||||||
- prefix: "radicale"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Radicale.git"
|
|
||||||
- prefix: "rainloop"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/RainLoop.git"
|
|
||||||
- prefix: "rmilter"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Rmilter.git"
|
|
||||||
- prefix: "roundcube"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Roundcube.git"
|
|
||||||
- prefix: "rspamd"
|
|
||||||
target: "https://${GH_TOKEN}@github.com/Mailu/Rspamd.git"
|
|
||||||
|
|
||||||
origins:
|
|
||||||
- ^master$
|
|
||||||
- ^stable$
|
|
||||||
- ^v\d+\.\d+\.\d+$
|
|
||||||
25
.mergify.yml
Normal file
25
.mergify.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
pull_request_rules:
|
||||||
|
- name: Successful travis and 2 approved reviews
|
||||||
|
conditions:
|
||||||
|
- status-success=continuous-integration/travis-ci/pr
|
||||||
|
- label!=["status"/wip","status/blocked"]
|
||||||
|
- "#approved-reviews-by>=2"
|
||||||
|
actions:
|
||||||
|
merge:
|
||||||
|
method: merge
|
||||||
|
strict: true
|
||||||
|
dismiss_reviews:
|
||||||
|
approved: true
|
||||||
|
|
||||||
|
- name: Trusted author, successful travis and 1 approved review
|
||||||
|
conditions:
|
||||||
|
- author~=(kaiyou|muhlemmer|mildred|HorayNarea|adi90x|hoellen|ofthesun9)
|
||||||
|
- status-success=continuous-integration/travis-ci/pr
|
||||||
|
- label!=["status"/wip","status/blocked","review/need2"]
|
||||||
|
- "#approved-reviews-by>=1"
|
||||||
|
actions:
|
||||||
|
merge:
|
||||||
|
method: merge
|
||||||
|
strict: true
|
||||||
|
dismiss_reviews:
|
||||||
|
approved: true
|
||||||
35
.travis.yml
35
.travis.yml
@@ -1,8 +1,37 @@
|
|||||||
|
sudo: required
|
||||||
|
services: docker
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- docker-ce
|
||||||
|
|
||||||
|
env:
|
||||||
|
- MAILU_VERSION=$TRAVIS_BRANCH
|
||||||
language: python
|
language: python
|
||||||
python:
|
python:
|
||||||
- "3.6"
|
- "3.6"
|
||||||
install:
|
install:
|
||||||
- pip install -r docs/requirements.txt
|
- pip install -r tests/requirements.txt
|
||||||
|
- sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
|
||||||
|
- sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- docker-compose -v
|
||||||
|
- docker-compose -f tests/build.yml build
|
||||||
|
- sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*'
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- sphinx-versioning build -b -B 1.5 -r 1.5 -w '^[0-9.]*$' -w master -W '^$' docs/ build/
|
# test.py, test name and timeout between start and tests.
|
||||||
- python docs/conf.py build $DEPLOY_HOST $DEPLOY_USERNAME $DEPLOY_PASSWORD $DEPLOY_REMOTEDIR
|
- python tests/compose/test.py core 1
|
||||||
|
- python tests/compose/test.py fetchmail 1
|
||||||
|
- travis_wait python tests/compose/test.py filters 10
|
||||||
|
- python tests/compose/test.py rainloop 1
|
||||||
|
- python tests/compose/test.py roundcube 1
|
||||||
|
- python tests/compose/test.py webdav 1
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
provider: script
|
||||||
|
script: bash tests/deploy.sh
|
||||||
|
on:
|
||||||
|
all_branches: true
|
||||||
|
condition: -n $DOCKER_UN
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||

|
<p align="leftr"><img src="docs/assets/logomark.png" alt="Mailu" height="200px"></p>
|
||||||
|
|
||||||
|
|
||||||
Mailu is a simple yet full-featured mail server as a set of Docker images.
|
Mailu is a simple yet full-featured mail server as a set of Docker images.
|
||||||
It is free software (both as in free beer and as in free speech), open to
|
It is free software (both as in free beer and as in free speech), open to
|
||||||
@@ -18,7 +19,7 @@ Main features include:
|
|||||||
|
|
||||||
- **Standard email server**, IMAP and IMAP+, SMTP and Submission
|
- **Standard email server**, IMAP and IMAP+, SMTP and Submission
|
||||||
- **Advanced email features**, aliases, domain aliases, custom routing
|
- **Advanced email features**, aliases, domain aliases, custom routing
|
||||||
- **Web access**, multiple Webmails and adminitration interface
|
- **Web access**, multiple Webmails and administration interface
|
||||||
- **User features**, aliases, auto-reply, auto-forward, fetched accounts
|
- **User features**, aliases, auto-reply, auto-forward, fetched accounts
|
||||||
- **Admin features**, global admins, announcements, per-domain delegation, quotas
|
- **Admin features**, global admins, announcements, per-domain delegation, quotas
|
||||||
- **Security**, enforced TLS, Letsencrypt!, outgoing DKIM, anti-virus scanner
|
- **Security**, enforced TLS, Letsencrypt!, outgoing DKIM, anti-virus scanner
|
||||||
|
|||||||
@@ -1,18 +1,28 @@
|
|||||||
FROM python:3-alpine
|
FROM alpine:3.8
|
||||||
|
# python3 shared with most images
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
python3 py3-pip \
|
||||||
|
&& pip3 install --upgrade pip
|
||||||
|
# Image specific layers under this line
|
||||||
RUN mkdir -p /app
|
RUN mkdir -p /app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY requirements-prod.txt requirements.txt
|
COPY requirements-prod.txt requirements.txt
|
||||||
RUN apk --update add --virtual build-dep openssl-dev libffi-dev python-dev build-base \
|
RUN apk add --no-cache openssl curl \
|
||||||
&& pip install -r requirements.txt \
|
&& apk add --no-cache --virtual build-dep openssl-dev libffi-dev python3-dev build-base \
|
||||||
&& apk del build-dep
|
&& pip3 install -r requirements.txt \
|
||||||
|
&& apk del --no-cache build-dep
|
||||||
|
|
||||||
COPY mailu ./mailu
|
COPY mailu ./mailu
|
||||||
COPY migrations ./migrations
|
COPY migrations ./migrations
|
||||||
COPY manage.py .
|
COPY start.py /start.py
|
||||||
COPY start.sh /start.sh
|
|
||||||
|
|
||||||
RUN pybabel compile -d mailu/translations
|
RUN pybabel compile -d mailu/translations
|
||||||
|
|
||||||
CMD ["/start.sh"]
|
EXPOSE 80/tcp
|
||||||
|
VOLUME ["/data","/dkim"]
|
||||||
|
ENV FLASK_APP mailu
|
||||||
|
|
||||||
|
CMD /start.py
|
||||||
|
|
||||||
|
HEALTHCHECK CMD curl -f -L http://localhost/ui/login?next=ui.index || exit 1
|
||||||
|
|||||||
@@ -1,118 +1,56 @@
|
|||||||
import flask
|
import flask
|
||||||
import flask_sqlalchemy
|
|
||||||
import flask_bootstrap
|
import flask_bootstrap
|
||||||
import flask_login
|
|
||||||
import flask_script
|
|
||||||
import flask_migrate
|
|
||||||
import flask_babel
|
|
||||||
import flask_limiter
|
|
||||||
|
|
||||||
import os
|
from mailu import utils, debug, models, manage, configuration
|
||||||
import docker
|
|
||||||
import socket
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
# Create application
|
|
||||||
app = flask.Flask(__name__)
|
|
||||||
|
|
||||||
default_config = {
|
def create_app_from_config(config):
|
||||||
# Specific to the admin UI
|
""" Create a new application based on the given configuration
|
||||||
'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db',
|
"""
|
||||||
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
|
app = flask.Flask(__name__)
|
||||||
'DOCKER_SOCKET': 'unix:///var/run/docker.sock',
|
app.cli.add_command(manage.mailu)
|
||||||
'BABEL_DEFAULT_LOCALE': 'en',
|
|
||||||
'BABEL_DEFAULT_TIMEZONE': 'UTC',
|
|
||||||
'BOOTSTRAP_SERVE_LOCAL': True,
|
|
||||||
'RATELIMIT_STORAGE_URL': 'redis://redis',
|
|
||||||
'DEBUG': False,
|
|
||||||
# Statistics management
|
|
||||||
'INSTANCE_ID_PATH': '/data/instance',
|
|
||||||
'STATS_ENDPOINT': '0.{}.stats.mailu.io',
|
|
||||||
# Common configuration variables
|
|
||||||
'SECRET_KEY': 'changeMe',
|
|
||||||
'DOMAIN': 'mailu.io',
|
|
||||||
'HOSTNAMES': 'mail.mailu.io,alternative.mailu.io,yetanother.mailu.io',
|
|
||||||
'POSTMASTER': 'postmaster',
|
|
||||||
'TLS_FLAVOR': 'cert',
|
|
||||||
'AUTH_RATELIMIT': '10/minute;1000/hour',
|
|
||||||
'DISABLE_STATISTICS': 'False',
|
|
||||||
# Mail settings
|
|
||||||
'DMARC_RUA': None,
|
|
||||||
'DMARC_RUF': None,
|
|
||||||
'WELCOME': 'False',
|
|
||||||
'WELCOME_SUBJECT': 'Dummy welcome topic',
|
|
||||||
'WELCOME_BODY': 'Dummy welcome body',
|
|
||||||
'DKIM_SELECTOR': 'dkim',
|
|
||||||
'DKIM_PATH': '/dkim/{domain}.{selector}.key',
|
|
||||||
# Web settings
|
|
||||||
'SITENAME': 'Mailu',
|
|
||||||
'WEBSITE': 'https://mailu.io',
|
|
||||||
'WEB_ADMIN': '/admin',
|
|
||||||
'WEB_WEBMAIL': '/webmail',
|
|
||||||
# Advanced settings
|
|
||||||
'PASSWORD_SCHEME': 'SHA512-CRYPT',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load configuration from the environment if available
|
# Bootstrap is used for basic JS and CSS loading
|
||||||
for key, value in default_config.items():
|
# TODO: remove this and use statically generated assets instead
|
||||||
app.config[key] = os.environ.get(key, value)
|
app.bootstrap = flask_bootstrap.Bootstrap(app)
|
||||||
|
|
||||||
# Base application
|
# Initialize application extensions
|
||||||
flask_bootstrap.Bootstrap(app)
|
config.init_app(app)
|
||||||
db = flask_sqlalchemy.SQLAlchemy(app)
|
models.db.init_app(app)
|
||||||
migrate = flask_migrate.Migrate(app, db)
|
utils.limiter.init_app(app)
|
||||||
limiter = flask_limiter.Limiter(app, key_func=lambda: current_user.username)
|
utils.babel.init_app(app)
|
||||||
|
utils.login.init_app(app)
|
||||||
|
utils.login.user_loader(models.User.get)
|
||||||
|
utils.proxy.init_app(app)
|
||||||
|
utils.migrate.init_app(app, models.db)
|
||||||
|
|
||||||
# Debugging toolbar
|
# Initialize debugging tools
|
||||||
if app.config.get("DEBUG"):
|
if app.config.get("DEBUG"):
|
||||||
import flask_debugtoolbar
|
debug.toolbar.init_app(app)
|
||||||
toolbar = flask_debugtoolbar.DebugToolbarExtension(app)
|
# TODO: add a specific configuration variable for profiling
|
||||||
|
# debug.profiler.init_app(app)
|
||||||
|
|
||||||
# Manager commnad
|
# Inject the default variables in the Jinja parser
|
||||||
manager = flask_script.Manager(app)
|
# TODO: move this to blueprints when needed
|
||||||
manager.add_command('db', flask_migrate.MigrateCommand)
|
@app.context_processor
|
||||||
|
def inject_defaults():
|
||||||
# Babel configuration
|
signup_domains = models.Domain.query.filter_by(signup_enabled=True).all()
|
||||||
babel = flask_babel.Babel(app)
|
|
||||||
translations = list(map(str, babel.list_translations()))
|
|
||||||
|
|
||||||
@babel.localeselector
|
|
||||||
def get_locale():
|
|
||||||
return flask.request.accept_languages.best_match(translations)
|
|
||||||
|
|
||||||
# Login configuration
|
|
||||||
login_manager = flask_login.LoginManager()
|
|
||||||
login_manager.init_app(app)
|
|
||||||
login_manager.login_view = "ui.login"
|
|
||||||
|
|
||||||
@login_manager.unauthorized_handler
|
|
||||||
def handle_needs_login():
|
|
||||||
return flask.redirect(
|
|
||||||
flask.url_for('ui.login', next=flask.request.endpoint)
|
|
||||||
)
|
|
||||||
|
|
||||||
@app.context_processor
|
|
||||||
def inject_defaults():
|
|
||||||
return dict(
|
return dict(
|
||||||
current_user=flask_login.current_user,
|
signup_domains=signup_domains,
|
||||||
config=app.config
|
config=app.config
|
||||||
)
|
)
|
||||||
|
|
||||||
# Import views
|
# Import views
|
||||||
from mailu import ui, internal
|
from mailu import ui, internal
|
||||||
app.register_blueprint(ui.ui, url_prefix='/ui')
|
app.register_blueprint(ui.ui, url_prefix='/ui')
|
||||||
app.register_blueprint(internal.internal, url_prefix='/internal')
|
app.register_blueprint(internal.internal, url_prefix='/internal')
|
||||||
|
|
||||||
# Create the prefix middleware
|
return app
|
||||||
class PrefixMiddleware(object):
|
|
||||||
|
|
||||||
def __init__(self, app):
|
|
||||||
self.app = app
|
|
||||||
|
|
||||||
def __call__(self, environ, start_response):
|
def create_app():
|
||||||
prefix = environ.get('HTTP_X_FORWARDED_PREFIX', '')
|
""" Create a new application based on the config module
|
||||||
if prefix:
|
"""
|
||||||
environ['SCRIPT_NAME'] = prefix
|
config = configuration.ConfigManager()
|
||||||
return self.app(environ, start_response)
|
return create_app_from_config(config)
|
||||||
|
|
||||||
app.wsgi_app = PrefixMiddleware(app.wsgi_app)
|
|
||||||
|
|||||||
91
core/admin/mailu/configuration.py
Normal file
91
core/admin/mailu/configuration.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
# Specific to the admin UI
|
||||||
|
'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db',
|
||||||
|
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
|
||||||
|
'DOCKER_SOCKET': 'unix:///var/run/docker.sock',
|
||||||
|
'BABEL_DEFAULT_LOCALE': 'en',
|
||||||
|
'BABEL_DEFAULT_TIMEZONE': 'UTC',
|
||||||
|
'BOOTSTRAP_SERVE_LOCAL': True,
|
||||||
|
'RATELIMIT_STORAGE_URL': 'redis://redis/2',
|
||||||
|
'QUOTA_STORAGE_URL': 'redis://redis/1',
|
||||||
|
'DEBUG': False,
|
||||||
|
'DOMAIN_REGISTRATION': False,
|
||||||
|
'TEMPLATES_AUTO_RELOAD': True,
|
||||||
|
# Statistics management
|
||||||
|
'INSTANCE_ID_PATH': '/data/instance',
|
||||||
|
'STATS_ENDPOINT': '0.{}.stats.mailu.io',
|
||||||
|
# Common configuration variables
|
||||||
|
'SECRET_KEY': 'changeMe',
|
||||||
|
'DOMAIN': 'mailu.io',
|
||||||
|
'HOSTNAMES': 'mail.mailu.io,alternative.mailu.io,yetanother.mailu.io',
|
||||||
|
'POSTMASTER': 'postmaster',
|
||||||
|
'TLS_FLAVOR': 'cert',
|
||||||
|
'AUTH_RATELIMIT': '10/minute;1000/hour',
|
||||||
|
'DISABLE_STATISTICS': 'False',
|
||||||
|
# Mail settings
|
||||||
|
'DMARC_RUA': None,
|
||||||
|
'DMARC_RUF': None,
|
||||||
|
'WELCOME': 'False',
|
||||||
|
'WELCOME_SUBJECT': 'Dummy welcome topic',
|
||||||
|
'WELCOME_BODY': 'Dummy welcome body',
|
||||||
|
'DKIM_SELECTOR': 'dkim',
|
||||||
|
'DKIM_PATH': '/dkim/{domain}.{selector}.key',
|
||||||
|
'DEFAULT_QUOTA': 1000000000,
|
||||||
|
# Web settings
|
||||||
|
'SITENAME': 'Mailu',
|
||||||
|
'WEBSITE': 'https://mailu.io',
|
||||||
|
'WEB_ADMIN': '/admin',
|
||||||
|
'WEB_WEBMAIL': '/webmail',
|
||||||
|
'RECAPTCHA_PUBLIC_KEY': '',
|
||||||
|
'RECAPTCHA_PRIVATE_KEY': '',
|
||||||
|
# Advanced settings
|
||||||
|
'PASSWORD_SCHEME': 'BLF-CRYPT',
|
||||||
|
# Host settings
|
||||||
|
'HOST_IMAP': 'imap',
|
||||||
|
'HOST_POP3': 'imap',
|
||||||
|
'HOST_SMTP': 'smtp',
|
||||||
|
'HOST_WEBMAIL': 'webmail',
|
||||||
|
'HOST_FRONT': 'front',
|
||||||
|
'HOST_AUTHSMTP': os.environ.get('HOST_SMTP', 'smtp'),
|
||||||
|
'SUBNET': '192.168.203.0/24',
|
||||||
|
'POD_ADDRESS_RANGE': None
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigManager(dict):
|
||||||
|
""" Naive configuration manager that uses environment only
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.config = dict()
|
||||||
|
|
||||||
|
def init_app(self, app):
|
||||||
|
self.config.update(app.config)
|
||||||
|
self.config.update({
|
||||||
|
key: os.environ.get(key, value)
|
||||||
|
for key, value in DEFAULT_CONFIG.items()
|
||||||
|
})
|
||||||
|
app.config = self
|
||||||
|
|
||||||
|
def setdefault(self, key, value):
|
||||||
|
if key not in self.config:
|
||||||
|
self.config[key] = value
|
||||||
|
return self.config[key]
|
||||||
|
|
||||||
|
def get(self, *args):
|
||||||
|
return self.config.get(*args)
|
||||||
|
|
||||||
|
def keys(self):
|
||||||
|
return self.config.keys()
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.config.get(key)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.config[key] = value
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
return key in self.config
|
||||||
17
core/admin/mailu/debug.py
Normal file
17
core/admin/mailu/debug.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import flask_debugtoolbar
|
||||||
|
|
||||||
|
from werkzeug.contrib import profiler as werkzeug_profiler
|
||||||
|
|
||||||
|
|
||||||
|
# Debugging toolbar
|
||||||
|
toolbar = flask_debugtoolbar.DebugToolbarExtension()
|
||||||
|
|
||||||
|
|
||||||
|
# Profiler
|
||||||
|
class Profiler(object):
|
||||||
|
def init_app(self, app):
|
||||||
|
app.wsgi_app = werkzeug_profiler.ProfilerMiddleware(
|
||||||
|
app.wsgi_app, restrictions=[30]
|
||||||
|
)
|
||||||
|
|
||||||
|
profiler = Profiler()
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
from mailu import app
|
|
||||||
|
|
||||||
import docker
|
|
||||||
import signal
|
|
||||||
|
|
||||||
|
|
||||||
# Connect to the Docker socket
|
|
||||||
cli = docker.Client(base_url=app.config['DOCKER_SOCKET'])
|
|
||||||
|
|
||||||
|
|
||||||
def get(*names):
|
|
||||||
result = {}
|
|
||||||
all_containers = cli.containers(all=True)
|
|
||||||
for brief in all_containers:
|
|
||||||
if brief['Image'].startswith('mailu/'):
|
|
||||||
container = cli.inspect_container(brief['Id'])
|
|
||||||
container['Image'] = cli.inspect_image(container['Image'])
|
|
||||||
name = container['Config']['Labels']['com.docker.compose.service']
|
|
||||||
if not names or name in names:
|
|
||||||
result[name] = container
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def reload(*names):
|
|
||||||
for name, container in get(*names).items():
|
|
||||||
cli.kill(container["Id"], signal.SIGHUP.value)
|
|
||||||
@@ -1,13 +1,25 @@
|
|||||||
from mailu import limiter
|
from flask_limiter import RateLimitExceeded
|
||||||
|
|
||||||
|
from mailu import utils
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
import flask
|
import flask
|
||||||
|
|
||||||
|
|
||||||
internal = flask.Blueprint('internal', __name__)
|
internal = flask.Blueprint('internal', __name__, template_folder='templates')
|
||||||
|
|
||||||
|
|
||||||
@limiter.request_filter
|
@internal.app_errorhandler(RateLimitExceeded)
|
||||||
|
def rate_limit_handler(e):
|
||||||
|
response = flask.Response()
|
||||||
|
response.headers['Auth-Status'] = 'Authentication rate limit from one source exceeded'
|
||||||
|
response.headers['Auth-Error-Code'] = '451 4.3.2'
|
||||||
|
if int(flask.request.headers['Auth-Login-Attempt']) < 10:
|
||||||
|
response.headers['Auth-Wait'] = '3'
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@utils.limiter.request_filter
|
||||||
def whitelist_webmail():
|
def whitelist_webmail():
|
||||||
try:
|
try:
|
||||||
return flask.request.headers["Client-Ip"] ==\
|
return flask.request.headers["Client-Ip"] ==\
|
||||||
@@ -16,4 +28,4 @@ def whitelist_webmail():
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
from mailu.internal import views
|
from mailu.internal.views import *
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
|
import re
|
||||||
import socket
|
import socket
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
@@ -50,7 +52,7 @@ def handle_authentication(headers):
|
|||||||
status = False
|
status = False
|
||||||
elif protocol == "pop3" and not user.enable_pop:
|
elif protocol == "pop3" and not user.enable_pop:
|
||||||
status = False
|
status = False
|
||||||
if status:
|
if status and user.enabled:
|
||||||
return {
|
return {
|
||||||
"Auth-Status": "OK",
|
"Auth-Status": "OK",
|
||||||
"Auth-Server": server,
|
"Auth-Server": server,
|
||||||
@@ -73,14 +75,19 @@ def get_status(protocol, status):
|
|||||||
status, codes = STATUSES[status]
|
status, codes = STATUSES[status]
|
||||||
return status, codes[protocol]
|
return status, codes[protocol]
|
||||||
|
|
||||||
|
def extract_host_port(host_and_port, default_port):
|
||||||
|
host, _, port = re.match('^(.*)(:([0-9]*))?$', host_and_port).groups()
|
||||||
|
return host, int(port) if port else default_port
|
||||||
|
|
||||||
def get_server(protocol, authenticated=False):
|
def get_server(protocol, authenticated=False):
|
||||||
if protocol == "imap":
|
if protocol == "imap":
|
||||||
hostname, port = "imap", 143
|
hostname, port = extract_host_port(app.config['HOST_IMAP'], 143)
|
||||||
elif protocol == "pop3":
|
elif protocol == "pop3":
|
||||||
hostname, port = "imap", 110
|
hostname, port = extract_host_port(app.config['HOST_POP3'], 110)
|
||||||
elif protocol == "smtp":
|
elif protocol == "smtp":
|
||||||
hostname = "smtp"
|
if authenticated:
|
||||||
port = 10025 if authenticated else 25
|
hostname, port = extract_host_port(app.config['HOST_AUTHSMTP'], 10025)
|
||||||
|
else:
|
||||||
|
hostname, port = extract_host_port(app.config['HOST_SMTP'], 25)
|
||||||
address = socket.gethostbyname(hostname)
|
address = socket.gethostbyname(hostname)
|
||||||
return address, port
|
return address, port
|
||||||
|
|||||||
37
core/admin/mailu/internal/templates/default.sieve
Normal file
37
core/admin/mailu/internal/templates/default.sieve
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
require "variables";
|
||||||
|
require "vacation";
|
||||||
|
require "fileinto";
|
||||||
|
require "envelope";
|
||||||
|
require "mailbox";
|
||||||
|
require "imap4flags";
|
||||||
|
require "regex";
|
||||||
|
require "relational";
|
||||||
|
require "date";
|
||||||
|
require "comparator-i;ascii-numeric";
|
||||||
|
require "spamtestplus";
|
||||||
|
require "editheader";
|
||||||
|
require "index";
|
||||||
|
|
||||||
|
if header :index 2 :matches "Received" "from * by * for <*>; *"
|
||||||
|
{
|
||||||
|
deleteheader "Delivered-To";
|
||||||
|
addheader "Delivered-To" "<${3}>";
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if user.spam_enabled %}
|
||||||
|
if spamtest :percent :value "gt" :comparator "i;ascii-numeric" "{{ user.spam_threshold }}"
|
||||||
|
{
|
||||||
|
setflag "\\seen";
|
||||||
|
fileinto :create "Junk";
|
||||||
|
stop;
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
if exists "X-Virus" {
|
||||||
|
discard;
|
||||||
|
stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if user.reply_active %}
|
||||||
|
vacation :days 1 :subject "{{ user.reply_subject }}" "{{ user.reply_body }}";
|
||||||
|
{% endif %}
|
||||||
3
core/admin/mailu/internal/views/__init__.py
Normal file
3
core/admin/mailu/internal/views/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
__all__ = [
|
||||||
|
'auth', 'postfix', 'dovecot', 'fetch'
|
||||||
|
]
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
from mailu import db, models, app, limiter
|
from mailu import models, utils
|
||||||
from mailu.internal import internal, nginx
|
from mailu.internal import internal, nginx
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
import flask_login
|
import flask_login
|
||||||
import base64
|
import base64
|
||||||
import urllib
|
|
||||||
|
|
||||||
|
|
||||||
@internal.route("/auth/email")
|
@internal.route("/auth/email")
|
||||||
@limiter.limit(
|
@utils.limiter.limit(
|
||||||
app.config["AUTH_RATELIMIT"],
|
lambda: app.config["AUTH_RATELIMIT"],
|
||||||
lambda: flask.request.headers["Client-Ip"]
|
lambda: flask.request.headers["Client-Ip"]
|
||||||
)
|
)
|
||||||
def nginx_authentication():
|
def nginx_authentication():
|
||||||
@@ -27,7 +27,8 @@ def admin_authentication():
|
|||||||
""" Fails if the user is not an authenticated admin.
|
""" Fails if the user is not an authenticated admin.
|
||||||
"""
|
"""
|
||||||
if (not flask_login.current_user.is_anonymous
|
if (not flask_login.current_user.is_anonymous
|
||||||
and flask_login.current_user.global_admin):
|
and flask_login.current_user.global_admin
|
||||||
|
and flask_login.current_user.enabled):
|
||||||
return ""
|
return ""
|
||||||
return flask.abort(403)
|
return flask.abort(403)
|
||||||
|
|
||||||
@@ -41,7 +42,7 @@ def basic_authentication():
|
|||||||
encoded = authorization.replace("Basic ", "")
|
encoded = authorization.replace("Basic ", "")
|
||||||
user_email, password = base64.b64decode(encoded).split(b":")
|
user_email, password = base64.b64decode(encoded).split(b":")
|
||||||
user = models.User.query.get(user_email.decode("utf8"))
|
user = models.User.query.get(user_email.decode("utf8"))
|
||||||
if user and user.check_password(password.decode("utf8")):
|
if user and user.enabled and user.check_password(password.decode("utf8")):
|
||||||
response = flask.Response()
|
response = flask.Response()
|
||||||
response.headers["X-User"] = user.email
|
response.headers["X-User"] = user.email
|
||||||
return response
|
return response
|
||||||
48
core/admin/mailu/internal/views/dovecot.py
Normal file
48
core/admin/mailu/internal/views/dovecot.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
from mailu import models
|
||||||
|
from mailu.internal import internal
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
|
import flask
|
||||||
|
import socket
|
||||||
|
import os
|
||||||
|
|
||||||
|
@internal.route("/dovecot/passdb/<user_email>")
|
||||||
|
def dovecot_passdb_dict(user_email):
|
||||||
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
|
allow_nets = []
|
||||||
|
allow_nets.append(app.config["SUBNET"])
|
||||||
|
if app.config["POD_ADDRESS_RANGE"]:
|
||||||
|
allow_nets.append(app.config["POD_ADDRESS_RANGE"])
|
||||||
|
return flask.jsonify({
|
||||||
|
"password": None,
|
||||||
|
"nopassword": "Y",
|
||||||
|
"allow_nets": ",".join(allow_nets)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/dovecot/userdb/<user_email>")
|
||||||
|
def dovecot_userdb_dict(user_email):
|
||||||
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
|
return flask.jsonify({
|
||||||
|
"quota_rule": "*:bytes={}".format(user.quota_bytes)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/dovecot/quota/<ns>/<user_email>", methods=["POST"])
|
||||||
|
def dovecot_quota(ns, user_email):
|
||||||
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
|
if ns == "storage":
|
||||||
|
user.quota_bytes_used = flask.request.get_json()
|
||||||
|
models.db.session.commit()
|
||||||
|
return flask.jsonify(None)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/dovecot/sieve/name/<script>/<user_email>")
|
||||||
|
def dovecot_sieve_name(script, user_email):
|
||||||
|
return flask.jsonify(script)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/dovecot/sieve/data/default/<user_email>")
|
||||||
|
def dovecot_sieve_data(user_email):
|
||||||
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
|
return flask.jsonify(flask.render_template("default.sieve", user=user))
|
||||||
32
core/admin/mailu/internal/views/fetch.py
Normal file
32
core/admin/mailu/internal/views/fetch.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
from mailu import models
|
||||||
|
from mailu.internal import internal
|
||||||
|
|
||||||
|
import flask
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/fetch")
|
||||||
|
def fetch_list():
|
||||||
|
return flask.jsonify([
|
||||||
|
{
|
||||||
|
"id": fetch.id,
|
||||||
|
"tls": fetch.tls,
|
||||||
|
"keep": fetch.keep,
|
||||||
|
"user_email": fetch.user_email,
|
||||||
|
"protocol": fetch.protocol,
|
||||||
|
"host": fetch.host,
|
||||||
|
"port": fetch.port,
|
||||||
|
"username": fetch.username,
|
||||||
|
"password": fetch.password
|
||||||
|
} for fetch in models.Fetch.query.all()
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/fetch/<fetch_id>", methods=["POST"])
|
||||||
|
def fetch_done(fetch_id):
|
||||||
|
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
|
||||||
|
fetch.last_check = datetime.datetime.now()
|
||||||
|
fetch.error_message = str(flask.request.get_json())
|
||||||
|
models.db.session.add(fetch)
|
||||||
|
models.db.session.commit()
|
||||||
|
return ""
|
||||||
53
core/admin/mailu/internal/views/postfix.py
Normal file
53
core/admin/mailu/internal/views/postfix.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
from mailu import models
|
||||||
|
from mailu.internal import internal
|
||||||
|
|
||||||
|
import flask
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/domain/<domain_name>")
|
||||||
|
def postfix_mailbox_domain(domain_name):
|
||||||
|
domain = models.Domain.query.get(domain_name) or \
|
||||||
|
models.Alternative.query.get(domain_name) or \
|
||||||
|
flask.abort(404)
|
||||||
|
return flask.jsonify(domain.name)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/mailbox/<email>")
|
||||||
|
def postfix_mailbox_map(email):
|
||||||
|
user = models.User.query.get(email) or flask.abort(404)
|
||||||
|
return flask.jsonify(user.email)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/alias/<alias>")
|
||||||
|
def postfix_alias_map(alias):
|
||||||
|
localpart, domain_name = models.Email.resolve_domain(alias)
|
||||||
|
if localpart is None:
|
||||||
|
return flask.jsonify(domain_name)
|
||||||
|
destination = models.Email.resolve_destination(localpart, domain_name)
|
||||||
|
return flask.jsonify(",".join(destination)) if destination else flask.abort(404)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/transport/<email>")
|
||||||
|
def postfix_transport(email):
|
||||||
|
if email == '*':
|
||||||
|
return flask.abort(404)
|
||||||
|
localpart, domain_name = models.Email.resolve_domain(email)
|
||||||
|
relay = models.Relay.query.get(domain_name) or flask.abort(404)
|
||||||
|
return flask.jsonify("smtp:[{}]".format(relay.smtp))
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/sender/login/<sender>")
|
||||||
|
def postfix_sender_login(sender):
|
||||||
|
localpart, domain_name = models.Email.resolve_domain(sender)
|
||||||
|
if localpart is None:
|
||||||
|
return flask.abort(404)
|
||||||
|
destination = models.Email.resolve_destination(localpart, domain_name, True)
|
||||||
|
return flask.jsonify(",".join(destination)) if destination else flask.abort(404)
|
||||||
|
|
||||||
|
|
||||||
|
@internal.route("/postfix/sender/access/<sender>")
|
||||||
|
def postfix_sender_access(sender):
|
||||||
|
""" Simply reject any sender that pretends to be from a local domain
|
||||||
|
"""
|
||||||
|
localpart, domain_name = models.Email.resolve_domain(sender)
|
||||||
|
return flask.jsonify("REJECT") if models.Domain.query.get(domain_name) else flask.abort(404)
|
||||||
@@ -1,11 +1,26 @@
|
|||||||
from mailu import app, manager, db, models
|
from mailu import models
|
||||||
|
|
||||||
|
from flask import current_app as app
|
||||||
|
from flask import cli as flask_cli
|
||||||
|
|
||||||
|
import flask
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import uuid
|
import uuid
|
||||||
|
import click
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
db = models.db
|
||||||
|
|
||||||
|
|
||||||
|
@click.group()
|
||||||
|
def mailu(cls=flask_cli.FlaskGroup):
|
||||||
|
""" Mailu command line
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@mailu.command()
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def advertise():
|
def advertise():
|
||||||
""" Advertise this server against statistic services.
|
""" Advertise this server against statistic services.
|
||||||
"""
|
"""
|
||||||
@@ -23,7 +38,11 @@ def advertise():
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
|
@click.argument('localpart')
|
||||||
|
@click.argument('domain_name')
|
||||||
|
@click.argument('password')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def admin(localpart, domain_name, password):
|
def admin(localpart, domain_name, password):
|
||||||
""" Create an admin user
|
""" Create an admin user
|
||||||
"""
|
"""
|
||||||
@@ -41,11 +60,17 @@ def admin(localpart, domain_name, password):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
def user(localpart, domain_name, password,
|
@click.argument('localpart')
|
||||||
hash_scheme=app.config['PASSWORD_SCHEME']):
|
@click.argument('domain_name')
|
||||||
|
@click.argument('password')
|
||||||
|
@click.argument('hash_scheme')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
|
def user(localpart, domain_name, password, hash_scheme=None):
|
||||||
""" Create a user
|
""" Create a user
|
||||||
"""
|
"""
|
||||||
|
if hash_scheme is None:
|
||||||
|
hash_scheme = app.config['PASSWORD_SCHEME']
|
||||||
domain = models.Domain.query.get(domain_name)
|
domain = models.Domain.query.get(domain_name)
|
||||||
if not domain:
|
if not domain:
|
||||||
domain = models.Domain(name=domain_name)
|
domain = models.Domain(name=domain_name)
|
||||||
@@ -60,10 +85,12 @@ def user(localpart, domain_name, password,
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.option('-n', '--domain_name', dest='domain_name')
|
@mailu.command()
|
||||||
@manager.option('-u', '--max_users', dest='max_users')
|
@click.option('-n', '--domain_name')
|
||||||
@manager.option('-a', '--max_aliases', dest='max_aliases')
|
@click.option('-u', '--max_users')
|
||||||
@manager.option('-q', '--max_quota_bytes', dest='max_quota_bytes')
|
@click.option('-a', '--max_aliases')
|
||||||
|
@click.option('-q', '--max_quota_bytes')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
|
def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
|
||||||
domain = models.Domain.query.get(domain_name)
|
domain = models.Domain.query.get(domain_name)
|
||||||
if not domain:
|
if not domain:
|
||||||
@@ -72,15 +99,17 @@ def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
def user_import(localpart, domain_name, password_hash,
|
@click.argument('localpart')
|
||||||
hash_scheme=app.config['PASSWORD_SCHEME']):
|
@click.argument('domain_name')
|
||||||
""" Import a user along with password hash. Available hashes:
|
@click.argument('password_hash')
|
||||||
'SHA512-CRYPT'
|
@click.argument('hash_scheme')
|
||||||
'SHA256-CRYPT'
|
@flask_cli.with_appcontext
|
||||||
'MD5-CRYPT'
|
def user_import(localpart, domain_name, password_hash, hash_scheme = None):
|
||||||
'CRYPT'
|
""" Import a user along with password hash.
|
||||||
"""
|
"""
|
||||||
|
if hash_scheme is None:
|
||||||
|
hash_scheme = app.config['PASSWORD_SCHEME']
|
||||||
domain = models.Domain.query.get(domain_name)
|
domain = models.Domain.query.get(domain_name)
|
||||||
if not domain:
|
if not domain:
|
||||||
domain = models.Domain(name=domain_name)
|
domain = models.Domain(name=domain_name)
|
||||||
@@ -95,7 +124,10 @@ def user_import(localpart, domain_name, password_hash,
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
|
@click.option('-v', '--verbose')
|
||||||
|
@click.option('-d', '--delete_objects')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def config_update(verbose=False, delete_objects=False):
|
def config_update(verbose=False, delete_objects=False):
|
||||||
"""sync configuration with data from YAML-formatted stdin"""
|
"""sync configuration with data from YAML-formatted stdin"""
|
||||||
import yaml
|
import yaml
|
||||||
@@ -234,7 +266,9 @@ def config_update(verbose=False, delete_objects=False):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
|
@click.argument('email')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def user_delete(email):
|
def user_delete(email):
|
||||||
"""delete user"""
|
"""delete user"""
|
||||||
user = models.User.query.get(email)
|
user = models.User.query.get(email)
|
||||||
@@ -243,7 +277,9 @@ def user_delete(email):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
|
@click.argument('email')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def alias_delete(email):
|
def alias_delete(email):
|
||||||
"""delete alias"""
|
"""delete alias"""
|
||||||
alias = models.Alias.query.get(email)
|
alias = models.Alias.query.get(email)
|
||||||
@@ -252,7 +288,11 @@ def alias_delete(email):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@manager.command
|
@mailu.command()
|
||||||
|
@click.argument('localpart')
|
||||||
|
@click.argument('domain_name')
|
||||||
|
@click.argument('destination')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def alias(localpart, domain_name, destination):
|
def alias(localpart, domain_name, destination):
|
||||||
""" Create an alias
|
""" Create an alias
|
||||||
"""
|
"""
|
||||||
@@ -269,24 +309,31 @@ def alias(localpart, domain_name, destination):
|
|||||||
db.session.add(alias)
|
db.session.add(alias)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
# Set limits to a domain
|
|
||||||
|
|
||||||
|
@mailu.command()
|
||||||
@manager.command
|
@click.argument('domain_name')
|
||||||
|
@click.argument('max_users')
|
||||||
|
@click.argument('max_aliases')
|
||||||
|
@click.argument('max_quota_bytes')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def setlimits(domain_name, max_users, max_aliases, max_quota_bytes):
|
def setlimits(domain_name, max_users, max_aliases, max_quota_bytes):
|
||||||
|
""" Set domain limits
|
||||||
|
"""
|
||||||
domain = models.Domain.query.get(domain_name)
|
domain = models.Domain.query.get(domain_name)
|
||||||
domain.max_users = max_users
|
domain.max_users = max_users
|
||||||
domain.max_aliases = max_aliases
|
domain.max_aliases = max_aliases
|
||||||
domain.max_quota_bytes = max_quota_bytes
|
domain.max_quota_bytes = max_quota_bytes
|
||||||
|
|
||||||
db.session.add(domain)
|
db.session.add(domain)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
# Make the user manager of a domain
|
|
||||||
|
|
||||||
|
@mailu.command()
|
||||||
@manager.command
|
@click.argument('domain_name')
|
||||||
|
@click.argument('user_name')
|
||||||
|
@flask_cli.with_appcontext
|
||||||
def setmanager(domain_name, user_name='manager'):
|
def setmanager(domain_name, user_name='manager'):
|
||||||
|
""" Make a user manager of a domain
|
||||||
|
"""
|
||||||
domain = models.Domain.query.get(domain_name)
|
domain = models.Domain.query.get(domain_name)
|
||||||
manageruser = models.User.query.get(user_name + '@' + domain_name)
|
manageruser = models.User.query.get(user_name + '@' + domain_name)
|
||||||
domain.managers.append(manageruser)
|
domain.managers.append(manageruser)
|
||||||
@@ -294,5 +341,5 @@ def setmanager(domain_name, user_name='manager'):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == '__main__':
|
||||||
manager.run()
|
cli()
|
||||||
@@ -1,23 +1,60 @@
|
|||||||
from mailu import app, db, dkim, login_manager
|
from mailu import dkim
|
||||||
|
|
||||||
from sqlalchemy.ext import declarative
|
from sqlalchemy.ext import declarative
|
||||||
from passlib import context, hash
|
from passlib import context, hash
|
||||||
from datetime import datetime, date
|
from datetime import datetime, date
|
||||||
from email.mime import text
|
from email.mime import text
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
|
import flask_sqlalchemy
|
||||||
|
import sqlalchemy
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
import glob
|
import glob
|
||||||
import smtplib
|
import smtplib
|
||||||
|
import idna
|
||||||
|
import dns
|
||||||
|
|
||||||
|
|
||||||
# Many-to-many association table for domain managers
|
db = flask_sqlalchemy.SQLAlchemy()
|
||||||
managers = db.Table('manager',
|
|
||||||
db.Column('domain_name', db.String(80), db.ForeignKey('domain.name')),
|
|
||||||
db.Column('user_email', db.String(255), db.ForeignKey('user.email'))
|
class IdnaDomain(db.TypeDecorator):
|
||||||
)
|
""" Stores a Unicode string in it's IDNA representation (ASCII only)
|
||||||
|
"""
|
||||||
|
|
||||||
|
impl = db.String(80)
|
||||||
|
|
||||||
|
def process_bind_param(self, value, dialect):
|
||||||
|
return idna.encode(value).decode("ascii")
|
||||||
|
|
||||||
|
def process_result_value(self, value, dialect):
|
||||||
|
return idna.decode(value)
|
||||||
|
|
||||||
|
|
||||||
|
class IdnaEmail(db.TypeDecorator):
|
||||||
|
""" Stores a Unicode string in it's IDNA representation (ASCII only)
|
||||||
|
"""
|
||||||
|
|
||||||
|
impl = db.String(255, collation="NOCASE")
|
||||||
|
|
||||||
|
def process_bind_param(self, value, dialect):
|
||||||
|
try:
|
||||||
|
localpart, domain_name = value.split('@')
|
||||||
|
return "{0}@{1}".format(
|
||||||
|
localpart,
|
||||||
|
idna.encode(domain_name).decode('ascii'),
|
||||||
|
)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def process_result_value(self, value, dialect):
|
||||||
|
localpart, domain_name = value.split('@')
|
||||||
|
return "{0}@{1}".format(
|
||||||
|
localpart,
|
||||||
|
idna.decode(domain_name),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CommaSeparatedList(db.TypeDecorator):
|
class CommaSeparatedList(db.TypeDecorator):
|
||||||
@@ -35,7 +72,35 @@ class CommaSeparatedList(db.TypeDecorator):
|
|||||||
return ",".join(value)
|
return ",".join(value)
|
||||||
|
|
||||||
def process_result_value(self, value, dialect):
|
def process_result_value(self, value, dialect):
|
||||||
return filter(bool, value.split(","))
|
return filter(bool, value.split(",")) if value else []
|
||||||
|
|
||||||
|
|
||||||
|
class JSONEncoded(db.TypeDecorator):
|
||||||
|
"""Represents an immutable structure as a json-encoded string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
impl = db.String
|
||||||
|
|
||||||
|
def process_bind_param(self, value, dialect):
|
||||||
|
return json.dumps(value) if value else None
|
||||||
|
|
||||||
|
def process_result_value(self, value, dialect):
|
||||||
|
return json.loads(value) if value else None
|
||||||
|
|
||||||
|
|
||||||
|
class Config(db.Model):
|
||||||
|
""" In-database configuration values
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = db.Column(db.String(255), primary_key=True, nullable=False)
|
||||||
|
value = db.Column(JSONEncoded)
|
||||||
|
|
||||||
|
|
||||||
|
# Many-to-many association table for domain managers
|
||||||
|
managers = db.Table('manager',
|
||||||
|
db.Column('domain_name', IdnaDomain, db.ForeignKey('domain.name')),
|
||||||
|
db.Column('user_email', IdnaEmail, db.ForeignKey('user.email'))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Base(db.Model):
|
class Base(db.Model):
|
||||||
@@ -54,12 +119,13 @@ class Domain(Base):
|
|||||||
"""
|
"""
|
||||||
__tablename__ = "domain"
|
__tablename__ = "domain"
|
||||||
|
|
||||||
name = db.Column(db.String(80), primary_key=True, nullable=False)
|
name = db.Column(IdnaDomain, primary_key=True, nullable=False)
|
||||||
managers = db.relationship('User', secondary=managers,
|
managers = db.relationship('User', secondary=managers,
|
||||||
backref=db.backref('manager_of'), lazy='dynamic')
|
backref=db.backref('manager_of'), lazy='dynamic')
|
||||||
max_users = db.Column(db.Integer, nullable=False, default=0)
|
max_users = db.Column(db.Integer, nullable=False, default=0)
|
||||||
max_aliases = db.Column(db.Integer, nullable=False, default=0)
|
max_aliases = db.Column(db.Integer, nullable=False, default=0)
|
||||||
max_quota_bytes = db.Column(db.Integer(), nullable=False, default=0)
|
max_quota_bytes = db.Column(db.Integer(), nullable=False, default=0)
|
||||||
|
signup_enabled = db.Column(db.Boolean(), nullable=False, default=False)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dkim_key(self):
|
def dkim_key(self):
|
||||||
@@ -92,6 +158,16 @@ class Domain(Base):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def check_mx(self):
|
||||||
|
try:
|
||||||
|
hostnames = app.config['HOSTNAMES'].split(',')
|
||||||
|
return any(
|
||||||
|
str(rset).split()[-1][:-1] in hostnames
|
||||||
|
for rset in dns.resolver.query(self.name, 'MX')
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
return False
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
@@ -109,8 +185,8 @@ class Alternative(Base):
|
|||||||
|
|
||||||
__tablename__ = "alternative"
|
__tablename__ = "alternative"
|
||||||
|
|
||||||
name = db.Column(db.String(80), primary_key=True, nullable=False)
|
name = db.Column(IdnaDomain, primary_key=True, nullable=False)
|
||||||
domain_name = db.Column(db.String(80), db.ForeignKey(Domain.name))
|
domain_name = db.Column(IdnaDomain, db.ForeignKey(Domain.name))
|
||||||
domain = db.relationship(Domain,
|
domain = db.relationship(Domain,
|
||||||
backref=db.backref('alternatives', cascade='all, delete-orphan'))
|
backref=db.backref('alternatives', cascade='all, delete-orphan'))
|
||||||
|
|
||||||
@@ -140,33 +216,62 @@ class Email(object):
|
|||||||
|
|
||||||
@declarative.declared_attr
|
@declarative.declared_attr
|
||||||
def domain_name(cls):
|
def domain_name(cls):
|
||||||
return db.Column(db.String(80), db.ForeignKey(Domain.name),
|
return db.Column(IdnaDomain, db.ForeignKey(Domain.name),
|
||||||
nullable=False)
|
nullable=False, default=IdnaDomain)
|
||||||
|
|
||||||
# This field is redundant with both localpart and domain name.
|
# This field is redundant with both localpart and domain name.
|
||||||
# It is however very useful for quick lookups without joining tables,
|
# It is however very useful for quick lookups without joining tables,
|
||||||
# especially when the mail server il reading the database.
|
# especially when the mail server is reading the database.
|
||||||
@declarative.declared_attr
|
@declarative.declared_attr
|
||||||
def email(cls):
|
def email(cls):
|
||||||
updater = lambda context: "{0}@{1}".format(
|
updater = lambda context: "{0}@{1}".format(
|
||||||
context.current_parameters["localpart"],
|
context.current_parameters["localpart"],
|
||||||
context.current_parameters["domain_name"],
|
context.current_parameters["domain_name"],
|
||||||
)
|
)
|
||||||
return db.Column(db.String(255, collation="NOCASE"),
|
return db.Column(IdnaEmail,
|
||||||
primary_key=True, nullable=False,
|
primary_key=True, nullable=False,
|
||||||
default=updater)
|
default=updater)
|
||||||
|
|
||||||
def sendmail(self, subject, body):
|
def sendmail(self, subject, body):
|
||||||
""" Send an email to the address.
|
""" Send an email to the address.
|
||||||
"""
|
"""
|
||||||
from_address = '{}@{}'.format(
|
from_address = "{0}@{1}".format(
|
||||||
app.config['POSTMASTER'], app.config['DOMAIN'])
|
app.config['POSTMASTER'],
|
||||||
with smtplib.SMTP('smtp', port=10025) as smtp:
|
idna.encode(app.config['DOMAIN']).decode('ascii'),
|
||||||
|
)
|
||||||
|
with smtplib.SMTP(app.config['HOST_AUTHSMTP'], port=10025) as smtp:
|
||||||
|
to_address = "{0}@{1}".format(
|
||||||
|
self.localpart,
|
||||||
|
idna.encode(self.domain_name).decode('ascii'),
|
||||||
|
)
|
||||||
msg = text.MIMEText(body)
|
msg = text.MIMEText(body)
|
||||||
msg['Subject'] = subject
|
msg['Subject'] = subject
|
||||||
msg['From'] = from_address
|
msg['From'] = from_address
|
||||||
msg['To'] = self.email
|
msg['To'] = to_address
|
||||||
smtp.sendmail(from_address, [self.email], msg.as_string())
|
smtp.sendmail(from_address, [to_address], msg.as_string())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resolve_domain(cls, email):
|
||||||
|
localpart, domain_name = email.split('@', 1) if '@' in email else (None, email)
|
||||||
|
alternative = Alternative.query.get(domain_name)
|
||||||
|
if alternative:
|
||||||
|
domain_name = alternative.domain_name
|
||||||
|
return (localpart, domain_name)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resolve_destination(cls, localpart, domain_name, ignore_forward_keep=False):
|
||||||
|
alias = Alias.resolve(localpart, domain_name)
|
||||||
|
if alias:
|
||||||
|
return alias.destination
|
||||||
|
user = User.query.get('{}@{}'.format(localpart, domain_name))
|
||||||
|
if user:
|
||||||
|
if user.forward_enabled:
|
||||||
|
destination = user.forward_destination
|
||||||
|
if user.forward_keep or ignore_forward_keep:
|
||||||
|
destination.append(user.email)
|
||||||
|
else:
|
||||||
|
destination = [user.email]
|
||||||
|
return destination
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.email
|
return self.email
|
||||||
@@ -181,7 +286,9 @@ class User(Base, Email):
|
|||||||
backref=db.backref('users', cascade='all, delete-orphan'))
|
backref=db.backref('users', cascade='all, delete-orphan'))
|
||||||
password = db.Column(db.String(255), nullable=False)
|
password = db.Column(db.String(255), nullable=False)
|
||||||
quota_bytes = db.Column(db.Integer(), nullable=False, default=10**9)
|
quota_bytes = db.Column(db.Integer(), nullable=False, default=10**9)
|
||||||
|
quota_bytes_used = db.Column(db.Integer(), nullable=False, default=0)
|
||||||
global_admin = db.Column(db.Boolean(), nullable=False, default=False)
|
global_admin = db.Column(db.Boolean(), nullable=False, default=False)
|
||||||
|
enabled = db.Column(db.Boolean(), nullable=False, default=True)
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
enable_imap = db.Column(db.Boolean(), nullable=False, default=True)
|
enable_imap = db.Column(db.Boolean(), nullable=False, default=True)
|
||||||
@@ -189,11 +296,13 @@ class User(Base, Email):
|
|||||||
|
|
||||||
# Filters
|
# Filters
|
||||||
forward_enabled = db.Column(db.Boolean(), nullable=False, default=False)
|
forward_enabled = db.Column(db.Boolean(), nullable=False, default=False)
|
||||||
forward_destination = db.Column(db.String(255), nullable=True, default=None)
|
forward_destination = db.Column(CommaSeparatedList(), nullable=True, default=[])
|
||||||
forward_keep = db.Column(db.Boolean(), nullable=False, default=True)
|
forward_keep = db.Column(db.Boolean(), nullable=False, default=True)
|
||||||
reply_enabled = db.Column(db.Boolean(), nullable=False, default=False)
|
reply_enabled = db.Column(db.Boolean(), nullable=False, default=False)
|
||||||
reply_subject = db.Column(db.String(255), nullable=True, default=None)
|
reply_subject = db.Column(db.String(255), nullable=True, default=None)
|
||||||
reply_body = db.Column(db.Text(), nullable=True, default=None)
|
reply_body = db.Column(db.Text(), nullable=True, default=None)
|
||||||
|
reply_startdate = db.Column(db.Date, nullable=False,
|
||||||
|
default=date(1900, 1, 1))
|
||||||
reply_enddate = db.Column(db.Date, nullable=False,
|
reply_enddate = db.Column(db.Date, nullable=False,
|
||||||
default=date(2999, 12, 31))
|
default=date(2999, 12, 31))
|
||||||
|
|
||||||
@@ -210,28 +319,59 @@ class User(Base, Email):
|
|||||||
def get_id(self):
|
def get_id(self):
|
||||||
return self.email
|
return self.email
|
||||||
|
|
||||||
scheme_dict = {'SHA512-CRYPT': "sha512_crypt",
|
@property
|
||||||
|
def destination(self):
|
||||||
|
if self.forward_enabled:
|
||||||
|
result = self.forward_destination
|
||||||
|
if self.forward_keep:
|
||||||
|
result += ',' + self.email
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
return self.email
|
||||||
|
|
||||||
|
@property
|
||||||
|
def reply_active(self):
|
||||||
|
now = date.today()
|
||||||
|
return (
|
||||||
|
self.reply_enabled and
|
||||||
|
self.reply_startdate < now and
|
||||||
|
self.reply_enddate > now
|
||||||
|
)
|
||||||
|
|
||||||
|
scheme_dict = {'PBKDF2': "pbkdf2_sha512",
|
||||||
|
'BLF-CRYPT': "bcrypt",
|
||||||
|
'SHA512-CRYPT': "sha512_crypt",
|
||||||
'SHA256-CRYPT': "sha256_crypt",
|
'SHA256-CRYPT': "sha256_crypt",
|
||||||
'MD5-CRYPT': "md5_crypt",
|
'MD5-CRYPT': "md5_crypt",
|
||||||
'CRYPT': "des_crypt"}
|
'CRYPT': "des_crypt"}
|
||||||
pw_context = context.CryptContext(
|
|
||||||
schemes = scheme_dict.values(),
|
def get_password_context(self):
|
||||||
default=scheme_dict[app.config['PASSWORD_SCHEME']],
|
return context.CryptContext(
|
||||||
|
schemes=self.scheme_dict.values(),
|
||||||
|
default=self.scheme_dict[app.config['PASSWORD_SCHEME']],
|
||||||
)
|
)
|
||||||
|
|
||||||
def check_password(self, password):
|
def check_password(self, password):
|
||||||
|
context = self.get_password_context()
|
||||||
reference = re.match('({[^}]+})?(.*)', self.password).group(2)
|
reference = re.match('({[^}]+})?(.*)', self.password).group(2)
|
||||||
return User.pw_context.verify(password, reference)
|
result = context.verify(password, reference)
|
||||||
|
if result and context.identify(reference) != context.default_scheme():
|
||||||
|
self.set_password(password)
|
||||||
|
db.session.add(self)
|
||||||
|
db.session.commit()
|
||||||
|
return result
|
||||||
|
|
||||||
def set_password(self, password, hash_scheme=app.config['PASSWORD_SCHEME'], raw=False):
|
def set_password(self, password, hash_scheme=None, raw=False):
|
||||||
"""Set password for user with specified encryption scheme
|
"""Set password for user with specified encryption scheme
|
||||||
@password: plain text password to encrypt (if raw == True the hash itself)
|
@password: plain text password to encrypt (if raw == True the hash itself)
|
||||||
"""
|
"""
|
||||||
|
if hash_scheme is None:
|
||||||
|
hash_scheme = app.config['PASSWORD_SCHEME']
|
||||||
# for the list of hash schemes see https://wiki2.dovecot.org/Authentication/PasswordSchemes
|
# for the list of hash schemes see https://wiki2.dovecot.org/Authentication/PasswordSchemes
|
||||||
if raw:
|
if raw:
|
||||||
self.password = '{'+hash_scheme+'}' + password
|
self.password = '{'+hash_scheme+'}' + password
|
||||||
else:
|
else:
|
||||||
self.password = '{'+hash_scheme+'}' + User.pw_context.encrypt(password, self.scheme_dict[hash_scheme])
|
self.password = '{'+hash_scheme+'}' + self.get_password_context().encrypt(password, self.scheme_dict[hash_scheme])
|
||||||
|
|
||||||
def get_managed_domains(self):
|
def get_managed_domains(self):
|
||||||
if self.global_admin:
|
if self.global_admin:
|
||||||
@@ -252,12 +392,14 @@ class User(Base, Email):
|
|||||||
self.sendmail(app.config["WELCOME_SUBJECT"],
|
self.sendmail(app.config["WELCOME_SUBJECT"],
|
||||||
app.config["WELCOME_BODY"])
|
app.config["WELCOME_BODY"])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, email):
|
||||||
|
return cls.query.get(email)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def login(cls, email, password):
|
def login(cls, email, password):
|
||||||
user = cls.query.get(email)
|
user = cls.query.get(email)
|
||||||
return user if (user and user.check_password(password)) else None
|
return user if (user and user.enabled and user.check_password(password)) else None
|
||||||
|
|
||||||
login_manager.user_loader(User.query.get)
|
|
||||||
|
|
||||||
|
|
||||||
class Alias(Base, Email):
|
class Alias(Base, Email):
|
||||||
@@ -270,6 +412,22 @@ class Alias(Base, Email):
|
|||||||
wildcard = db.Column(db.Boolean(), nullable=False, default=False)
|
wildcard = db.Column(db.Boolean(), nullable=False, default=False)
|
||||||
destination = db.Column(CommaSeparatedList, nullable=False, default=[])
|
destination = db.Column(CommaSeparatedList, nullable=False, default=[])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resolve(cls, localpart, domain_name):
|
||||||
|
return cls.query.filter(
|
||||||
|
sqlalchemy.and_(cls.domain_name == domain_name,
|
||||||
|
sqlalchemy.or_(
|
||||||
|
sqlalchemy.and_(
|
||||||
|
cls.wildcard == False,
|
||||||
|
cls.localpart == localpart
|
||||||
|
), sqlalchemy.and_(
|
||||||
|
cls.wildcard == True,
|
||||||
|
sqlalchemy.bindparam("l", localpart).like(cls.localpart)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).order_by(cls.wildcard, sqlalchemy.func.char_length(cls.localpart).desc()).first()
|
||||||
|
|
||||||
|
|
||||||
class Token(Base):
|
class Token(Base):
|
||||||
""" A token is an application password for a given user.
|
""" A token is an application password for a given user.
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "Ungültige E-Mail-Adresse."
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bestätigen"
|
msgstr "Bestätigen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Passwort"
|
msgstr "Passwort"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Anmelden"
|
msgstr "Anmelden"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Domain-Name"
|
msgstr "Domain-Name"
|
||||||
@@ -42,44 +44,45 @@ msgstr "Maximale Anzahl Benutzer"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "Maximale Anzahl Aliase"
|
msgstr "Maximale Anzahl Aliase"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Kommentar"
|
msgstr "Kommentar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Erstellen"
|
msgstr "Erstellen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Passwort bestätigen"
|
msgstr "Passwort bestätigen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quota"
|
msgstr "Quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Zugriff via IMAP erlauben"
|
msgstr "Zugriff via IMAP erlauben"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Zugriff via POP3 erlauben"
|
msgstr "Zugriff via POP3 erlauben"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Speichern"
|
msgstr "Speichern"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Angezeigter Name"
|
msgstr "Angezeigter Name"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Spamfilter aktivieren"
|
msgstr "Spamfilter aktivieren"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Spamfilter aktivieren"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Schwellenwert für Spamfilter"
|
msgstr "Schwellenwert für Spamfilter"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Einstellungen speichern"
|
msgstr "Einstellungen speichern"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "Passwort wiederholen"
|
msgstr "Passwort wiederholen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Passwort aktualisieren"
|
msgstr "Passwort aktualisieren"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Weiterleitung aktivieren"
|
msgstr "Weiterleitung aktivieren"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Ziel"
|
msgstr "Ziel"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aktualisieren"
|
msgstr "Aktualisieren"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Automatische Antwort aktivieren"
|
msgstr "Automatische Antwort aktivieren"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Betreff"
|
msgstr "Betreff"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)"
|
msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "Administrator E-Mail"
|
msgstr "Administrator E-Mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Absenden"
|
msgstr "Absenden"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "Manager E-Mail"
|
msgstr "Manager E-Mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protokoll"
|
msgstr "Protokoll"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Hostname oder IP"
|
msgstr "Hostname oder IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "Port"
|
msgstr "Port"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Verschlüsselung aktivieren"
|
msgstr "Verschlüsselung aktivieren"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Benutzername"
|
msgstr "Benutzername"
|
||||||
|
|
||||||
@@ -188,34 +193,6 @@ msgstr "Konto"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr "für administrativen Zugriff"
|
msgstr "für administrativen Zugriff"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Dienst-Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Dienst"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Image"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Gestartet"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Letztes Update"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Mein Konto"
|
msgstr "Mein Konto"
|
||||||
@@ -224,28 +201,28 @@ msgstr "Mein Konto"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Einstellungen"
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Auto-Weiterleitung"
|
msgstr "Auto-Weiterleitung"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Auto-Antwort"
|
msgstr "Auto-Antwort"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "Abgerufene Konten"
|
msgstr "Abgerufene Konten"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Administration"
|
msgstr "Administration"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Administratoren"
|
msgstr "Administratoren"
|
||||||
|
|
||||||
@@ -253,7 +230,7 @@ msgstr "Administratoren"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "E-Mail-Domains"
|
msgstr "E-Mail-Domains"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Hilfe"
|
msgstr "Hilfe"
|
||||||
|
|
||||||
@@ -341,27 +318,27 @@ msgstr "Neue Domain"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Domain-Details"
|
msgstr "Domain-Details"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Schlüssel neu erzeugen"
|
msgstr "Schlüssel neu erzeugen"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "DNS MX Eintrag"
|
msgstr "DNS MX Eintrag"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "DNS SPF Einträge"
|
msgstr "DNS SPF Einträge"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "DKIM öffentlicher Schlüssel"
|
msgstr "DKIM öffentlicher Schlüssel"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "DNS DKIM Eintrag"
|
msgstr "DNS DKIM Eintrag"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "DNS DMARC Eintrag"
|
msgstr "DNS DMARC Eintrag"
|
||||||
|
|
||||||
@@ -433,15 +410,15 @@ msgstr "Manager"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Manager hinzufügen"
|
msgstr "Manager hinzufügen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Betreff"
|
msgstr "Betreff"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Absenden"
|
msgstr "Absenden"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "Öffentliche Bekanntmachung"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "von"
|
msgstr "von"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Bekanntmachung"
|
msgstr "Bekanntmachung"
|
||||||
|
|
||||||
@@ -497,11 +474,11 @@ msgstr "Automatische Antwort"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "Maximale Quota pro Benutzer"
|
msgstr "Maximale Quota pro Benutzer"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Kopie der E-Mails behalten"
|
msgstr "Kopie der E-Mails behalten"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "E-Mails auf dem Server belassen"
|
msgstr "E-Mails auf dem Server belassen"
|
||||||
|
|
||||||
@@ -517,19 +494,19 @@ msgstr "ja"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "nein"
|
msgstr "nein"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Alternativer Name"
|
msgstr "Alternativer Name"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr "Relay-Domain-Name"
|
msgstr "Relay-Domain-Name"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "Entfernter Host"
|
msgstr "Entfernter Host"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr "Relay-Domains"
|
msgstr "Relay-Domains"
|
||||||
|
|
||||||
@@ -569,15 +546,15 @@ msgstr "Relay-Domains"
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr "Neue Relay-Domain"
|
msgstr "Neue Relay-Domain"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)"
|
msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr "Authorisierte IP-Adresse"
|
msgstr "Authorisierte IP-Adresse"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr "Authentifizierungs-Tokens"
|
msgstr "Authentifizierungs-Tokens"
|
||||||
|
|
||||||
@@ -589,7 +566,7 @@ msgstr "Wechseln zu"
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr "Webmail"
|
msgstr "Webmail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Website"
|
msgstr "Website"
|
||||||
|
|
||||||
@@ -605,7 +582,7 @@ msgstr "Neuer Token"
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Allgemein"
|
msgstr "Allgemein"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr "Funktionen und Quotas"
|
msgstr "Funktionen und Quotas"
|
||||||
|
|
||||||
@@ -613,11 +590,85 @@ msgstr "Funktionen und Quotas"
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "Allgemeine Einstellungen"
|
msgstr "Allgemeine Einstellungen"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "Antispam"
|
msgstr "Antispam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr "Spamfilter-Grenzwert"
|
msgstr "Spamfilter-Grenzwert"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2017-11-05 17:17+0100\n"
|
"POT-Creation-Date: 2018-04-22 12:10+0200\n"
|
||||||
"PO-Revision-Date: 2016-10-02 15:02+0200\n"
|
"PO-Revision-Date: 2016-10-02 15:02+0200\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
@@ -16,7 +16,7 @@ msgstr ""
|
|||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.5.1\n"
|
"Generated-By: Babel 2.5.3\n"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:32
|
#: mailu/ui/forms.py:32
|
||||||
msgid "Invalid email address."
|
msgid "Invalid email address."
|
||||||
@@ -26,21 +26,23 @@ msgstr ""
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -57,165 +59,198 @@ msgstr ""
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:50
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:57
|
||||||
msgid "Alternative name"
|
msgid "Initial admin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:58
|
||||||
msgid "Relayed domain name"
|
msgid "Admin password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Remote host"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:65
|
||||||
|
msgid "Alternative name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:70
|
||||||
|
msgid "Relayed domain name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
|
msgid "Remote host"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Save settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
|
||||||
msgid "Password check"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
|
||||||
msgid "Update password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Update"
|
msgid "Save settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:110
|
||||||
|
msgid "Password check"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
|
msgid "Update password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:119
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "End of vacation"
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
|
||||||
msgid "Authorized IP"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:120
|
||||||
|
msgid "Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:125
|
||||||
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
|
msgid "Authorized IP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -223,8 +258,16 @@ msgstr ""
|
|||||||
msgid "Public announcement"
|
msgid "Public announcement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/announcement.html:8
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
msgid "from"
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/confirm.html:4
|
#: mailu/ui/templates/confirm.html:4
|
||||||
@@ -248,34 +291,6 @@ msgstr ""
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -285,38 +300,38 @@ msgid "Settings"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-forward"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
|
msgid "Antispam"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:66
|
#: mailu/ui/templates/sidebar.html:66
|
||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -329,15 +344,19 @@ msgstr ""
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -441,27 +460,31 @@ msgstr ""
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -505,6 +528,23 @@ msgstr ""
|
|||||||
msgid "Alternatives"
|
msgid "Alternatives"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid ""
|
||||||
|
"In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid ""
|
||||||
|
"If you do not know how to setup an <code>MX</code> record for your DNS "
|
||||||
|
"zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait "
|
||||||
|
"a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server "
|
||||||
|
"cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/create.html:4
|
#: mailu/ui/templates/fetch/create.html:4
|
||||||
msgid "Add a fetched account"
|
msgid "Add a fetched account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -581,7 +621,7 @@ msgstr ""
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -617,12 +657,20 @@ msgstr ""
|
|||||||
msgid "Automatic reply"
|
msgid "Automatic reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:14
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "General settings"
|
msgid "Auto-forward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
msgid "Antispam"
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid "Your account"
|
#~ msgid "Your account"
|
||||||
@@ -631,3 +679,9 @@ msgstr ""
|
|||||||
#~ msgid "Spam filter threshold"
|
#~ msgid "Spam filter threshold"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "from"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "General settings"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
|||||||
674
core/admin/mailu/translations/es/LC_MESSAGES/messages.po
Normal file
674
core/admin/mailu/translations/es/LC_MESSAGES/messages.po
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: POEditor.com\n"
|
||||||
|
"Project-Id-Version: Mailu\n"
|
||||||
|
"Language: es\n"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:32
|
||||||
|
msgid "Invalid email address."
|
||||||
|
msgstr "Dirección de correo inválida."
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:36
|
||||||
|
msgid "Confirm"
|
||||||
|
msgstr "Confirmar"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
|
msgid "E-mail"
|
||||||
|
msgstr "Dirección de Correo"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
|
msgid "Password"
|
||||||
|
msgstr "Contraseña"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
|
msgid "Sign in"
|
||||||
|
msgstr "Entrar"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
|
msgid "Domain name"
|
||||||
|
msgstr "Nmbre de dominio"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:47
|
||||||
|
msgid "Maximum user count"
|
||||||
|
msgstr "Máximo número de usuarios"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:48
|
||||||
|
msgid "Maximum alias count"
|
||||||
|
msgstr "Máximo número de aliases"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
|
#: mailu/ui/templates/user/list.html:23
|
||||||
|
msgid "Comment"
|
||||||
|
msgstr "Comentario"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
|
msgid "Create"
|
||||||
|
msgstr "Crear"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
|
msgid "Confirm password"
|
||||||
|
msgstr "Confirmar contraseña"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
|
msgid "Quota"
|
||||||
|
msgstr "Cuota"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:81
|
||||||
|
msgid "Allow IMAP access"
|
||||||
|
msgstr "Permitir acceso IMAP"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:82
|
||||||
|
msgid "Allow POP3 access"
|
||||||
|
msgstr "Permitir acceso POP3"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:85
|
||||||
|
msgid "Save"
|
||||||
|
msgstr "Guardar"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:97
|
||||||
|
msgid "Displayed name"
|
||||||
|
msgstr "Nombre a mostrar"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:98
|
||||||
|
msgid "Enable spam filter"
|
||||||
|
msgstr "Habilitar filtro de spam"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80
|
||||||
|
msgid "Spam filter threshold"
|
||||||
|
msgstr "Límite del filtro de spam"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:105
|
||||||
|
msgid "Save settings"
|
||||||
|
msgstr "Guardar configuración"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:110
|
||||||
|
msgid "Password check"
|
||||||
|
msgstr "Revisar contraseña"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
|
msgid "Update password"
|
||||||
|
msgstr "Actualizar contraseña"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:100
|
||||||
|
msgid "Enable forwarding"
|
||||||
|
msgstr "Habilitar reenvío"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
|
msgid "Destination"
|
||||||
|
msgstr "Destino"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:120
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Actualizar"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:115
|
||||||
|
msgid "Enable automatic reply"
|
||||||
|
msgstr "Habilitar respuesta automática"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:116
|
||||||
|
msgid "Reply subject"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:117
|
||||||
|
msgid "Reply body"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:136
|
||||||
|
msgid "Alias"
|
||||||
|
msgstr "Alias"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:138
|
||||||
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
|
msgstr "Usar sintaxis SQL (p.ej. para abarcar todos los alias)"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:145
|
||||||
|
msgid "Admin email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
|
msgid "Submit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:150
|
||||||
|
msgid "Manager email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:155
|
||||||
|
msgid "Protocol"
|
||||||
|
msgstr "Protocolo"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:158
|
||||||
|
msgid "Hostname or IP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
|
msgid "TCP port"
|
||||||
|
msgstr "Puerto TCP"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:160
|
||||||
|
msgid "Enable TLS"
|
||||||
|
msgstr "Habilitar TLS"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
|
msgid "Username"
|
||||||
|
msgstr "Nombre de usuario"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/confirm.html:4
|
||||||
|
msgid "Confirm action"
|
||||||
|
msgstr "Confirmar acción"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/confirm.html:13
|
||||||
|
msgid "You are about to %(action)s. Please confirm your action."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/docker-error.html:4
|
||||||
|
msgid "Docker error"
|
||||||
|
msgstr "Error de Docker"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/docker-error.html:12
|
||||||
|
msgid "An error occurred while talking to the Docker server."
|
||||||
|
msgstr "Ocurrió un error en la comunicación con el servidor Docker."
|
||||||
|
|
||||||
|
#: mailu/admin/templates/login.html:6
|
||||||
|
msgid "Your account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/login.html:8
|
||||||
|
msgid "to access the administration tools"
|
||||||
|
msgstr "para acceder a las herramientas de administración"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
|
msgid "My account"
|
||||||
|
msgstr "Mi cuenta"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Configuración"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
|
msgid "Auto-forward"
|
||||||
|
msgstr "Auto-reenvío"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
|
msgid "Auto-reply"
|
||||||
|
msgstr "Auto-respuesta"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:36
|
||||||
|
msgid "Fetched accounts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
|
msgid "Sign out"
|
||||||
|
msgstr "Salir"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
|
msgid "Administration"
|
||||||
|
msgstr "Administración"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
|
msgid "Administrators"
|
||||||
|
msgstr "Administradores"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:66
|
||||||
|
msgid "Mail domains"
|
||||||
|
msgstr "Dominios de correo"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
|
msgid "Help"
|
||||||
|
msgstr "Ayuda"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/working.html:4
|
||||||
|
msgid "We are still working on this feature!"
|
||||||
|
msgstr "Aún trabajamos en esta característica!"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/create.html:4
|
||||||
|
msgid "Add a global administrator"
|
||||||
|
msgstr "Añadir administrador global"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:4
|
||||||
|
msgid "Global administrators"
|
||||||
|
msgstr "Administradores globales"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:9
|
||||||
|
msgid "Add administrator"
|
||||||
|
msgstr "Añadr administrador"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:16 mailu/ui/templates/alias/list.html:18
|
||||||
|
#: mailu/ui/templates/alternative/list.html:18
|
||||||
|
#: mailu/ui/templates/domain/list.html:16 mailu/ui/templates/fetch/list.html:18
|
||||||
|
#: mailu/ui/templates/manager/list.html:18
|
||||||
|
#: mailu/ui/templates/relay/list.html:16 mailu/ui/templates/token/list.html:18
|
||||||
|
#: mailu/ui/templates/user/list.html:18
|
||||||
|
msgid "Actions"
|
||||||
|
msgstr "Acciones"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:17 mailu/ui/templates/alias/list.html:19
|
||||||
|
#: mailu/ui/templates/manager/list.html:19 mailu/ui/templates/user/list.html:20
|
||||||
|
msgid "Email"
|
||||||
|
msgstr "Correo"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:22 mailu/ui/templates/alias/list.html:29
|
||||||
|
#: mailu/ui/templates/alternative/list.html:25
|
||||||
|
#: mailu/ui/templates/domain/list.html:31 mailu/ui/templates/fetch/list.html:31
|
||||||
|
#: mailu/ui/templates/manager/list.html:24
|
||||||
|
#: mailu/ui/templates/relay/list.html:27 mailu/ui/templates/token/list.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:31
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "Eliminar"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/create.html:4
|
||||||
|
msgid "Create alias"
|
||||||
|
msgstr "Crear alias"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/edit.html:4
|
||||||
|
msgid "Edit alias"
|
||||||
|
msgstr "Editar alias"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:4
|
||||||
|
msgid "Alias list"
|
||||||
|
msgstr "Lista de alias"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:12
|
||||||
|
msgid "Add alias"
|
||||||
|
msgstr "Añadir alias"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:22
|
||||||
|
#: mailu/ui/templates/alternative/list.html:20
|
||||||
|
#: mailu/ui/templates/domain/list.html:22 mailu/ui/templates/fetch/list.html:24
|
||||||
|
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
|
||||||
|
#: mailu/ui/templates/user/list.html:24
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Creado"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:23 mailu/ui/templates/domain/list.html:23
|
||||||
|
#: mailu/ui/templates/fetch/list.html:25 mailu/ui/templates/relay/list.html:21
|
||||||
|
#: mailu/ui/templates/user/list.html:25
|
||||||
|
msgid "Last edit"
|
||||||
|
msgstr "Última edición"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:28 mailu/ui/templates/domain/list.html:30
|
||||||
|
#: mailu/ui/templates/fetch/list.html:30 mailu/ui/templates/relay/list.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:30
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Editar"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/create.html:4
|
||||||
|
#: mailu/ui/templates/domain/list.html:9
|
||||||
|
msgid "New domain"
|
||||||
|
msgstr "Nuevo dominio"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:4
|
||||||
|
msgid "Domain details"
|
||||||
|
msgstr "Detalle del domino"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
|
msgid "Regenerate keys"
|
||||||
|
msgstr "Regenerar llaves"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
|
msgid "DNS MX entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
|
msgid "DNS SPF entries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
|
msgid "DKIM public key"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
|
msgid "DNS DKIM entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
|
msgid "DNS DMARC entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/edit.html:4
|
||||||
|
msgid "Edit domain"
|
||||||
|
msgstr "Editar domino"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:4
|
||||||
|
msgid "Domain list"
|
||||||
|
msgstr "Lista de dominios"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:17
|
||||||
|
msgid "Manage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:19
|
||||||
|
msgid "Mailbox count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:20
|
||||||
|
msgid "Alias count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:28
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "Detalles"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:35
|
||||||
|
msgid "Users"
|
||||||
|
msgstr "Usuarios"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:36
|
||||||
|
msgid "Aliases"
|
||||||
|
msgstr "Alias"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:37
|
||||||
|
msgid "Managers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/create.html:4
|
||||||
|
msgid "Add a fetched account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/edit.html:4
|
||||||
|
msgid "Update a fetched account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:12
|
||||||
|
msgid "Add an account"
|
||||||
|
msgstr "Añadir una cuenta"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:19
|
||||||
|
msgid "Endpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:22
|
||||||
|
msgid "Last check"
|
||||||
|
msgstr "Último checkeo"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/create.html:4
|
||||||
|
msgid "Add a manager"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/list.html:4
|
||||||
|
msgid "Manager list"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/list.html:12
|
||||||
|
msgid "Add manager"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:168
|
||||||
|
msgid "Announcement subject"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:170
|
||||||
|
msgid "Announcement body"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:172
|
||||||
|
msgid "Send"
|
||||||
|
msgstr "Enviar"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/announcement.html:4
|
||||||
|
msgid "Public announcement"
|
||||||
|
msgstr "Anuncio público"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/announcement.html:8
|
||||||
|
msgid "from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
|
msgid "Announcement"
|
||||||
|
msgstr "Anuncio"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:4
|
||||||
|
msgid "New user"
|
||||||
|
msgstr "Nuevo usuario"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/edit.html:4
|
||||||
|
msgid "Edit user"
|
||||||
|
msgstr "Editar usuario"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/forward.html:4
|
||||||
|
msgid "Forward emails"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:4
|
||||||
|
msgid "User list"
|
||||||
|
msgstr "Lista de usuarios"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:12
|
||||||
|
msgid "Add user"
|
||||||
|
msgstr "Añadir usuario"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:19 mailu/ui/templates/user/settings.html:4
|
||||||
|
msgid "User settings"
|
||||||
|
msgstr "Configuración de usuario"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:21
|
||||||
|
msgid "Features"
|
||||||
|
msgstr "Características"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/password.html:4
|
||||||
|
msgid "Password update"
|
||||||
|
msgstr "Actualizar contraseña"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/reply.html:4
|
||||||
|
msgid "Automatic reply"
|
||||||
|
msgstr "Respuesta automática"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:49
|
||||||
|
msgid "Maximum user quota"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:101
|
||||||
|
msgid "Keep a copy of the emails"
|
||||||
|
msgstr "Mantener una copia de los correos"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:163
|
||||||
|
msgid "Keep emails on the server"
|
||||||
|
msgstr "Mantener los correos en el servidor"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:21
|
||||||
|
msgid "Keep emails"
|
||||||
|
msgstr "Mantener los correos"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:35
|
||||||
|
msgid "yes"
|
||||||
|
msgstr "si"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:35
|
||||||
|
msgid "no"
|
||||||
|
msgstr "no"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:65
|
||||||
|
msgid "Alternative name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:70
|
||||||
|
msgid "Relayed domain name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
|
msgid "Remote host"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
|
msgid "Relayed domains"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/create.html:4
|
||||||
|
msgid "Create alternative domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:4
|
||||||
|
msgid "Alternative domain list"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:12
|
||||||
|
msgid "Add alternative"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:19
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:39
|
||||||
|
msgid "Alternatives"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/create.html:4
|
||||||
|
msgid "New relay domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/edit.html:4
|
||||||
|
msgid "Edit relayd domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/list.html:4
|
||||||
|
msgid "Relayed domain list"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/list.html:9
|
||||||
|
msgid "New relayed domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:125
|
||||||
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
|
msgid "Authorized IP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
|
msgid "Authentication tokens"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:72
|
||||||
|
msgid "Go to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:76
|
||||||
|
msgid "Webmail"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
|
msgid "Website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/token/create.html:4
|
||||||
|
msgid "Create an authentication token"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/token/list.html:12
|
||||||
|
msgid "New token"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:15
|
||||||
|
msgid "General"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:22
|
||||||
|
msgid "Features and quotas"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/settings.html:14
|
||||||
|
msgid "General settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
|
msgid "Antispam"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:99
|
||||||
|
msgid "Spam filter tolerance"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
@@ -15,21 +15,23 @@ msgstr "Adresse e-mail invalide"
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirmer"
|
msgstr "Confirmer"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Mot de passe"
|
msgstr "Mot de passe"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Se connecter"
|
msgstr "Se connecter"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Nom de domaine"
|
msgstr "Nom de domaine"
|
||||||
@@ -42,44 +44,45 @@ msgstr "Nombre maximum d'utilisateurs"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "Nombre maximum d'alias"
|
msgstr "Nombre maximum d'alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Commentaire"
|
msgstr "Commentaire"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Créer"
|
msgstr "Créer"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirmer le mot de passe"
|
msgstr "Confirmer le mot de passe"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quota"
|
msgstr "Quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Autoriser l'accès IMAP"
|
msgstr "Autoriser l'accès IMAP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Autoriser l'accès POP3"
|
msgstr "Autoriser l'accès POP3"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Enregistrer"
|
msgstr "Enregistrer"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Nom affiché"
|
msgstr "Nom affiché"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Activer le filtre anti-spam"
|
msgstr "Activer le filtre anti-spam"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Activer le filtre anti-spam"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Seuil du filtre anti-spam"
|
msgstr "Seuil du filtre anti-spam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Enregistrer les préférences"
|
msgstr "Enregistrer les préférences"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "Vérifier le mot de passe"
|
msgstr "Vérifier le mot de passe"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Changer de mot de passe"
|
msgstr "Changer de mot de passe"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Activer la redirection"
|
msgstr "Activer la redirection"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Destination"
|
msgstr "Destination"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Mettre à jour"
|
msgstr "Mettre à jour"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Activer les réponses automatique"
|
msgstr "Activer les réponses automatique"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Sujet du message"
|
msgstr "Sujet du message"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Corps de la réponse"
|
msgstr "Corps de la réponse"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Utiliser la syntaxe SQL LIKE (par exemple pour les alias catch-all)"
|
msgstr "Utiliser la syntaxe SQL LIKE (par exemple pour les alias catch-all)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "Email de l'administrateur"
|
msgstr "Email de l'administrateur"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Valider"
|
msgstr "Valider"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "E-mail du gérant"
|
msgstr "E-mail du gérant"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protocole"
|
msgstr "Protocole"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Nom d'hôte ou adresse IP"
|
msgstr "Nom d'hôte ou adresse IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "Port TCP"
|
msgstr "Port TCP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Activer TLS"
|
msgstr "Activer TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Nom d'utilisateur"
|
msgstr "Nom d'utilisateur"
|
||||||
|
|
||||||
@@ -188,34 +193,6 @@ msgstr "Votre compte"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr "pour accéder aux outils d'administration"
|
msgstr "pour accéder aux outils d'administration"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Etat des services"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Service"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Etat"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Image"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Démarré depuis"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Dernière mise à jour"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Mon compte"
|
msgstr "Mon compte"
|
||||||
@@ -224,28 +201,28 @@ msgstr "Mon compte"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Préférences"
|
msgstr "Préférences"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Redirection"
|
msgstr "Redirection"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Réponse automatique"
|
msgstr "Réponse automatique"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "Comptes externes"
|
msgstr "Comptes externes"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Déconnexion"
|
msgstr "Déconnexion"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Administration"
|
msgstr "Administration"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Administrateurs"
|
msgstr "Administrateurs"
|
||||||
|
|
||||||
@@ -253,7 +230,7 @@ msgstr "Administrateurs"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "Domaines"
|
msgstr "Domaines"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Aide"
|
msgstr "Aide"
|
||||||
|
|
||||||
@@ -341,27 +318,27 @@ msgstr "Nouveau domaine"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Détails du domaine"
|
msgstr "Détails du domaine"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Regénérer les clés"
|
msgstr "Regénérer les clés"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "Entrée DNS MX"
|
msgstr "Entrée DNS MX"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "Entrées DNS SPF"
|
msgstr "Entrées DNS SPF"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "Clé publique DKIM"
|
msgstr "Clé publique DKIM"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "Entrée DNS DKIM"
|
msgstr "Entrée DNS DKIM"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "Entrée DNS DMARC"
|
msgstr "Entrée DNS DMARC"
|
||||||
|
|
||||||
@@ -433,15 +410,15 @@ msgstr "Liste des gérants"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Ajouter le gérant"
|
msgstr "Ajouter le gérant"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Sujet de l'annonce"
|
msgstr "Sujet de l'annonce"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Corps de l'annonce"
|
msgstr "Corps de l'annonce"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Envoyer"
|
msgstr "Envoyer"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "Annonce globale"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "de"
|
msgstr "de"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Annonce"
|
msgstr "Annonce"
|
||||||
|
|
||||||
@@ -497,11 +474,11 @@ msgstr "Réponse automatique"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "Quota maximum par utilisateur"
|
msgstr "Quota maximum par utilisateur"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Conserver une copie des messages"
|
msgstr "Conserver une copie des messages"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Conserver les messages sur le serveur"
|
msgstr "Conserver les messages sur le serveur"
|
||||||
|
|
||||||
@@ -517,19 +494,19 @@ msgstr "oui"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "non"
|
msgstr "non"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Nom alternatif"
|
msgstr "Nom alternatif"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr "Nom du domaine relayé"
|
msgstr "Nom du domaine relayé"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "Hôte distant"
|
msgstr "Hôte distant"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr "Domaines relayé"
|
msgstr "Domaines relayé"
|
||||||
|
|
||||||
@@ -569,15 +546,15 @@ msgstr "Liste des domaines relayés"
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr "Nouveau domaine relayé"
|
msgstr "Nouveau domaine relayé"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr "Votre jeton (à conserver, il ne sera plus affiché par la suite)"
|
msgstr "Votre jeton (à conserver, il ne sera plus affiché par la suite)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr "Adresse IP autorisée"
|
msgstr "Adresse IP autorisée"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr "Jetons d'authentification"
|
msgstr "Jetons d'authentification"
|
||||||
|
|
||||||
@@ -589,7 +566,7 @@ msgstr "Navigation"
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr "Webmail"
|
msgstr "Webmail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Site web"
|
msgstr "Site web"
|
||||||
|
|
||||||
@@ -605,7 +582,7 @@ msgstr "Nouveau jeton"
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Général"
|
msgstr "Général"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr "Fonctionnalités et quotas"
|
msgstr "Fonctionnalités et quotas"
|
||||||
|
|
||||||
@@ -613,11 +590,85 @@ msgstr "Fonctionnalités et quotas"
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "Général"
|
msgstr "Général"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "Antispam"
|
msgstr "Antispam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr "Tolérance du filtre antispam"
|
msgstr "Tolérance du filtre antispam"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr "Autoriser l'inscription"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr "Administrateur initial"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr "Mot de passe administrateur"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Activé"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr "Adresse e-mail"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr "S'inscrire"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr "Fin du mode vacance"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr "Configuration client"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr "Protocole"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr "Nom du serveur"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr "Inscrire un domaine"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr "Générer les clés"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr "Pour enregistrer un nouveau domaine, vous devez d'abord configurer la zone DNS de sorte que le <code>MX</code> du domaine pointe sur ce serveur."
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr "Si vous ne savez pas comment configurer un enregistrement <code>MX</code>, contactez votre fournisseur de DNS ou votre administrateur. Egalement, attendez quelques minutes après avoir modifié le <code>MX</code>, le temps que le cache local au serveur soit rafraîchi."
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr "choix du domaine pour le compte"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr "Domaine"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr "Places disponibles"
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "Indirizzo email non valido."
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Conferma"
|
msgstr "Conferma"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Password"
|
msgstr "Password"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Entra"
|
msgstr "Entra"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Nome dominio"
|
msgstr "Nome dominio"
|
||||||
@@ -42,44 +44,45 @@ msgstr ""
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Crea"
|
msgstr "Crea"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Conferma pasword"
|
msgstr "Conferma pasword"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quota"
|
msgstr "Quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Consenti accesso IMAP"
|
msgstr "Consenti accesso IMAP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Consenti accesso POP3"
|
msgstr "Consenti accesso POP3"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Salva"
|
msgstr "Salva"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Nome visualizzato"
|
msgstr "Nome visualizzato"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Abilita filtro antispam"
|
msgstr "Abilita filtro antispam"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Abilita filtro antispam"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Soglia del filtro antispam"
|
msgstr "Soglia del filtro antispam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Salva impostazioni"
|
msgstr "Salva impostazioni"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Aggiorna password"
|
msgstr "Aggiorna password"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Abilita inoltro"
|
msgstr "Abilita inoltro"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Destinazione"
|
msgstr "Destinazione"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aggiorna"
|
msgstr "Aggiorna"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Abilita risposta automatica"
|
msgstr "Abilita risposta automatica"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Soggetto risposta"
|
msgstr "Soggetto risposta"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Corpo risposta"
|
msgstr "Corpo risposta"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Usa sintassi SQL LIKE (es. per alias catch-all)"
|
msgstr "Usa sintassi SQL LIKE (es. per alias catch-all)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "Email amministratore"
|
msgstr "Email amministratore"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Invia"
|
msgstr "Invia"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "Email manager"
|
msgstr "Email manager"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protocollo"
|
msgstr "Protocollo"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Hostname o IP"
|
msgstr "Hostname o IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "Porta TCP"
|
msgstr "Porta TCP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Abilita TLS"
|
msgstr "Abilita TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Username"
|
msgstr "Username"
|
||||||
|
|
||||||
@@ -189,34 +194,6 @@ msgstr "Il tuo account"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Stato"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Immagine"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Avviato"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Ultimo aggiornamento"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Il mio account"
|
msgstr "Il mio account"
|
||||||
@@ -225,28 +202,28 @@ msgstr "Il mio account"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Impostazioni"
|
msgstr "Impostazioni"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Auto-inoltro"
|
msgstr "Auto-inoltro"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Auto-risponditore"
|
msgstr "Auto-risponditore"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Esci"
|
msgstr "Esci"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Amministrazione"
|
msgstr "Amministrazione"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Amministratori"
|
msgstr "Amministratori"
|
||||||
|
|
||||||
@@ -254,7 +231,7 @@ msgstr "Amministratori"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "Domini mail"
|
msgstr "Domini mail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Aiuto"
|
msgstr "Aiuto"
|
||||||
|
|
||||||
@@ -342,27 +319,27 @@ msgstr "Nuovo dominio"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Dettagli dominio"
|
msgstr "Dettagli dominio"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Rigenera chiavi"
|
msgstr "Rigenera chiavi"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -434,15 +411,15 @@ msgstr ""
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Aggiungi manager"
|
msgstr "Aggiungi manager"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Corpo dell'annuncio"
|
msgstr "Corpo dell'annuncio"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Invia"
|
msgstr "Invia"
|
||||||
|
|
||||||
@@ -454,7 +431,7 @@ msgstr "Annuncio pubblico"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "da"
|
msgstr "da"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Annuncio"
|
msgstr "Annuncio"
|
||||||
|
|
||||||
@@ -498,11 +475,11 @@ msgstr "Risposta automatica"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Conserva una copia delle email"
|
msgstr "Conserva una copia delle email"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Conserva email sul server"
|
msgstr "Conserva email sul server"
|
||||||
|
|
||||||
@@ -518,19 +495,19 @@ msgstr "si"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "no"
|
msgstr "no"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Nome alternativo"
|
msgstr "Nome alternativo"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "Host remoto"
|
msgstr "Host remoto"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -570,15 +547,15 @@ msgstr ""
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr "IP Autorizzato"
|
msgstr "IP Autorizzato"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr "Token di autenticazione"
|
msgstr "Token di autenticazione"
|
||||||
|
|
||||||
@@ -590,7 +567,7 @@ msgstr "Vai a"
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr "Webmail"
|
msgstr "Webmail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Sito web"
|
msgstr "Sito web"
|
||||||
|
|
||||||
@@ -606,7 +583,7 @@ msgstr "Nuovo token"
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Generale"
|
msgstr "Generale"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr "Funzionalità e quota"
|
msgstr "Funzionalità e quota"
|
||||||
|
|
||||||
@@ -614,11 +591,85 @@ msgstr "Funzionalità e quota"
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "Impostazioni generali"
|
msgstr "Impostazioni generali"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "Antispam"
|
msgstr "Antispam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr "Tolleranza filtro spam"
|
msgstr "Tolleranza filtro spam"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "Ongeldig e-mailadres."
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bevestigen"
|
msgstr "Bevestigen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Wachtwoord"
|
msgstr "Wachtwoord"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Aanmelden"
|
msgstr "Aanmelden"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Domeinnaam"
|
msgstr "Domeinnaam"
|
||||||
@@ -42,44 +44,45 @@ msgstr "Maximaal aantal gebruikers"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "Maximaal aantal aliasen"
|
msgstr "Maximaal aantal aliasen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Opmerking"
|
msgstr "Opmerking"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Aanmaken"
|
msgstr "Aanmaken"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Bevestig wachtwoord"
|
msgstr "Bevestig wachtwoord"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quotum"
|
msgstr "Quotum"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "IMAP toestaan"
|
msgstr "IMAP toestaan"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "POP3 toestaan"
|
msgstr "POP3 toestaan"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Opslaan"
|
msgstr "Opslaan"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Getoonde naam"
|
msgstr "Getoonde naam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Spamfilter inschakelen"
|
msgstr "Spamfilter inschakelen"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Spamfilter inschakelen"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Spamfilter drempel"
|
msgstr "Spamfilter drempel"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Instellingen opslaan"
|
msgstr "Instellingen opslaan"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "Wachtwoord controle"
|
msgstr "Wachtwoord controle"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Wachtwoord veranderen"
|
msgstr "Wachtwoord veranderen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Doorsturen inschakelen"
|
msgstr "Doorsturen inschakelen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Bestemming"
|
msgstr "Bestemming"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Bijwerken"
|
msgstr "Bijwerken"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Automatisch antwoord inschakelen"
|
msgstr "Automatisch antwoord inschakelen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Antwoord onderwerp"
|
msgstr "Antwoord onderwerp"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Antwoord bericht"
|
msgstr "Antwoord bericht"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Gebruik SQL LIKE syntax (bijv. voor alles-afvangen aliasen)"
|
msgstr "Gebruik SQL LIKE syntax (bijv. voor alles-afvangen aliasen)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "Beheerder e-mail"
|
msgstr "Beheerder e-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Verzenden"
|
msgstr "Verzenden"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "Manager e-mail"
|
msgstr "Manager e-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protocol"
|
msgstr "Protocol"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Hostnaam of IP"
|
msgstr "Hostnaam of IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "TCP poort"
|
msgstr "TCP poort"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "TLS inschakelen"
|
msgstr "TLS inschakelen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Gebruikersnaam"
|
msgstr "Gebruikersnaam"
|
||||||
|
|
||||||
@@ -178,7 +183,7 @@ msgstr "Docker foutmelding"
|
|||||||
|
|
||||||
#: mailu/ui/templates/docker-error.html:12
|
#: mailu/ui/templates/docker-error.html:12
|
||||||
msgid "An error occurred while talking to the Docker server."
|
msgid "An error occurred while talking to the Docker server."
|
||||||
msgstr "Er is een fout opgetreden tijdens het praten met de Docker server."
|
msgstr "Er is een fout opgetreden tijdens het communiceren met de Docker server."
|
||||||
|
|
||||||
#: mailu/admin/templates/login.html:6
|
#: mailu/admin/templates/login.html:6
|
||||||
msgid "Your account"
|
msgid "Your account"
|
||||||
@@ -186,35 +191,7 @@ msgstr "Uw account"
|
|||||||
|
|
||||||
#: mailu/ui/templates/login.html:8
|
#: mailu/ui/templates/login.html:8
|
||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr ""
|
msgstr "om toegang te krijgen tot systeembeheer"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Status diensten"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Dienst"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Image"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Gestart"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Laatste aanpassing"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
@@ -224,28 +201,28 @@ msgstr "Mijn account"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Instellingen"
|
msgstr "Instellingen"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Automatisch doorsturen"
|
msgstr "Automatisch doorsturen"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Automatisch antwoorden"
|
msgstr "Automatisch antwoorden"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "Opgehaalde accounts"
|
msgstr "Opgehaalde accounts"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Afmelden"
|
msgstr "Afmelden"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Beheer"
|
msgstr "Beheer"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Beheerders"
|
msgstr "Beheerders"
|
||||||
|
|
||||||
@@ -253,7 +230,7 @@ msgstr "Beheerders"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "E-mail domeinen"
|
msgstr "E-mail domeinen"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Help"
|
msgstr "Help"
|
||||||
|
|
||||||
@@ -341,29 +318,29 @@ msgstr "Nieuw domein"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Domein details"
|
msgstr "Domein details"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Hergenereer sleutels"
|
msgstr "Hergenereer sleutels"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr ""
|
msgstr "DNS MX-record"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr ""
|
msgstr "DNS SPF-records"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "DKIM publieke sleutel"
|
msgstr "DKIM publieke sleutel"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr ""
|
msgstr "DNS DKIM-record"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr ""
|
msgstr "DNS DMARC-record"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/edit.html:4
|
#: mailu/ui/templates/domain/edit.html:4
|
||||||
msgid "Edit domain"
|
msgid "Edit domain"
|
||||||
@@ -415,7 +392,7 @@ msgstr "Account toevoegen"
|
|||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:19
|
#: mailu/ui/templates/fetch/list.html:19
|
||||||
msgid "Endpoint"
|
msgid "Endpoint"
|
||||||
msgstr ""
|
msgstr "Endpoint"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:22
|
#: mailu/ui/templates/fetch/list.html:22
|
||||||
msgid "Last check"
|
msgid "Last check"
|
||||||
@@ -433,15 +410,15 @@ msgstr "Manager overzicht"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Manager toevoegen"
|
msgstr "Manager toevoegen"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Mededeling onderwerp"
|
msgstr "Mededeling onderwerp"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Mededeling bericht"
|
msgstr "Mededeling bericht"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Versturen"
|
msgstr "Versturen"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "Publieke mededeling"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "van"
|
msgstr "van"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Mededeling"
|
msgstr "Mededeling"
|
||||||
|
|
||||||
@@ -467,7 +444,7 @@ msgstr "Gebruiker aanpassen"
|
|||||||
|
|
||||||
#: mailu/ui/templates/user/forward.html:4
|
#: mailu/ui/templates/user/forward.html:4
|
||||||
msgid "Forward emails"
|
msgid "Forward emails"
|
||||||
msgstr ""
|
msgstr "E-mails doorsturen"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/list.html:4
|
#: mailu/ui/templates/user/list.html:4
|
||||||
msgid "User list"
|
msgid "User list"
|
||||||
@@ -497,11 +474,11 @@ msgstr "Automatisch antwoord"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "Maximum quotum gebruikers"
|
msgstr "Maximum quotum gebruikers"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Behoud een kopie van de e-mails"
|
msgstr "Behoud een kopie van de e-mails"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Behoud de e-mails op de server"
|
msgstr "Behoud de e-mails op de server"
|
||||||
|
|
||||||
@@ -517,21 +494,21 @@ msgstr "ja"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "nee"
|
msgstr "nee"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Alternatieve naam"
|
msgstr "Alternatieve naam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr ""
|
msgstr "Relayed domainnaam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr ""
|
msgstr "Externe host"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr ""
|
msgstr "Relayed domainen"
|
||||||
|
|
||||||
#: mailu/ui/templates/alternative/create.html:4
|
#: mailu/ui/templates/alternative/create.html:4
|
||||||
msgid "Create alternative domain"
|
msgid "Create alternative domain"
|
||||||
@@ -555,69 +532,143 @@ msgstr "Alternatieven"
|
|||||||
|
|
||||||
#: mailu/ui/templates/relay/create.html:4
|
#: mailu/ui/templates/relay/create.html:4
|
||||||
msgid "New relay domain"
|
msgid "New relay domain"
|
||||||
msgstr ""
|
msgstr "Nieuw relay domein"
|
||||||
|
|
||||||
#: mailu/ui/templates/relay/edit.html:4
|
#: mailu/ui/templates/relay/edit.html:4
|
||||||
msgid "Edit relayd domain"
|
msgid "Edit relayd domain"
|
||||||
msgstr ""
|
msgstr "Bewerk relay domein"
|
||||||
|
|
||||||
#: mailu/ui/templates/relay/list.html:4
|
#: mailu/ui/templates/relay/list.html:4
|
||||||
msgid "Relayed domain list"
|
msgid "Relayed domain list"
|
||||||
msgstr ""
|
msgstr "Overzicht relayed domeinen"
|
||||||
|
|
||||||
#: mailu/ui/templates/relay/list.html:9
|
#: mailu/ui/templates/relay/list.html:9
|
||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr ""
|
msgstr "Nieuw relayed domein"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr ""
|
msgstr "Uw token (bewaar hem goed, want hij wordt nooit meer getoond)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr ""
|
msgstr "Toegestaan IP"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr ""
|
msgstr "Authenticatie tokens"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:72
|
#: mailu/ui/templates/sidebar.html:72
|
||||||
msgid "Go to"
|
msgid "Go to"
|
||||||
msgstr ""
|
msgstr "Ga naar"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:76
|
#: mailu/ui/templates/sidebar.html:76
|
||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr ""
|
msgstr "Webmail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr "Website"
|
||||||
|
|
||||||
#: mailu/ui/templates/token/create.html:4
|
#: mailu/ui/templates/token/create.html:4
|
||||||
msgid "Create an authentication token"
|
msgid "Create an authentication token"
|
||||||
msgstr ""
|
msgstr "Authenticatie token aanmaken"
|
||||||
|
|
||||||
#: mailu/ui/templates/token/list.html:12
|
#: mailu/ui/templates/token/list.html:12
|
||||||
msgid "New token"
|
msgid "New token"
|
||||||
msgstr ""
|
msgstr "Nieuw token"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:15
|
#: mailu/ui/templates/user/create.html:15
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr "Algemeen"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr ""
|
msgstr "Functionaliteiten en quota"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:14
|
#: mailu/ui/templates/user/settings.html:14
|
||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr ""
|
msgstr "Algemene instellingen"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr ""
|
msgstr "Anti-spam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
|
msgstr "Spam filter toleratie"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "Nieprawidłowy adres e-mail."
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Zatwierdź"
|
msgstr "Zatwierdź"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Hasło"
|
msgstr "Hasło"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Zaloguj"
|
msgstr "Zaloguj"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Nazwa domeny"
|
msgstr "Nazwa domeny"
|
||||||
@@ -43,44 +45,45 @@ msgid "Maximum alias count"
|
|||||||
msgstr "Maksymalna liczba aliasów"
|
msgstr "Maksymalna liczba aliasów"
|
||||||
|
|
||||||
#. Needs more context - is that a verb or a noun?
|
#. Needs more context - is that a verb or a noun?
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Komentarz"
|
msgstr "Komentarz"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Utwórz"
|
msgstr "Utwórz"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Potwierdź hasło"
|
msgstr "Potwierdź hasło"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Zezwalaj na dostęp przez protokół IMAP"
|
msgstr "Zezwalaj na dostęp przez protokół IMAP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Zezwalaj na dostęp przez protokół POP3"
|
msgstr "Zezwalaj na dostęp przez protokół POP3"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Zapisz"
|
msgstr "Zapisz"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Nazwa wyświetlana"
|
msgstr "Nazwa wyświetlana"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Włącz filtr antyspamowy"
|
msgstr "Włącz filtr antyspamowy"
|
||||||
|
|
||||||
@@ -88,80 +91,82 @@ msgstr "Włącz filtr antyspamowy"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Próg filtra antyspamowego"
|
msgstr "Próg filtra antyspamowego"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Zapisz ustawienia"
|
msgstr "Zapisz ustawienia"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Zmień hasło"
|
msgstr "Zmień hasło"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Włącz przekierowanie poczty"
|
msgstr "Włącz przekierowanie poczty"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Adres docelowy"
|
msgstr "Adres docelowy"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Aktualizuj"
|
msgstr "Aktualizuj"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Włącz automatyczną odpowiedź"
|
msgstr "Włącz automatyczną odpowiedź"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Temat odpowiedzi"
|
msgstr "Temat odpowiedzi"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Treść odpowiedzi"
|
msgstr "Treść odpowiedzi"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Używaj składni SQL LIKE (np. do adresów catch-all)"
|
msgstr "Używaj składni SQL LIKE (np. do adresów catch-all)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "E-mail administratora"
|
msgstr "E-mail administratora"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Prześlij"
|
msgstr "Prześlij"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protokół"
|
msgstr "Protokół"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Nazwa hosta lub adres IP"
|
msgstr "Nazwa hosta lub adres IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "Port TCP"
|
msgstr "Port TCP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Włącz TLS"
|
msgstr "Włącz TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Nazwa użytkownika"
|
msgstr "Nazwa użytkownika"
|
||||||
|
|
||||||
@@ -189,34 +194,6 @@ msgstr "Twoje konto"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Status usług"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Usługa"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Ostatnia aktualizacja"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Moje konto"
|
msgstr "Moje konto"
|
||||||
@@ -225,28 +202,28 @@ msgstr "Moje konto"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Ustawienia"
|
msgstr "Ustawienia"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Automatyczne przekierowanie"
|
msgstr "Automatyczne przekierowanie"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Automatyczna odpowiedź"
|
msgstr "Automatyczna odpowiedź"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Wyloguj"
|
msgstr "Wyloguj"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Administracja"
|
msgstr "Administracja"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Administratorzy"
|
msgstr "Administratorzy"
|
||||||
|
|
||||||
@@ -254,7 +231,7 @@ msgstr "Administratorzy"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "Domeny pocztowe"
|
msgstr "Domeny pocztowe"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Pomoc"
|
msgstr "Pomoc"
|
||||||
|
|
||||||
@@ -342,27 +319,27 @@ msgstr "Nowa domena"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Szczegóły domeny"
|
msgstr "Szczegóły domeny"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Wygeneruj ponownie klucze"
|
msgstr "Wygeneruj ponownie klucze"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "Wpis MX DNS"
|
msgstr "Wpis MX DNS"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "Wpisy SPF DNS"
|
msgstr "Wpisy SPF DNS"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "Publiczny klucz DKIM"
|
msgstr "Publiczny klucz DKIM"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "Wpis DKIM DNS"
|
msgstr "Wpis DKIM DNS"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "Wpis DMARC DNS"
|
msgstr "Wpis DMARC DNS"
|
||||||
|
|
||||||
@@ -434,15 +411,15 @@ msgstr ""
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Temat ogłoszenia"
|
msgstr "Temat ogłoszenia"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Treść ogłoszenia"
|
msgstr "Treść ogłoszenia"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Wyślij"
|
msgstr "Wyślij"
|
||||||
|
|
||||||
@@ -454,7 +431,7 @@ msgstr "Publiczne ogłoszenie"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "od"
|
msgstr "od"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Ogłoszenie"
|
msgstr "Ogłoszenie"
|
||||||
|
|
||||||
@@ -498,11 +475,11 @@ msgstr "Automatyczna odpowiedź"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Przechowuj kopię wiadomości"
|
msgstr "Przechowuj kopię wiadomości"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Przechowuj wiadomości na serwerze"
|
msgstr "Przechowuj wiadomości na serwerze"
|
||||||
|
|
||||||
@@ -518,19 +495,19 @@ msgstr "Tak"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "Nie"
|
msgstr "Nie"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -570,15 +547,15 @@ msgstr ""
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -590,7 +567,7 @@ msgstr ""
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Strona internetowa"
|
msgstr "Strona internetowa"
|
||||||
|
|
||||||
@@ -606,7 +583,7 @@ msgstr ""
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -614,11 +591,85 @@ msgstr ""
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "Ustawienia ogólne"
|
msgstr "Ustawienia ogólne"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "Filtr antyspamowy"
|
msgstr "Filtr antyspamowy"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "Endereço de e-mail inválido"
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirmar"
|
msgstr "Confirmar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Senha"
|
msgstr "Senha"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Entrar"
|
msgstr "Entrar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Domínio"
|
msgstr "Domínio"
|
||||||
@@ -42,44 +44,45 @@ msgstr "Quantidade máxima de usuários"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "Quantidade máxima de alias"
|
msgstr "Quantidade máxima de alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Comentário"
|
msgstr "Comentário"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Criar"
|
msgstr "Criar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Confirmar senha"
|
msgstr "Confirmar senha"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quota"
|
msgstr "Quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Permitir acesso IMAP"
|
msgstr "Permitir acesso IMAP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Permitir acesso POP3"
|
msgstr "Permitir acesso POP3"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Salvar"
|
msgstr "Salvar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Nome de exibição"
|
msgstr "Nome de exibição"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Habilitar filtro de spam"
|
msgstr "Habilitar filtro de spam"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Habilitar filtro de spam"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Limite de filtro de spam"
|
msgstr "Limite de filtro de spam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Salvar configurações"
|
msgstr "Salvar configurações"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "Confirmação de senha"
|
msgstr "Confirmação de senha"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Alterar senha"
|
msgstr "Alterar senha"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Habilitar encaminhamento"
|
msgstr "Habilitar encaminhamento"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Destinatário"
|
msgstr "Destinatário"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Atualizar"
|
msgstr "Atualizar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Habilitar resposta automática"
|
msgstr "Habilitar resposta automática"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Assunto da resposta"
|
msgstr "Assunto da resposta"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Corpo da resposta"
|
msgstr "Corpo da resposta"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Usar sintaxe estilo SQL(ex: for catch-all aliases)"
|
msgstr "Usar sintaxe estilo SQL(ex: for catch-all aliases)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "E-mail do administrador"
|
msgstr "E-mail do administrador"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Enviar"
|
msgstr "Enviar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "E-mail do gerente"
|
msgstr "E-mail do gerente"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protocolo"
|
msgstr "Protocolo"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Hostname ou IP"
|
msgstr "Hostname ou IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "Porta TCP"
|
msgstr "Porta TCP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Habilitar TLS"
|
msgstr "Habilitar TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Usuário"
|
msgstr "Usuário"
|
||||||
|
|
||||||
@@ -188,34 +193,6 @@ msgstr "Sua conta"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr "para acessar as ferramentas administrativas"
|
msgstr "para acessar as ferramentas administrativas"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Status do serviço"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Serviço"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Imagem"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Iniciado"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Última atualização"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Minha conta"
|
msgstr "Minha conta"
|
||||||
@@ -224,28 +201,28 @@ msgstr "Minha conta"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configurações"
|
msgstr "Configurações"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Encaminhamento automático"
|
msgstr "Encaminhamento automático"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Resposta automática"
|
msgstr "Resposta automática"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "Contas importadas"
|
msgstr "Contas importadas"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Administração"
|
msgstr "Administração"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Administradores"
|
msgstr "Administradores"
|
||||||
|
|
||||||
@@ -253,7 +230,7 @@ msgstr "Administradores"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "Domínios de e-mail"
|
msgstr "Domínios de e-mail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Ajuda"
|
msgstr "Ajuda"
|
||||||
|
|
||||||
@@ -341,27 +318,27 @@ msgstr "Novo domínio"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Detalhes do domínio"
|
msgstr "Detalhes do domínio"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Gerar novas chaves"
|
msgstr "Gerar novas chaves"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "Entrada DNS MX"
|
msgstr "Entrada DNS MX"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "Entrada DNS SPF"
|
msgstr "Entrada DNS SPF"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "Chave pública do DKIM"
|
msgstr "Chave pública do DKIM"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "Entrada DNS DKIM"
|
msgstr "Entrada DNS DKIM"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "Entrada DNS DMARC"
|
msgstr "Entrada DNS DMARC"
|
||||||
|
|
||||||
@@ -433,15 +410,15 @@ msgstr "Lista de gerentes"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Adicionar gerente"
|
msgstr "Adicionar gerente"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Título do comunicado"
|
msgstr "Título do comunicado"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Corpo do comunicado"
|
msgstr "Corpo do comunicado"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Enviar"
|
msgstr "Enviar"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "Comunicado geral"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "de"
|
msgstr "de"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Comunicado"
|
msgstr "Comunicado"
|
||||||
|
|
||||||
@@ -497,11 +474,11 @@ msgstr "Resposta automática"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "Cota máxima por usuário"
|
msgstr "Cota máxima por usuário"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Manter uma cópia dos emails"
|
msgstr "Manter uma cópia dos emails"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Manter os e-mails no servidor"
|
msgstr "Manter os e-mails no servidor"
|
||||||
|
|
||||||
@@ -517,19 +494,19 @@ msgstr "sim"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "não"
|
msgstr "não"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Nome alternativo"
|
msgstr "Nome alternativo"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr "Nome de domínio para encaminhar"
|
msgstr "Nome de domínio para encaminhar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "Host remoto"
|
msgstr "Host remoto"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr "Domínios para encaminhamento"
|
msgstr "Domínios para encaminhamento"
|
||||||
|
|
||||||
@@ -569,15 +546,15 @@ msgstr "Lista de domínios para encaminhamento"
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr "Novo domínio de encaminhamento"
|
msgstr "Novo domínio de encaminhamento"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -589,7 +566,7 @@ msgstr ""
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -605,7 +582,7 @@ msgstr ""
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -613,11 +590,85 @@ msgstr ""
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
674
core/admin/mailu/translations/ru/LC_MESSAGES/messages.po
Normal file
674
core/admin/mailu/translations/ru/LC_MESSAGES/messages.po
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Generator: POEditor.com\n"
|
||||||
|
"Project-Id-Version: Mailu\n"
|
||||||
|
"Language: ru\n"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:32
|
||||||
|
msgid "Invalid email address."
|
||||||
|
msgstr "Неправильный адрес электронной почты"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:36
|
||||||
|
msgid "Confirm"
|
||||||
|
msgstr "Подтвердить"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
|
msgid "E-mail"
|
||||||
|
msgstr "Электронная почта"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
|
msgid "Password"
|
||||||
|
msgstr "Пароль"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
|
msgid "Sign in"
|
||||||
|
msgstr "Войти"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
|
msgid "Domain name"
|
||||||
|
msgstr "Доменное имя"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:47
|
||||||
|
msgid "Maximum user count"
|
||||||
|
msgstr "Максимальное число пользователей"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:48
|
||||||
|
msgid "Maximum alias count"
|
||||||
|
msgstr "Максимальное число псевдонимов"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
|
#: mailu/ui/templates/user/list.html:23
|
||||||
|
msgid "Comment"
|
||||||
|
msgstr "Комментарий"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
|
msgid "Create"
|
||||||
|
msgstr "Создать"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
|
msgid "Confirm password"
|
||||||
|
msgstr "Подтвердить пароль"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
|
msgid "Quota"
|
||||||
|
msgstr "Квота"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:81
|
||||||
|
msgid "Allow IMAP access"
|
||||||
|
msgstr "Разрешить доступ через IMAP"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:82
|
||||||
|
msgid "Allow POP3 access"
|
||||||
|
msgstr "Разрешить доступ через POP3"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:85
|
||||||
|
msgid "Save"
|
||||||
|
msgstr "Сохранить"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:97
|
||||||
|
msgid "Displayed name"
|
||||||
|
msgstr "Отображаемое имя"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:98
|
||||||
|
msgid "Enable spam filter"
|
||||||
|
msgstr "Включить спам-фильтр"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80
|
||||||
|
msgid "Spam filter threshold"
|
||||||
|
msgstr "Порог чувствительности спам-фильтра"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:105
|
||||||
|
msgid "Save settings"
|
||||||
|
msgstr "Сохранить настройки"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:110
|
||||||
|
msgid "Password check"
|
||||||
|
msgstr "Проверка пароля"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
|
msgid "Update password"
|
||||||
|
msgstr "Обновить пароль"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:100
|
||||||
|
msgid "Enable forwarding"
|
||||||
|
msgstr "Включить переадресацию"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
|
msgid "Destination"
|
||||||
|
msgstr "Адрес получателя"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:120
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Обновить"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:115
|
||||||
|
msgid "Enable automatic reply"
|
||||||
|
msgstr "Включить автоответчик"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:116
|
||||||
|
msgid "Reply subject"
|
||||||
|
msgstr "Заголовок автоответа"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:117
|
||||||
|
msgid "Reply body"
|
||||||
|
msgstr "Сообщение автоответа"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:136
|
||||||
|
msgid "Alias"
|
||||||
|
msgstr "Псевдоним"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:138
|
||||||
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
|
msgstr "Использовать SQL-подобный синтаксис"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:145
|
||||||
|
msgid "Admin email"
|
||||||
|
msgstr "Адрес администратора"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
|
msgid "Submit"
|
||||||
|
msgstr "Отправить"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:150
|
||||||
|
msgid "Manager email"
|
||||||
|
msgstr "Адрес менеджера"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:155
|
||||||
|
msgid "Protocol"
|
||||||
|
msgstr "Протокол"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:158
|
||||||
|
msgid "Hostname or IP"
|
||||||
|
msgstr "Имя хоста или IP"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
|
msgid "TCP port"
|
||||||
|
msgstr "Порт TCP"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:160
|
||||||
|
msgid "Enable TLS"
|
||||||
|
msgstr "Включить TLS"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
|
msgid "Username"
|
||||||
|
msgstr "Имя пользователя"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/confirm.html:4
|
||||||
|
msgid "Confirm action"
|
||||||
|
msgstr "Подтвердить действие"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/confirm.html:13
|
||||||
|
msgid "You are about to %(action)s. Please confirm your action."
|
||||||
|
msgstr "Вы собираетесь совершить %(action). Подтвердить?"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/docker-error.html:4
|
||||||
|
msgid "Docker error"
|
||||||
|
msgstr "Ошибка Docker"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/docker-error.html:12
|
||||||
|
msgid "An error occurred while talking to the Docker server."
|
||||||
|
msgstr "Произошла ошибка при обращении к серверу Docker"
|
||||||
|
|
||||||
|
#: mailu/admin/templates/login.html:6
|
||||||
|
msgid "Your account"
|
||||||
|
msgstr "Ваша учетная запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/login.html:8
|
||||||
|
msgid "to access the administration tools"
|
||||||
|
msgstr "для доступа к утилитам администрирования"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
|
msgid "My account"
|
||||||
|
msgstr "Моя учетная запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Настройки"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
|
msgid "Auto-forward"
|
||||||
|
msgstr "Автоматическая пересылка"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
|
msgid "Auto-reply"
|
||||||
|
msgstr "Автоматический ответ"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:36
|
||||||
|
msgid "Fetched accounts"
|
||||||
|
msgstr "Учетные записи сторонних серверов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
|
msgid "Sign out"
|
||||||
|
msgstr "Выйти"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
|
msgid "Administration"
|
||||||
|
msgstr "Администрирование"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
|
msgid "Administrators"
|
||||||
|
msgstr "Администраторы"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:66
|
||||||
|
msgid "Mail domains"
|
||||||
|
msgstr "Почтовые домены"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
|
msgid "Help"
|
||||||
|
msgstr "Помощь"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/working.html:4
|
||||||
|
msgid "We are still working on this feature!"
|
||||||
|
msgstr "Мы еще работаем над данным функционалом!"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/create.html:4
|
||||||
|
msgid "Add a global administrator"
|
||||||
|
msgstr "Добавить глобального администратора"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:4
|
||||||
|
msgid "Global administrators"
|
||||||
|
msgstr "Глобальные администраторы"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:9
|
||||||
|
msgid "Add administrator"
|
||||||
|
msgstr "Добавить администратора"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:16 mailu/ui/templates/alias/list.html:18
|
||||||
|
#: mailu/ui/templates/alternative/list.html:18
|
||||||
|
#: mailu/ui/templates/domain/list.html:16 mailu/ui/templates/fetch/list.html:18
|
||||||
|
#: mailu/ui/templates/manager/list.html:18
|
||||||
|
#: mailu/ui/templates/relay/list.html:16 mailu/ui/templates/token/list.html:18
|
||||||
|
#: mailu/ui/templates/user/list.html:18
|
||||||
|
msgid "Actions"
|
||||||
|
msgstr "Действия"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:17 mailu/ui/templates/alias/list.html:19
|
||||||
|
#: mailu/ui/templates/manager/list.html:19 mailu/ui/templates/user/list.html:20
|
||||||
|
msgid "Email"
|
||||||
|
msgstr "Электронная почта"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/admin/list.html:22 mailu/ui/templates/alias/list.html:29
|
||||||
|
#: mailu/ui/templates/alternative/list.html:25
|
||||||
|
#: mailu/ui/templates/domain/list.html:31 mailu/ui/templates/fetch/list.html:31
|
||||||
|
#: mailu/ui/templates/manager/list.html:24
|
||||||
|
#: mailu/ui/templates/relay/list.html:27 mailu/ui/templates/token/list.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:31
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "Удалить"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/create.html:4
|
||||||
|
msgid "Create alias"
|
||||||
|
msgstr "Создать псевдоним"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/edit.html:4
|
||||||
|
msgid "Edit alias"
|
||||||
|
msgstr "Изменить псевдоним"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:4
|
||||||
|
msgid "Alias list"
|
||||||
|
msgstr "Список псевдонимов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:12
|
||||||
|
msgid "Add alias"
|
||||||
|
msgstr "Добавить псевдоним"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:22
|
||||||
|
#: mailu/ui/templates/alternative/list.html:20
|
||||||
|
#: mailu/ui/templates/domain/list.html:22 mailu/ui/templates/fetch/list.html:24
|
||||||
|
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
|
||||||
|
#: mailu/ui/templates/user/list.html:24
|
||||||
|
msgid "Created"
|
||||||
|
msgstr "Создано"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:23 mailu/ui/templates/domain/list.html:23
|
||||||
|
#: mailu/ui/templates/fetch/list.html:25 mailu/ui/templates/relay/list.html:21
|
||||||
|
#: mailu/ui/templates/user/list.html:25
|
||||||
|
msgid "Last edit"
|
||||||
|
msgstr "Последнее изменение"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alias/list.html:28 mailu/ui/templates/domain/list.html:30
|
||||||
|
#: mailu/ui/templates/fetch/list.html:30 mailu/ui/templates/relay/list.html:26
|
||||||
|
#: mailu/ui/templates/user/list.html:30
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Изменить"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/create.html:4
|
||||||
|
#: mailu/ui/templates/domain/list.html:9
|
||||||
|
msgid "New domain"
|
||||||
|
msgstr "Новый домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:4
|
||||||
|
msgid "Domain details"
|
||||||
|
msgstr "Подробности домена"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
|
msgid "Regenerate keys"
|
||||||
|
msgstr "Перегенерировать ключи"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
|
msgid "DNS MX entry"
|
||||||
|
msgstr "DNS MX запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
|
msgid "DNS SPF entries"
|
||||||
|
msgstr "DNS SPF запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
|
msgid "DKIM public key"
|
||||||
|
msgstr "Публичный ключ DKIM"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
|
msgid "DNS DKIM entry"
|
||||||
|
msgstr "DNS DKIM запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
|
msgid "DNS DMARC entry"
|
||||||
|
msgstr "DNS DMARC запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/edit.html:4
|
||||||
|
msgid "Edit domain"
|
||||||
|
msgstr "Изменить домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:4
|
||||||
|
msgid "Domain list"
|
||||||
|
msgstr "Список доменов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:17
|
||||||
|
msgid "Manage"
|
||||||
|
msgstr "Управление"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:19
|
||||||
|
msgid "Mailbox count"
|
||||||
|
msgstr "Количество ящиков"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:20
|
||||||
|
msgid "Alias count"
|
||||||
|
msgstr "Количество псевдонимов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:28
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "Подробно"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:35
|
||||||
|
msgid "Users"
|
||||||
|
msgstr "Пользователи"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:36
|
||||||
|
msgid "Aliases"
|
||||||
|
msgstr "Псевдонимы"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:37
|
||||||
|
msgid "Managers"
|
||||||
|
msgstr "Менеджеры"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/create.html:4
|
||||||
|
msgid "Add a fetched account"
|
||||||
|
msgstr "Добавить учетную запись стороннего сервера"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/edit.html:4
|
||||||
|
msgid "Update a fetched account"
|
||||||
|
msgstr "Обновить учетную запись стороннего сервера"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:12
|
||||||
|
msgid "Add an account"
|
||||||
|
msgstr "Добавить учетную запись"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:19
|
||||||
|
msgid "Endpoint"
|
||||||
|
msgstr "Конечная точка"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:22
|
||||||
|
msgid "Last check"
|
||||||
|
msgstr "Последняя проверка"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/create.html:4
|
||||||
|
msgid "Add a manager"
|
||||||
|
msgstr "Добавить менеджера"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/list.html:4
|
||||||
|
msgid "Manager list"
|
||||||
|
msgstr "Список менеджеров"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/manager/list.html:12
|
||||||
|
msgid "Add manager"
|
||||||
|
msgstr "Добавить менеджера"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:168
|
||||||
|
msgid "Announcement subject"
|
||||||
|
msgstr "Тема объявления"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:170
|
||||||
|
msgid "Announcement body"
|
||||||
|
msgstr "Содержание объявления"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:172
|
||||||
|
msgid "Send"
|
||||||
|
msgstr "Отправить"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/announcement.html:4
|
||||||
|
msgid "Public announcement"
|
||||||
|
msgstr "Публичное объявление"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/announcement.html:8
|
||||||
|
msgid "from"
|
||||||
|
msgstr "От"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
|
msgid "Announcement"
|
||||||
|
msgstr "Объявление"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:4
|
||||||
|
msgid "New user"
|
||||||
|
msgstr "Новый пользователь"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/edit.html:4
|
||||||
|
msgid "Edit user"
|
||||||
|
msgstr "Изменить пользователя"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/forward.html:4
|
||||||
|
msgid "Forward emails"
|
||||||
|
msgstr "Перенаправлять письма"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:4
|
||||||
|
msgid "User list"
|
||||||
|
msgstr "Список пользователей"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:12
|
||||||
|
msgid "Add user"
|
||||||
|
msgstr "Добавить пользователя"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:19 mailu/ui/templates/user/settings.html:4
|
||||||
|
msgid "User settings"
|
||||||
|
msgstr "Настройки пользователя"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/list.html:21
|
||||||
|
msgid "Features"
|
||||||
|
msgstr "Функции"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/password.html:4
|
||||||
|
msgid "Password update"
|
||||||
|
msgstr "Изменение пароля"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/reply.html:4
|
||||||
|
msgid "Automatic reply"
|
||||||
|
msgstr "Автоматический ответ"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:49
|
||||||
|
msgid "Maximum user quota"
|
||||||
|
msgstr "Квота на пользователя"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:101
|
||||||
|
msgid "Keep a copy of the emails"
|
||||||
|
msgstr "Хранить копии писем"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:163
|
||||||
|
msgid "Keep emails on the server"
|
||||||
|
msgstr "Хранить письма на сервере"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:21
|
||||||
|
msgid "Keep emails"
|
||||||
|
msgstr "Сохранять письма"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:35
|
||||||
|
msgid "yes"
|
||||||
|
msgstr "да"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/fetch/list.html:35
|
||||||
|
msgid "no"
|
||||||
|
msgstr "нет"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:65
|
||||||
|
msgid "Alternative name"
|
||||||
|
msgstr "Имя альтернативного домена"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:70
|
||||||
|
msgid "Relayed domain name"
|
||||||
|
msgstr "Имя релейного домена"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
|
msgid "Remote host"
|
||||||
|
msgstr "Удаленный хост"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
|
msgid "Relayed domains"
|
||||||
|
msgstr "Релейные домены"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/create.html:4
|
||||||
|
msgid "Create alternative domain"
|
||||||
|
msgstr "Создать альтернативный домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:4
|
||||||
|
msgid "Alternative domain list"
|
||||||
|
msgstr "Список альтернативных доменов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:12
|
||||||
|
msgid "Add alternative"
|
||||||
|
msgstr "Добавить альтернативный домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/alternative/list.html:19
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Имя"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/list.html:39
|
||||||
|
msgid "Alternatives"
|
||||||
|
msgstr "Альтернативные домены"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/create.html:4
|
||||||
|
msgid "New relay domain"
|
||||||
|
msgstr "Новый релейный домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/edit.html:4
|
||||||
|
msgid "Edit relayd domain"
|
||||||
|
msgstr "Изменить релейный домен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/list.html:4
|
||||||
|
msgid "Relayed domain list"
|
||||||
|
msgstr "Список релейных доменов"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/relay/list.html:9
|
||||||
|
msgid "New relayed domain"
|
||||||
|
msgstr "Новый релейный домен"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:125
|
||||||
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
|
msgstr "Ваш токен (перепишите его, больше он показываться не будет)"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
|
msgid "Authorized IP"
|
||||||
|
msgstr "Авторизованные IP-адреса"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
|
msgid "Authentication tokens"
|
||||||
|
msgstr "Авторизационные токены"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:72
|
||||||
|
msgid "Go to"
|
||||||
|
msgstr "Перейти к"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:76
|
||||||
|
msgid "Webmail"
|
||||||
|
msgstr "Электронная почта"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
|
msgid "Website"
|
||||||
|
msgstr "Сайт"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/token/create.html:4
|
||||||
|
msgid "Create an authentication token"
|
||||||
|
msgstr "Создать токен авторизации"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/token/list.html:12
|
||||||
|
msgid "New token"
|
||||||
|
msgstr "Новый токен"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:15
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Общие"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/create.html:22
|
||||||
|
msgid "Features and quotas"
|
||||||
|
msgstr "Функции и квоты"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/settings.html:14
|
||||||
|
msgid "General settings"
|
||||||
|
msgstr "Общие настройки"
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
|
msgid "Antispam"
|
||||||
|
msgstr "Антиспам"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:99
|
||||||
|
msgid "Spam filter tolerance"
|
||||||
|
msgstr "Порог спам-фильтра"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
@@ -15,21 +15,23 @@ msgstr "Ogiltig adress"
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bekräfta"
|
msgstr "Bekräfta"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-post"
|
msgstr "E-post"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Lösenord"
|
msgstr "Lösenord"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Logga in"
|
msgstr "Logga in"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "Domännamn"
|
msgstr "Domännamn"
|
||||||
@@ -42,44 +44,45 @@ msgstr "Max antal användare"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "Max antal alias"
|
msgstr "Max antal alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Kommentar"
|
msgstr "Kommentar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Skapa"
|
msgstr "Skapa"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "Bekräfta lösenord"
|
msgstr "Bekräfta lösenord"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "Quota"
|
msgstr "Quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "Tillåt IMAP"
|
msgstr "Tillåt IMAP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "Tillåt POP3"
|
msgstr "Tillåt POP3"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Spara"
|
msgstr "Spara"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "Visat namn"
|
msgstr "Visat namn"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "Aktivera spamfilter"
|
msgstr "Aktivera spamfilter"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "Aktivera spamfilter"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "Spamfilter gräns"
|
msgstr "Spamfilter gräns"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "Spara inställningar"
|
msgstr "Spara inställningar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "Lösenordskoll"
|
msgstr "Lösenordskoll"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "Uppdatera lösenord"
|
msgstr "Uppdatera lösenord"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "Aktivera vidarebefordring"
|
msgstr "Aktivera vidarebefordring"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "Destination"
|
msgstr "Destination"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "Uppdatera"
|
msgstr "Uppdatera"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "Aktivera autosvar"
|
msgstr "Aktivera autosvar"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "Svar ämne"
|
msgstr "Svar ämne"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "Svar meddelande"
|
msgstr "Svar meddelande"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "Alias"
|
msgstr "Alias"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "Använd SQL-liknande syntax (t.ex. för catch-all alias)"
|
msgstr "Använd SQL-liknande syntax (t.ex. för catch-all alias)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "Admin e-post"
|
msgstr "Admin e-post"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Skicka in"
|
msgstr "Skicka in"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "Manager e-post"
|
msgstr "Manager e-post"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protokoll"
|
msgstr "Protokoll"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "Hostnamn eller IP"
|
msgstr "Hostnamn eller IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "TCP port"
|
msgstr "TCP port"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "Aktivera TLS"
|
msgstr "Aktivera TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "Användarnamn"
|
msgstr "Användarnamn"
|
||||||
|
|
||||||
@@ -188,34 +193,6 @@ msgstr "Ditt konto"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr "att komma åt administrationsverktygen"
|
msgstr "att komma åt administrationsverktygen"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "Tjänster status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "Tjänst"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "Status"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "PID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "Bild"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "Startad"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "Senast uppdaterad"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "Mitt konto"
|
msgstr "Mitt konto"
|
||||||
@@ -224,28 +201,28 @@ msgstr "Mitt konto"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Inställningar"
|
msgstr "Inställningar"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "Auto-forward"
|
msgstr "Auto-forward"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "Autosvar"
|
msgstr "Autosvar"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "Hämtade konton"
|
msgstr "Hämtade konton"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "Logga ut"
|
msgstr "Logga ut"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "Administration"
|
msgstr "Administration"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "Administratörer"
|
msgstr "Administratörer"
|
||||||
|
|
||||||
@@ -253,7 +230,7 @@ msgstr "Administratörer"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "Domäner"
|
msgstr "Domäner"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Hjälp"
|
msgstr "Hjälp"
|
||||||
|
|
||||||
@@ -341,27 +318,27 @@ msgstr "Ny domän"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "Domändetaljer"
|
msgstr "Domändetaljer"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "Generera nycklar"
|
msgstr "Generera nycklar"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "DNS MX post"
|
msgstr "DNS MX post"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "DNS SPF post"
|
msgstr "DNS SPF post"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "Publik DKIM-nyckel"
|
msgstr "Publik DKIM-nyckel"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "DNS DKIM post"
|
msgstr "DNS DKIM post"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "DNS DMARC post"
|
msgstr "DNS DMARC post"
|
||||||
|
|
||||||
@@ -433,15 +410,15 @@ msgstr "Managerlista"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "Skapa manager"
|
msgstr "Skapa manager"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "Publikt meddelande ämne"
|
msgstr "Publikt meddelande ämne"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "Publikt meddelande"
|
msgstr "Publikt meddelande"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "Skicka"
|
msgstr "Skicka"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "Publikt meddelande"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "från"
|
msgstr "från"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "Meddelande"
|
msgstr "Meddelande"
|
||||||
|
|
||||||
@@ -497,11 +474,11 @@ msgstr "Automatiskt svar"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "Max användar-quota"
|
msgstr "Max användar-quota"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "Behåll en kopia av e-posten"
|
msgstr "Behåll en kopia av e-posten"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "Behåll e-post på servern"
|
msgstr "Behåll e-post på servern"
|
||||||
|
|
||||||
@@ -517,19 +494,19 @@ msgstr "ja"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "nej"
|
msgstr "nej"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "Aleternativt namn"
|
msgstr "Aleternativt namn"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr "Reläade domännamn"
|
msgstr "Reläade domännamn"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "Server"
|
msgstr "Server"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr "Reläade domäner"
|
msgstr "Reläade domäner"
|
||||||
|
|
||||||
@@ -569,15 +546,15 @@ msgstr "Reläade domäner"
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr "Ny reläad domän"
|
msgstr "Ny reläad domän"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr "Din token (notera, eftersom den inte kommer att visas igen)"
|
msgstr "Din token (notera, eftersom den inte kommer att visas igen)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr "Autentiserat IP"
|
msgstr "Autentiserat IP"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr "Autentiserade tokens"
|
msgstr "Autentiserade tokens"
|
||||||
|
|
||||||
@@ -589,7 +566,7 @@ msgstr "Gå till"
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr "Webmail"
|
msgstr "Webmail"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Websida"
|
msgstr "Websida"
|
||||||
|
|
||||||
@@ -605,7 +582,7 @@ msgstr "Ny token"
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "Allmänt"
|
msgstr "Allmänt"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr "Funktioner och quota"
|
msgstr "Funktioner och quota"
|
||||||
|
|
||||||
@@ -613,11 +590,85 @@ msgstr "Funktioner och quota"
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "Allmäna inställningar"
|
msgstr "Allmäna inställningar"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "Antispam"
|
msgstr "Antispam"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,23 @@ msgstr "无效的邮件地址"
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "确认"
|
msgstr "确认"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "电子邮件"
|
msgstr "电子邮件"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "密码"
|
msgstr "密码"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "注册"
|
msgstr "注册"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr "域名"
|
msgstr "域名"
|
||||||
@@ -42,44 +44,45 @@ msgstr "最大用户数"
|
|||||||
msgid "Maximum alias count"
|
msgid "Maximum alias count"
|
||||||
msgstr "最大别名数"
|
msgstr "最大别名数"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "说明"
|
msgstr "说明"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "创建"
|
msgstr "创建"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr "确认密码"
|
msgstr "确认密码"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr "配额"
|
msgstr "配额"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr "允许IMAP访问"
|
msgstr "允许IMAP访问"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr "允许POP3访问"
|
msgstr "允许POP3访问"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "保存"
|
msgstr "保存"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr "显示名称"
|
msgstr "显示名称"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr "启用垃圾邮件过滤"
|
msgstr "启用垃圾邮件过滤"
|
||||||
|
|
||||||
@@ -87,80 +90,82 @@ msgstr "启用垃圾邮件过滤"
|
|||||||
msgid "Spam filter threshold"
|
msgid "Spam filter threshold"
|
||||||
msgstr "垃圾邮件过滤器阈值"
|
msgstr "垃圾邮件过滤器阈值"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Save settings"
|
msgid "Save settings"
|
||||||
msgstr "保存设置"
|
msgstr "保存设置"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
#: mailu/ui/forms.py:110
|
||||||
msgid "Password check"
|
msgid "Password check"
|
||||||
msgstr "检查密码"
|
msgstr "检查密码"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
msgid "Update password"
|
msgid "Update password"
|
||||||
msgstr "更新密码"
|
msgstr "更新密码"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr "启用转发"
|
msgstr "启用转发"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr "目的地址"
|
msgstr "目的地址"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:120
|
||||||
msgid "Update"
|
msgid "Update"
|
||||||
msgstr "更新"
|
msgstr "更新"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr "启用自动回复"
|
msgstr "启用自动回复"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr "回复主题"
|
msgstr "回复主题"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr "回复正文"
|
msgstr "回复正文"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr "别名"
|
msgstr "别名"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr "使用SQL LIKE语法(例如,用于全部别名)"
|
msgstr "使用SQL LIKE语法(例如,用于全部别名)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr "管理员邮箱"
|
msgstr "管理员邮箱"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "提交"
|
msgstr "提交"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr "管理员邮箱"
|
msgstr "管理员邮箱"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "协议"
|
msgstr "协议"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr "主机名或IP"
|
msgstr "主机名或IP"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr "TCP端口"
|
msgstr "TCP端口"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr "启用TLS"
|
msgstr "启用TLS"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr "用户名"
|
msgstr "用户名"
|
||||||
|
|
||||||
@@ -170,7 +175,7 @@ msgstr "确认操作"
|
|||||||
|
|
||||||
#: mailu/ui/templates/confirm.html:13
|
#: mailu/ui/templates/confirm.html:13
|
||||||
msgid "You are about to %(action)s. Please confirm your action."
|
msgid "You are about to %(action)s. Please confirm your action."
|
||||||
msgstr "你即将%(action)s。请确认您的操作。"
|
msgstr "即将%(action)s,请确认您的操作。"
|
||||||
|
|
||||||
#: mailu/ui/templates/docker-error.html:4
|
#: mailu/ui/templates/docker-error.html:4
|
||||||
msgid "Docker error"
|
msgid "Docker error"
|
||||||
@@ -188,34 +193,6 @@ msgstr "你的帐户"
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr "访问管理员工具"
|
msgstr "访问管理员工具"
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr "服务状态"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr "服务"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr "状态"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr "进程ID"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr "镜像"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr "已开始"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr "最后更新"
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
#: mailu/ui/templates/sidebar.html:8
|
||||||
msgid "My account"
|
msgid "My account"
|
||||||
msgstr "我的帐户"
|
msgstr "我的帐户"
|
||||||
@@ -224,28 +201,28 @@ msgstr "我的帐户"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "设置"
|
msgstr "设置"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "Auto-forward"
|
msgid "Auto-forward"
|
||||||
msgstr "自动转发"
|
msgstr "自动转发"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr "自动回复"
|
msgstr "自动回复"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr "代收帐户"
|
msgstr "代收帐户"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr "登出"
|
msgstr "登出"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr "管理"
|
msgstr "管理"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr "管理员"
|
msgstr "管理员"
|
||||||
|
|
||||||
@@ -253,13 +230,13 @@ msgstr "管理员"
|
|||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr "邮件域"
|
msgstr "邮件域"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "帮帮我"
|
msgstr "帮助"
|
||||||
|
|
||||||
#: mailu/ui/templates/working.html:4
|
#: mailu/ui/templates/working.html:4
|
||||||
msgid "We are still working on this feature!"
|
msgid "We are still working on this feature!"
|
||||||
msgstr "开发中……"
|
msgstr "该功能开发中……"
|
||||||
|
|
||||||
#: mailu/ui/templates/admin/create.html:4
|
#: mailu/ui/templates/admin/create.html:4
|
||||||
msgid "Add a global administrator"
|
msgid "Add a global administrator"
|
||||||
@@ -341,27 +318,27 @@ msgstr "新域"
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr "域详情"
|
msgstr "域详情"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr "重新生成密钥"
|
msgstr "重新生成密钥"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr "DNS MX条目"
|
msgstr "DNS MX条目"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr "DNS SPF条目"
|
msgstr "DNS SPF条目"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr "DKIM公钥"
|
msgstr "DKIM公钥"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr "DNS DKIM条目"
|
msgstr "DNS DKIM条目"
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr "DNS DMARC条目"
|
msgstr "DNS DMARC条目"
|
||||||
|
|
||||||
@@ -433,15 +410,15 @@ msgstr "管理员列表"
|
|||||||
msgid "Add manager"
|
msgid "Add manager"
|
||||||
msgstr "添加管理员"
|
msgstr "添加管理员"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr "公告主题"
|
msgstr "公告主题"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr "公告正文"
|
msgstr "公告正文"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr "发送"
|
msgstr "发送"
|
||||||
|
|
||||||
@@ -453,7 +430,7 @@ msgstr "公告"
|
|||||||
msgid "from"
|
msgid "from"
|
||||||
msgstr "来自"
|
msgstr "来自"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr "公告"
|
msgstr "公告"
|
||||||
|
|
||||||
@@ -497,13 +474,13 @@ msgstr "自动回复"
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr "最大用户容量"
|
msgstr "最大用户容量"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr "保留电子邮件副本"
|
msgstr "保留电子邮件副本"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr "电子邮件保存在服务器上"
|
msgstr "保留电子邮件在服务器上"
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:21
|
#: mailu/ui/templates/fetch/list.html:21
|
||||||
msgid "Keep emails"
|
msgid "Keep emails"
|
||||||
@@ -517,19 +494,19 @@ msgstr "是"
|
|||||||
msgid "no"
|
msgid "no"
|
||||||
msgstr "否"
|
msgstr "否"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:65
|
||||||
msgid "Alternative name"
|
msgid "Alternative name"
|
||||||
msgstr "替代名称"
|
msgstr "替代名称"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:70
|
||||||
msgid "Relayed domain name"
|
msgid "Relayed domain name"
|
||||||
msgstr "中继域域名"
|
msgstr "中继域域名"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
msgid "Remote host"
|
msgid "Remote host"
|
||||||
msgstr "远程主机"
|
msgstr "远程主机"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr "中继域"
|
msgstr "中继域"
|
||||||
|
|
||||||
@@ -569,15 +546,15 @@ msgstr "中继域列表"
|
|||||||
msgid "New relayed domain"
|
msgid "New relayed domain"
|
||||||
msgstr "新的中继域"
|
msgstr "新的中继域"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:125
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
msgstr "您的令牌(请保存下来,它只显示这一次)"
|
msgstr "您的令牌(请记录,它只显示这一次)"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
msgid "Authorized IP"
|
msgid "Authorized IP"
|
||||||
msgstr "授权IP"
|
msgstr "授权IP"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr "认证令牌"
|
msgstr "认证令牌"
|
||||||
|
|
||||||
@@ -589,7 +566,7 @@ msgstr "转到"
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr "网页邮箱"
|
msgstr "网页邮箱"
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "网站"
|
msgstr "网站"
|
||||||
|
|
||||||
@@ -603,9 +580,9 @@ msgstr "新的令牌"
|
|||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:15
|
#: mailu/ui/templates/user/create.html:15
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr "一般"
|
msgstr "通用"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr "功能和配额"
|
msgstr "功能和配额"
|
||||||
|
|
||||||
@@ -613,11 +590,85 @@ msgstr "功能和配额"
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr "常规设置"
|
msgstr "常规设置"
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
msgid "Antispam"
|
msgid "Antispam"
|
||||||
msgstr "反垃圾邮件"
|
msgstr "反垃圾邮件"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
|
msgstr "垃圾邮件过滤器容忍度"
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:50
|
||||||
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:57
|
||||||
|
msgid "Initial admin"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:58
|
||||||
|
msgid "Admin password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:119
|
||||||
|
msgid "End of vacation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid "In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import forms
|
from mailu.ui import forms
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import flask_login
|
|||||||
import flask_wtf
|
import flask_wtf
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
LOCALPART_REGEX = "^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+$"
|
||||||
|
|
||||||
class DestinationField(fields.SelectMultipleField):
|
class DestinationField(fields.SelectMultipleField):
|
||||||
""" Allow for multiple emails selection from current user choices and
|
""" Allow for multiple emails selection from current user choices and
|
||||||
@@ -47,37 +48,62 @@ class DomainForm(flask_wtf.FlaskForm):
|
|||||||
max_users = fields_.IntegerField(_('Maximum user count'), default=10)
|
max_users = fields_.IntegerField(_('Maximum user count'), default=10)
|
||||||
max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10)
|
max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10)
|
||||||
max_quota_bytes = fields_.IntegerSliderField(_('Maximum user quota'), default=0)
|
max_quota_bytes = fields_.IntegerSliderField(_('Maximum user quota'), default=0)
|
||||||
|
signup_enabled = fields.BooleanField(_('Enable sign-up'), default=False)
|
||||||
comment = fields.StringField(_('Comment'))
|
comment = fields.StringField(_('Comment'))
|
||||||
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
|
class DomainSignupForm(flask_wtf.FlaskForm):
|
||||||
|
name = fields.StringField(_('Domain name'), [validators.DataRequired()])
|
||||||
|
localpart = fields.StringField(_('Initial admin'), [validators.DataRequired()])
|
||||||
|
pw = fields.PasswordField(_('Admin password'), [validators.DataRequired()])
|
||||||
|
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
|
||||||
|
captcha = flask_wtf.RecaptchaField()
|
||||||
submit = fields.SubmitField(_('Create'))
|
submit = fields.SubmitField(_('Create'))
|
||||||
|
|
||||||
|
|
||||||
class AlternativeForm(flask_wtf.FlaskForm):
|
class AlternativeForm(flask_wtf.FlaskForm):
|
||||||
name = fields.StringField(_('Alternative name'), [validators.DataRequired()])
|
name = fields.StringField(_('Alternative name'), [validators.DataRequired()])
|
||||||
submit = fields.SubmitField(_('Create'))
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
class RelayForm(flask_wtf.FlaskForm):
|
class RelayForm(flask_wtf.FlaskForm):
|
||||||
name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()])
|
name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()])
|
||||||
smtp = fields.StringField(_('Remote host'))
|
smtp = fields.StringField(_('Remote host'))
|
||||||
comment = fields.StringField(_('Comment'))
|
comment = fields.StringField(_('Comment'))
|
||||||
submit = fields.SubmitField(_('Create'))
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
class UserForm(flask_wtf.FlaskForm):
|
class UserForm(flask_wtf.FlaskForm):
|
||||||
localpart = fields.StringField(_('E-mail'), [validators.DataRequired()])
|
localpart = fields.StringField(_('E-mail'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
|
||||||
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
|
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
|
||||||
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
|
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
|
||||||
quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000)
|
quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000)
|
||||||
enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
|
enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
|
||||||
enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True)
|
enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True)
|
||||||
comment = fields.StringField(_('Comment'))
|
comment = fields.StringField(_('Comment'))
|
||||||
|
enabled = fields.BooleanField(_('Enabled'), default=True)
|
||||||
submit = fields.SubmitField(_('Save'))
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
|
class UserSignupForm(flask_wtf.FlaskForm):
|
||||||
|
localpart = fields.StringField(_('Email address'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
|
||||||
|
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
|
||||||
|
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
|
||||||
|
submit = fields.SubmitField(_('Sign up'))
|
||||||
|
|
||||||
|
class UserSignupFormCaptcha(UserSignupForm):
|
||||||
|
captcha = flask_wtf.RecaptchaField()
|
||||||
|
|
||||||
class UserSettingsForm(flask_wtf.FlaskForm):
|
class UserSettingsForm(flask_wtf.FlaskForm):
|
||||||
displayed_name = fields.StringField(_('Displayed name'))
|
displayed_name = fields.StringField(_('Displayed name'))
|
||||||
spam_enabled = fields.BooleanField(_('Enable spam filter'))
|
spam_enabled = fields.BooleanField(_('Enable spam filter'))
|
||||||
spam_threshold = fields_.IntegerSliderField(_('Spam filter tolerance'))
|
spam_threshold = fields_.IntegerSliderField(_('Spam filter tolerance'))
|
||||||
|
forward_enabled = fields.BooleanField(_('Enable forwarding'))
|
||||||
|
forward_keep = fields.BooleanField(_('Keep a copy of the emails'))
|
||||||
|
forward_destination = fields.StringField(
|
||||||
|
_('Destination'), [validators.Optional(), validators.Email()]
|
||||||
|
)
|
||||||
submit = fields.SubmitField(_('Save settings'))
|
submit = fields.SubmitField(_('Save settings'))
|
||||||
|
|
||||||
|
|
||||||
@@ -87,20 +113,12 @@ class UserPasswordForm(flask_wtf.FlaskForm):
|
|||||||
submit = fields.SubmitField(_('Update password'))
|
submit = fields.SubmitField(_('Update password'))
|
||||||
|
|
||||||
|
|
||||||
class UserForwardForm(flask_wtf.FlaskForm):
|
|
||||||
forward_enabled = fields.BooleanField(_('Enable forwarding'))
|
|
||||||
forward_keep = fields.BooleanField(_('Keep a copy of the emails'))
|
|
||||||
forward_destination = fields.StringField(
|
|
||||||
_('Destination'), [validators.Optional(), validators.Email()]
|
|
||||||
)
|
|
||||||
submit = fields.SubmitField(_('Update'))
|
|
||||||
|
|
||||||
|
|
||||||
class UserReplyForm(flask_wtf.FlaskForm):
|
class UserReplyForm(flask_wtf.FlaskForm):
|
||||||
reply_enabled = fields.BooleanField(_('Enable automatic reply'))
|
reply_enabled = fields.BooleanField(_('Enable automatic reply'))
|
||||||
reply_subject = fields.StringField(_('Reply subject'))
|
reply_subject = fields.StringField(_('Reply subject'))
|
||||||
reply_body = fields.StringField(_('Reply body'),
|
reply_body = fields.StringField(_('Reply body'),
|
||||||
widget=widgets.TextArea())
|
widget=widgets.TextArea())
|
||||||
|
reply_startdate = fields.html5.DateField(_('Start of vacation'))
|
||||||
reply_enddate = fields.html5.DateField(_('End of vacation'))
|
reply_enddate = fields.html5.DateField(_('End of vacation'))
|
||||||
submit = fields.SubmitField(_('Update'))
|
submit = fields.SubmitField(_('Update'))
|
||||||
|
|
||||||
@@ -114,7 +132,7 @@ class TokenForm(flask_wtf.FlaskForm):
|
|||||||
ip = fields.StringField(
|
ip = fields.StringField(
|
||||||
_('Authorized IP'), [validators.Optional(), validators.IPAddress()]
|
_('Authorized IP'), [validators.Optional(), validators.IPAddress()]
|
||||||
)
|
)
|
||||||
submit = fields.SubmitField(_('Create'))
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
class AliasForm(flask_wtf.FlaskForm):
|
class AliasForm(flask_wtf.FlaskForm):
|
||||||
@@ -123,7 +141,7 @@ class AliasForm(flask_wtf.FlaskForm):
|
|||||||
_('Use SQL LIKE Syntax (e.g. for catch-all aliases)'))
|
_('Use SQL LIKE Syntax (e.g. for catch-all aliases)'))
|
||||||
destination = DestinationField(_('Destination'))
|
destination = DestinationField(_('Destination'))
|
||||||
comment = fields.StringField(_('Comment'))
|
comment = fields.StringField(_('Comment'))
|
||||||
submit = fields.SubmitField(_('Create'))
|
submit = fields.SubmitField(_('Save'))
|
||||||
|
|
||||||
|
|
||||||
class AdminForm(flask_wtf.FlaskForm):
|
class AdminForm(flask_wtf.FlaskForm):
|
||||||
|
|||||||
4
core/admin/mailu/ui/static/fontawesome/css/font-awesome.min.css
vendored
Normal file
4
core/admin/mailu/ui/static/fontawesome/css/font-awesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
core/admin/mailu/ui/static/fontawesome/fonts/FontAwesome.otf
Normal file
BIN
core/admin/mailu/ui/static/fontawesome/fonts/FontAwesome.otf
Normal file
Binary file not shown.
Binary file not shown.
2671
core/admin/mailu/ui/static/fontawesome/fonts/fontawesome-webfont.svg
Normal file
2671
core/admin/mailu/ui/static/fontawesome/fonts/fontawesome-webfont.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 434 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -5,7 +5,7 @@
|
|||||||
{% block styles %}
|
{% block styles %}
|
||||||
{{super()}}
|
{{super()}}
|
||||||
<link rel="stylesheet" href="{{ url_for('.static', filename='select2/css/select2.min.css') }}">
|
<link rel="stylesheet" href="{{ url_for('.static', filename='select2/css/select2.min.css') }}">
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
|
<link rel="stylesheet" href="{{ url_for('.static', filename='fontawesome/css/font-awesome.min.css') }}">
|
||||||
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/AdminLTE.min.css') }}">
|
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/AdminLTE.min.css') }}">
|
||||||
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/skin-blue.min.css') }}">
|
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/skin-blue.min.css') }}">
|
||||||
<link rel="stylesheet" href="{{ url_for('.static', filename='app.css') }}">
|
<link rel="stylesheet" href="{{ url_for('.static', filename='app.css') }}">
|
||||||
|
|||||||
65
core/admin/mailu/ui/templates/client.html
Normal file
65
core/admin/mailu/ui/templates/client.html
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans %}Client setup{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block subtitle %}
|
||||||
|
configure your email client
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% call macros.box(title="Incoming mail") %}
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Mail protocol{% endtrans %}</th>
|
||||||
|
<td>IMAP</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}TCP port{% endtrans %}</th>
|
||||||
|
<td>{{ "143" if config["TLS_FLAVOR"] == "notls" else "993 (TLS) or 143 (STARTTLS)" }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Server name{% endtrans %}</th>
|
||||||
|
<td><pre>{{ config["HOSTNAMES"].split(',')[0] }}</pre></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Username{% endtrans %}</th>
|
||||||
|
<td><pre>{{ current_user if current_user.is_authenticated else "******" }}</pre></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Password{% endtrans %}</th>
|
||||||
|
<td><pre>*******</pre></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call macros.box(title="Outgoing mail") %}
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Mail protocol{% endtrans %}</th>
|
||||||
|
<td>SMTP</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}TCP port{% endtrans %}</th>
|
||||||
|
<td>{{ "25" if config["TLS_FLAVOR"] == "notls" else "465 (TLS) or 587 (STARTTLS)" }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Server name{% endtrans %}</th>
|
||||||
|
<td><pre>{{ config["HOSTNAMES"].split(',')[0] }}</pre></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Username{% endtrans %}</th>
|
||||||
|
<td><pre>{{ current_user or "******" }}</pre></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Password{% endtrans %}</th>
|
||||||
|
<td><pre>*******</pre></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endcall %}
|
||||||
|
{% endblock %}
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
{{ macros.form_field(form.max_quota_bytes, step=1000000000, max=50000000000,
|
{{ macros.form_field(form.max_quota_bytes, step=1000000000, max=50000000000,
|
||||||
prepend='<span class="input-group-addon"><span id="quota">'+((form.max_quota_bytes.data//1000000000).__str__() if form.max_quota_bytes.data else '∞')+'</span> GiB</span>',
|
prepend='<span class="input-group-addon"><span id="quota">'+((form.max_quota_bytes.data//1000000000).__str__() if form.max_quota_bytes.data else '∞')+'</span> GiB</span>',
|
||||||
oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
|
oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
|
||||||
|
{{ macros.form_field(form.signup_enabled) }}
|
||||||
{{ macros.form_field(form.comment) }}
|
{{ macros.form_field(form.comment) }}
|
||||||
{{ macros.form_field(form.submit) }}
|
{{ macros.form_field(form.submit) }}
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -10,7 +10,13 @@
|
|||||||
|
|
||||||
{% block main_action %}
|
{% block main_action %}
|
||||||
{% if current_user.global_admin %}
|
{% if current_user.global_admin %}
|
||||||
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">{% trans %}Regenerate keys{% endtrans %}</a>
|
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">
|
||||||
|
{% if domain.dkim_publickey %}
|
||||||
|
{% trans %}Regenerate keys{% endtrans %}
|
||||||
|
{% else %}
|
||||||
|
{% trans %}Generate keys{% endtrans %}
|
||||||
|
{% endif %}
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@@ -22,7 +28,7 @@
|
|||||||
<td>{{ domain.name }}</td>
|
<td>{{ domain.name }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans %}DNS MX entry{% endtrans %}</th>
|
<th>{% trans %}DNS MX entry{% endtrans %} <i class="fa {{ 'fa-check-circle' if domain.check_mx() else 'fa-exclamation-circle' }}"></i></th>
|
||||||
<td><pre>{{ domain.name }}. 600 IN MX 10 {{ hostname }}.</pre></td>
|
<td><pre>{{ domain.name }}. 600 IN MX 10 {{ hostname }}.</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
36
core/admin/mailu/ui/templates/domain/signup.html
Normal file
36
core/admin/mailu/ui/templates/domain/signup.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans %}Register a domain{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<form class="form" method="post" role="form">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
|
||||||
|
{% call macros.box(title="Requirements") %}
|
||||||
|
<p>{% trans %}In order to register a new domain, you must first setup the
|
||||||
|
domain zone so that the domain <code>MX</code> points to this server{% endtrans %}
|
||||||
|
(<code>{{ config["HOSTNAMES"].split(",")[0] }}</code>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{% trans %}If you do not know how to setup an <code>MX</code> record for your DNS zone,
|
||||||
|
please contact your DNS provider or administrator. Also, please wait a
|
||||||
|
couple minutes after the <code>MX</code> is set so the local server cache
|
||||||
|
expires.{% endtrans %}
|
||||||
|
</p>
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call macros.box() %}
|
||||||
|
{% if form.localpart %}
|
||||||
|
{{ macros.form_fields((form.localpart, form.name), append='<span class="input-group-addon">@</span>') }}
|
||||||
|
{{ macros.form_fields((form.pw, form.pw2)) }}
|
||||||
|
{% else %}
|
||||||
|
{{ macros.form_field(form.name) }}
|
||||||
|
{% endif %}
|
||||||
|
{{ macros.form_field(form.captcha) }}
|
||||||
|
{{ macros.form_field(form.submit) }}
|
||||||
|
{% endcall %}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -22,6 +22,10 @@
|
|||||||
{{ macros.form_field(form.password) }}
|
{{ macros.form_field(form.password) }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call macros.box(title="Settings") %}
|
||||||
|
{{ macros.form_field(form.keep) }}
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
{{ macros.form_field(form.submit) }}
|
{{ macros.form_field(form.submit) }}
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block title %}
|
|
||||||
{% trans %}Services status{% endtrans %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% call macros.table() %}
|
|
||||||
<tr>
|
|
||||||
<th>{% trans %}Service{% endtrans %}</th>
|
|
||||||
<th>{% trans %}Status{% endtrans %}</th>
|
|
||||||
<th>{% trans %}PID{% endtrans %}</th>
|
|
||||||
<th>{% trans %}Image{% endtrans %}</th>
|
|
||||||
<th>{% trans %}Started{% endtrans %}</th>
|
|
||||||
<th>{% trans %}Last update{% endtrans %}</th>
|
|
||||||
</tr>
|
|
||||||
{% for name, container in containers.items() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ name }}</td>
|
|
||||||
<td><span class="label label-{{ "success" if container['State']['Running'] else "danger" }}">{{ container['State']['Status'] }}</span></td>
|
|
||||||
<td>{{ container['State']['Pid'] }}</td>
|
|
||||||
<td>{{ container['Config']['Image'] }}</td>
|
|
||||||
<td>{{ container['State']['StartedAt'] }}</td>
|
|
||||||
<td>{{ container['Image']['Created'] }}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endcall %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -16,11 +16,6 @@
|
|||||||
<i class="fa fa-lock"></i> <span>{% trans %}Update password{% endtrans %}</span>
|
<i class="fa fa-lock"></i> <span>{% trans %}Update password{% endtrans %}</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="{{ url_for('.user_forward') }}">
|
|
||||||
<i class="fa fa-share"></i> <span>{% trans %}Auto-forward{% endtrans %}</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('.user_reply') }}">
|
<a href="{{ url_for('.user_reply') }}">
|
||||||
<i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span>
|
<i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span>
|
||||||
@@ -37,13 +32,10 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
{% if current_user.manager_of or current_user.global_admin %}
|
||||||
<li class="header">{% trans %}Administration{% endtrans %}</li>
|
<li class="header">{% trans %}Administration{% endtrans %}</li>
|
||||||
|
{% endif %}
|
||||||
{% if current_user.global_admin %}
|
{% if current_user.global_admin %}
|
||||||
<li>
|
|
||||||
<a href="{{ url_for('.services') }}">
|
|
||||||
<i class="fa fa-dashboard"></i> <span>{% trans %}Services status{% endtrans %}</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('.announcement') }}">
|
<a href="{{ url_for('.announcement') }}">
|
||||||
<i class="fa fa-bullhorn"></i> <span>{% trans %}Announcement{% endtrans %}</span>
|
<i class="fa fa-bullhorn"></i> <span>{% trans %}Announcement{% endtrans %}</span>
|
||||||
@@ -82,6 +74,11 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ url_for('.client') }}">
|
||||||
|
<i class="fa fa-laptop"></i> <span>{% trans %}Client setup{% endtrans %}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ config["WEBSITE"] }}">
|
<a href="{{ config["WEBSITE"] }}">
|
||||||
<i class="fa fa-globe"></i> <span>{% trans %}Website{% endtrans %}</span>
|
<i class="fa fa-globe"></i> <span>{% trans %}Website{% endtrans %}</span>
|
||||||
@@ -92,6 +89,13 @@
|
|||||||
<i class="fa fa-life-ring"></i> <span>{% trans %}Help{% endtrans %}</span>
|
<i class="fa fa-life-ring"></i> <span>{% trans %}Help{% endtrans %}</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% if config['DOMAIN_REGISTRATION'] %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ url_for('.domain_signup') }}">
|
||||||
|
<i class="fa fa-plus-square"></i> <span>{% trans %}Register a domain{% endtrans %}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% if current_user.is_authenticated %}
|
{% if current_user.is_authenticated %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('.logout') }}">
|
<a href="{{ url_for('.logout') }}">
|
||||||
@@ -100,10 +104,17 @@
|
|||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li>
|
<li>
|
||||||
<a href="#">
|
<a href="{{ url_for('.login') }}">
|
||||||
<i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span>
|
<i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% if signup_domains %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ url_for('.user_signup') }}">
|
||||||
|
<i class="fa fa-user-plus"></i> <span>{% trans %}Sign up{% endtrans %}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -16,12 +16,13 @@
|
|||||||
{{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }}
|
{{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }}
|
||||||
{{ macros.form_fields((form.pw, form.pw2)) }}
|
{{ macros.form_fields((form.pw, form.pw2)) }}
|
||||||
{{ macros.form_field(form.comment) }}
|
{{ macros.form_field(form.comment) }}
|
||||||
|
{{ macros.form_field(form.enabled) }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|
||||||
{% call macros.box(_("Features and quotas"), theme="success") %}
|
{% call macros.box(_("Features and quotas"), theme="success") %}
|
||||||
{{ macros.form_field(form.quota_bytes, step=1000000000, max=(max_quota_bytes or domain.max_quota_bytes or 50000000000),
|
{{ macros.form_field(form.quota_bytes, step=1000000000, max=(max_quota_bytes or domain.max_quota_bytes or 50000000000),
|
||||||
prepend='<span class="input-group-addon"><span id="quota">'+(form.quota_bytes.data//1000000000).__str__()+'</span> GiB</span>',
|
prepend='<span class="input-group-addon"><span id="quota">'+((form.quota_bytes.data//1000000000).__str__() if form.quota_bytes.data else '∞')+'</span> GiB</span>',
|
||||||
oninput='$("#quota").text(this.value/1000000000);') }}
|
oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
|
||||||
{{ macros.form_field(form.enable_imap) }}
|
{{ macros.form_field(form.enable_imap) }}
|
||||||
{{ macros.form_field(form.enable_pop) }}
|
{{ macros.form_field(form.enable_pop) }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('.user_settings', user_email=user.email) }}" title="{% trans %}Settings{% endtrans %}"><i class="fa fa-wrench"></i></a>
|
<a href="{{ url_for('.user_settings', user_email=user.email) }}" title="{% trans %}Settings{% endtrans %}"><i class="fa fa-wrench"></i></a>
|
||||||
<a href="{{ url_for('.user_forward', user_email=user.email) }}" title="{% trans %}Auto-forward{% endtrans %}"><i class="fa fa-share"></i></a>
|
|
||||||
<a href="{{ url_for('.user_reply', user_email=user.email) }}" title="{% trans %}Auto-reply{% endtrans %}"><i class="fa fa-plane"></i></a>
|
<a href="{{ url_for('.user_reply', user_email=user.email) }}" title="{% trans %}Auto-reply{% endtrans %}"><i class="fa fa-plane"></i></a>
|
||||||
<a href="{{ url_for('.fetch_list', user_email=user.email) }}" title="{% trans %}Fetched accounts{% endtrans %}"><i class="fa fa-download"></i></a>
|
<a href="{{ url_for('.fetch_list', user_email=user.email) }}" title="{% trans %}Fetched accounts{% endtrans %}"><i class="fa fa-download"></i></a>
|
||||||
</td>
|
</td>
|
||||||
@@ -41,7 +40,7 @@
|
|||||||
{% if user.enable_imap %}<span class="label label-info">imap</span>{% endif %}
|
{% if user.enable_imap %}<span class="label label-info">imap</span>{% endif %}
|
||||||
{% if user.enable_pop %}<span class="label label-info">pop3</span>{% endif %}
|
{% if user.enable_pop %}<span class="label label-info">pop3</span>{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>{{ user.quota_bytes | filesizeformat }}</td>
|
<td>{{ user.quota_bytes_used | filesizeformat }} / {{ (user.quota_bytes | filesizeformat) if user.quota_bytes else '∞' }}</td>
|
||||||
<td>{{ user.comment or '-' }}</td>
|
<td>{{ user.comment or '-' }}</td>
|
||||||
<td>{{ user.created_at }}</td>
|
<td>{{ user.created_at }}</td>
|
||||||
<td>{{ user.updated_at or '' }}</td>
|
<td>{{ user.updated_at or '' }}</td>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<form class="form" method="post" role="form">
|
<form class="form" method="post" role="form">
|
||||||
{{ form.hidden_tag() }}
|
{{ form.hidden_tag() }}
|
||||||
{{ macros.form_field(form.reply_enabled,
|
{{ macros.form_field(form.reply_enabled,
|
||||||
onchange="if(this.checked){$('#reply_subject,#reply_body,#reply_enddate').removeAttr('readonly')}
|
onchange="if(this.checked){$('#reply_subject,#reply_body,#reply_enddate,#reply_startdate').removeAttr('readonly')}
|
||||||
else{$('#reply_subject,#reply_body,#reply_enddate').attr('readonly', '')}") }}
|
else{$('#reply_subject,#reply_body,#reply_enddate').attr('readonly', '')}") }}
|
||||||
{{ macros.form_field(form.reply_subject,
|
{{ macros.form_field(form.reply_subject,
|
||||||
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
||||||
@@ -21,6 +21,9 @@
|
|||||||
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
||||||
{{ macros.form_field(form.reply_enddate,
|
{{ macros.form_field(form.reply_enddate,
|
||||||
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
||||||
|
{{ macros.form_field(form.reply_startdate,
|
||||||
|
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
|
||||||
|
|
||||||
{{ macros.form_field(form.submit) }}
|
{{ macros.form_field(form.submit) }}
|
||||||
</form>
|
</form>
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|||||||
@@ -11,9 +11,6 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<form class="form" method="post" role="form">
|
<form class="form" method="post" role="form">
|
||||||
{{ form.hidden_tag() }}
|
{{ form.hidden_tag() }}
|
||||||
{% call macros.box(title=_("General settings")) %}
|
|
||||||
{{ macros.form_field(form.displayed_name) }}
|
|
||||||
{% endcall %}
|
|
||||||
|
|
||||||
{% call macros.box(title=_("Antispam")) %}
|
{% call macros.box(title=_("Antispam")) %}
|
||||||
{{ macros.form_field(form.spam_enabled) }}
|
{{ macros.form_field(form.spam_enabled) }}
|
||||||
@@ -21,6 +18,17 @@
|
|||||||
prepend='<span class="input-group-addon"><span id="threshold">'+form.spam_threshold.data.__str__()+'</span> / 100</span>',
|
prepend='<span class="input-group-addon"><span id="threshold">'+form.spam_threshold.data.__str__()+'</span> / 100</span>',
|
||||||
oninput='$("#threshold").text(this.value);') }}
|
oninput='$("#threshold").text(this.value);') }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|
||||||
|
{% call macros.box(title=_("Auto-forward")) %}
|
||||||
|
{{ macros.form_field(form.forward_enabled,
|
||||||
|
onchange="if(this.checked){$('#forward_destination,#forward_keep').removeAttr('disabled')}
|
||||||
|
else{$('#forward_destination,#forward_keep').attr('disabled', '')}") }}
|
||||||
|
{{ macros.form_field(form.forward_keep,
|
||||||
|
**{("enabled" if user.forward_enabled else "disabled"): ""}) }}
|
||||||
|
{{ macros.form_field(form.forward_destination,
|
||||||
|
**{("enabled" if user.forward_enabled else "disabled"): ""}) }}
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
{{ macros.form_field(form.submit) }}
|
{{ macros.form_field(form.submit) }}
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
23
core/admin/mailu/ui/templates/user/signup.html
Normal file
23
core/admin/mailu/ui/templates/user/signup.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans %}Sign up{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block subtitle %}
|
||||||
|
{{ domain }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<form class="form" method="post" role="form">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
{% call macros.box() %}
|
||||||
|
{{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }}
|
||||||
|
{{ macros.form_fields((form.pw, form.pw2)) }}
|
||||||
|
{% if form.captcha %}
|
||||||
|
{{ macros.form_field(form.captcha) }}
|
||||||
|
{% endif %}
|
||||||
|
{{ macros.form_field(form.submit) }}
|
||||||
|
{% endcall %}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
26
core/admin/mailu/ui/templates/user/signup_domain.html
Normal file
26
core/admin/mailu/ui/templates/user/signup_domain.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans %}Sign up{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block subtitle %}
|
||||||
|
{% trans %}pick a domain for the new account{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% call macros.table() %}
|
||||||
|
<tr>
|
||||||
|
<th>{% trans %}Domain{% endtrans %}</th>
|
||||||
|
<th>{% trans %}Available slots{% endtrans %}</th>
|
||||||
|
<th>{% trans %}Quota{% endtrans %}</th>
|
||||||
|
</tr>
|
||||||
|
{% for domain_name, domain in available_domains.items() %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{ url_for('.user_signup', domain_name=domain_name) }}">{{ domain_name }}</a></td>
|
||||||
|
<td>{{ domain.max_users - (domain.users | count) if domain.max_users else '∞' }}</td>
|
||||||
|
<td>{{ domain.max_quota_bytes or config['DEFAULT_QUOTA'] | filesizeformat }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
{% endcall %}
|
||||||
|
{% endblock %}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -25,7 +25,7 @@ def admin_create():
|
|||||||
user = models.User.query.get(form.admin.data)
|
user = models.User.query.get(form.admin.data)
|
||||||
if user:
|
if user:
|
||||||
user.global_admin = True
|
user.global_admin = True
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s is now admin' % user)
|
flask.flash('User %s is now admin' % user)
|
||||||
return flask.redirect(flask.url_for('.admin_list'))
|
return flask.redirect(flask.url_for('.admin_list'))
|
||||||
else:
|
else:
|
||||||
@@ -40,7 +40,7 @@ def admin_delete(admin):
|
|||||||
user = models.User.query.get(admin)
|
user = models.User.query.get(admin)
|
||||||
if user:
|
if user:
|
||||||
user.global_admin = False
|
user.global_admin = False
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s is no longer admin' % user)
|
flask.flash('User %s is no longer admin' % user)
|
||||||
return flask.redirect(flask.url_for('.admin_list'))
|
return flask.redirect(flask.url_for('.admin_list'))
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -27,8 +27,8 @@ def alias_create(domain_name):
|
|||||||
else:
|
else:
|
||||||
alias = models.Alias(domain=domain)
|
alias = models.Alias(domain=domain)
|
||||||
form.populate_obj(alias)
|
form.populate_obj(alias)
|
||||||
db.session.add(alias)
|
models.db.session.add(alias)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Alias %s created' % alias)
|
flask.flash('Alias %s created' % alias)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.alias_list', domain_name=domain.name))
|
flask.url_for('.alias_list', domain_name=domain.name))
|
||||||
@@ -45,7 +45,7 @@ def alias_edit(alias):
|
|||||||
form.localpart.validators = []
|
form.localpart.validators = []
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(alias)
|
form.populate_obj(alias)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Alias %s updated' % alias)
|
flask.flash('Alias %s updated' % alias)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.alias_list', domain_name=alias.domain.name))
|
flask.url_for('.alias_list', domain_name=alias.domain.name))
|
||||||
@@ -59,8 +59,8 @@ def alias_edit(alias):
|
|||||||
def alias_delete(alias):
|
def alias_delete(alias):
|
||||||
alias = models.Alias.query.get(alias) or flask.abort(404)
|
alias = models.Alias.query.get(alias) or flask.abort(404)
|
||||||
domain = alias.domain
|
domain = alias.domain
|
||||||
db.session.delete(alias)
|
models.db.session.delete(alias)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Alias %s deleted' % alias)
|
flask.flash('Alias %s deleted' % alias)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.alias_list', domain_name=domain.name))
|
flask.url_for('.alias_list', domain_name=domain.name))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -26,8 +26,8 @@ def alternative_create(domain_name):
|
|||||||
else:
|
else:
|
||||||
alternative = models.Alternative(domain=domain)
|
alternative = models.Alternative(domain=domain)
|
||||||
form.populate_obj(alternative)
|
form.populate_obj(alternative)
|
||||||
db.session.add(alternative)
|
models.db.session.add(alternative)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Alternative domain %s created' % alternative)
|
flask.flash('Alternative domain %s created' % alternative)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.alternative_list', domain_name=domain.name))
|
flask.url_for('.alternative_list', domain_name=domain.name))
|
||||||
@@ -41,8 +41,8 @@ def alternative_create(domain_name):
|
|||||||
def alternative_delete(alternative):
|
def alternative_delete(alternative):
|
||||||
alternative = models.Alternative.query.get(alternative) or flask.abort(404)
|
alternative = models.Alternative.query.get(alternative) or flask.abort(404)
|
||||||
domain = alternative.domain
|
domain = alternative.domain
|
||||||
db.session.delete(alternative)
|
models.db.session.delete(alternative)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Alternative %s deleted' % alternative)
|
flask.flash('Alternative %s deleted' % alternative)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.alternative_list', domain_name=domain.name))
|
flask.url_for('.alternative_list', domain_name=domain.name))
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
from mailu import dockercli, app, db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
import flask_login
|
import flask_login
|
||||||
|
|
||||||
from urllib import parse
|
|
||||||
|
|
||||||
|
|
||||||
@ui.route('/', methods=["GET"])
|
@ui.route('/', methods=["GET"])
|
||||||
@access.authenticated
|
@access.authenticated
|
||||||
@@ -20,7 +18,7 @@ def login():
|
|||||||
user = models.User.login(form.email.data, form.pw.data)
|
user = models.User.login(form.email.data, form.pw.data)
|
||||||
if user:
|
if user:
|
||||||
flask_login.login_user(user)
|
flask_login.login_user(user)
|
||||||
endpoint = flask.request.args.get('next')
|
endpoint = flask.request.args.get('next', '.index')
|
||||||
return flask.redirect(flask.url_for(endpoint)
|
return flask.redirect(flask.url_for(endpoint)
|
||||||
or flask.url_for('.index'))
|
or flask.url_for('.index'))
|
||||||
else:
|
else:
|
||||||
@@ -35,16 +33,6 @@ def logout():
|
|||||||
return flask.redirect(flask.url_for('.index'))
|
return flask.redirect(flask.url_for('.index'))
|
||||||
|
|
||||||
|
|
||||||
@ui.route('/services', methods=['GET'])
|
|
||||||
@access.global_admin
|
|
||||||
def services():
|
|
||||||
try:
|
|
||||||
containers = dockercli.get()
|
|
||||||
except Exception as error:
|
|
||||||
return flask.render_template('docker-error.html', error=error)
|
|
||||||
return flask.render_template('services.html', containers=containers)
|
|
||||||
|
|
||||||
|
|
||||||
@ui.route('/announcement', methods=['GET', 'POST'])
|
@ui.route('/announcement', methods=['GET', 'POST'])
|
||||||
@access.global_admin
|
@access.global_admin
|
||||||
def announcement():
|
def announcement():
|
||||||
@@ -58,3 +46,8 @@ def announcement():
|
|||||||
form.announcement_body.data = ''
|
form.announcement_body.data = ''
|
||||||
flask.flash('Your announcement was sent', 'success')
|
flask.flash('Your announcement was sent', 'success')
|
||||||
return flask.render_template('announcement.html', form=form)
|
return flask.render_template('announcement.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
|
@ui.route('/client', methods=['GET'])
|
||||||
|
def client():
|
||||||
|
return flask.render_template('client.html')
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
from mailu import app, db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
|
import flask_login
|
||||||
import wtforms_components
|
import wtforms_components
|
||||||
|
import dns.resolver
|
||||||
|
|
||||||
|
|
||||||
@ui.route('/domain', methods=['GET'])
|
@ui.route('/domain', methods=['GET'])
|
||||||
@@ -24,8 +27,8 @@ def domain_create():
|
|||||||
else:
|
else:
|
||||||
domain = models.Domain()
|
domain = models.Domain()
|
||||||
form.populate_obj(domain)
|
form.populate_obj(domain)
|
||||||
db.session.add(domain)
|
models.db.session.add(domain)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Domain %s created' % domain)
|
flask.flash('Domain %s created' % domain)
|
||||||
return flask.redirect(flask.url_for('.domain_list'))
|
return flask.redirect(flask.url_for('.domain_list'))
|
||||||
return flask.render_template('domain/create.html', form=form)
|
return flask.render_template('domain/create.html', form=form)
|
||||||
@@ -40,7 +43,7 @@ def domain_edit(domain_name):
|
|||||||
form.name.validators = []
|
form.name.validators = []
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(domain)
|
form.populate_obj(domain)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Domain %s saved' % domain)
|
flask.flash('Domain %s saved' % domain)
|
||||||
return flask.redirect(flask.url_for('.domain_list'))
|
return flask.redirect(flask.url_for('.domain_list'))
|
||||||
return flask.render_template('domain/edit.html', form=form,
|
return flask.render_template('domain/edit.html', form=form,
|
||||||
@@ -52,8 +55,8 @@ def domain_edit(domain_name):
|
|||||||
@access.confirmation_required("delete {domain_name}")
|
@access.confirmation_required("delete {domain_name}")
|
||||||
def domain_delete(domain_name):
|
def domain_delete(domain_name):
|
||||||
domain = models.Domain.query.get(domain_name) or flask.abort(404)
|
domain = models.Domain.query.get(domain_name) or flask.abort(404)
|
||||||
db.session.delete(domain)
|
models.db.session.delete(domain)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Domain %s deleted' % domain)
|
flask.flash('Domain %s deleted' % domain)
|
||||||
return flask.redirect(flask.url_for('.domain_list'))
|
return flask.redirect(flask.url_for('.domain_list'))
|
||||||
|
|
||||||
@@ -73,3 +76,44 @@ def domain_genkeys(domain_name):
|
|||||||
domain.generate_dkim_key()
|
domain.generate_dkim_key()
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for(".domain_details", domain_name=domain_name))
|
flask.url_for(".domain_details", domain_name=domain_name))
|
||||||
|
|
||||||
|
|
||||||
|
@ui.route('/domain/signup', methods=['GET', 'POST'])
|
||||||
|
def domain_signup(domain_name=None):
|
||||||
|
if not app.config['DOMAIN_REGISTRATION']:
|
||||||
|
flask.abort(403)
|
||||||
|
form = forms.DomainSignupForm()
|
||||||
|
if flask_login.current_user.is_authenticated:
|
||||||
|
del form.localpart
|
||||||
|
del form.pw
|
||||||
|
del form.pw2
|
||||||
|
if form.validate_on_submit():
|
||||||
|
conflicting_domain = models.Domain.query.get(form.name.data)
|
||||||
|
conflicting_alternative = models.Alternative.query.get(form.name.data)
|
||||||
|
conflicting_relay = models.Relay.query.get(form.name.data)
|
||||||
|
if conflicting_domain or conflicting_alternative or conflicting_relay:
|
||||||
|
flask.flash('Domain %s is already used' % form.name.data, 'error')
|
||||||
|
else:
|
||||||
|
domain = models.Domain()
|
||||||
|
form.populate_obj(domain)
|
||||||
|
domain.max_quota_bytes = app.config['DEFAULT_QUOTA']
|
||||||
|
domain.max_users = 10
|
||||||
|
domain.max_aliases = 10
|
||||||
|
if domain.check_mx():
|
||||||
|
models.db.session.add(domain)
|
||||||
|
if flask_login.current_user.is_authenticated:
|
||||||
|
user = models.User.query.get(flask_login.current_user.email)
|
||||||
|
else:
|
||||||
|
user = models.User()
|
||||||
|
user.domain = domain
|
||||||
|
form.populate_obj(user)
|
||||||
|
user.set_password(form.pw.data)
|
||||||
|
user.quota_bytes = domain.max_quota_bytes
|
||||||
|
models.db.session.add(user)
|
||||||
|
domain.managers.append(user)
|
||||||
|
models.db.session.commit()
|
||||||
|
flask.flash('Domain %s created' % domain)
|
||||||
|
return flask.redirect(flask.url_for('.domain_list'))
|
||||||
|
else:
|
||||||
|
flask.flash('The MX record was not properly set', 'error')
|
||||||
|
return flask.render_template('domain/signup.html', form=form)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -24,8 +24,8 @@ def fetch_create(user_email):
|
|||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
fetch = models.Fetch(user=user)
|
fetch = models.Fetch(user=user)
|
||||||
form.populate_obj(fetch)
|
form.populate_obj(fetch)
|
||||||
db.session.add(fetch)
|
models.db.session.add(fetch)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Fetch configuration created')
|
flask.flash('Fetch configuration created')
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.fetch_list', user_email=user.email))
|
flask.url_for('.fetch_list', user_email=user.email))
|
||||||
@@ -39,7 +39,7 @@ def fetch_edit(fetch_id):
|
|||||||
form = forms.FetchForm(obj=fetch)
|
form = forms.FetchForm(obj=fetch)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(fetch)
|
form.populate_obj(fetch)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Fetch configuration updated')
|
flask.flash('Fetch configuration updated')
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.fetch_list', user_email=fetch.user.email))
|
flask.url_for('.fetch_list', user_email=fetch.user.email))
|
||||||
@@ -53,8 +53,8 @@ def fetch_edit(fetch_id):
|
|||||||
def fetch_delete(fetch_id):
|
def fetch_delete(fetch_id):
|
||||||
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
|
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
|
||||||
user = fetch.user
|
user = fetch.user
|
||||||
db.session.delete(fetch)
|
models.db.session.delete(fetch)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Fetch configuration delete')
|
flask.flash('Fetch configuration delete')
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.fetch_list', user_email=user.email))
|
flask.url_for('.fetch_list', user_email=user.email))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -30,7 +30,7 @@ def manager_create(domain_name):
|
|||||||
flask.flash('User %s is already manager' % user, 'error')
|
flask.flash('User %s is already manager' % user, 'error')
|
||||||
else:
|
else:
|
||||||
domain.managers.append(user)
|
domain.managers.append(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s can now manage %s' % (user, domain.name))
|
flask.flash('User %s can now manage %s' % (user, domain.name))
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.manager_list', domain_name=domain.name))
|
flask.url_for('.manager_list', domain_name=domain.name))
|
||||||
@@ -46,7 +46,7 @@ def manager_delete(domain_name, user_email):
|
|||||||
user = models.User.query.get(user_email) or flask.abort(404)
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
if user in domain.managers:
|
if user in domain.managers:
|
||||||
domain.managers.remove(user)
|
domain.managers.remove(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s can no longer manager %s' % (user, domain))
|
flask.flash('User %s can no longer manager %s' % (user, domain))
|
||||||
else:
|
else:
|
||||||
flask.flash('User %s is not manager' % user, 'error')
|
flask.flash('User %s is not manager' % user, 'error')
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
@@ -25,8 +25,8 @@ def relay_create():
|
|||||||
else:
|
else:
|
||||||
relay = models.Relay()
|
relay = models.Relay()
|
||||||
form.populate_obj(relay)
|
form.populate_obj(relay)
|
||||||
db.session.add(relay)
|
models.db.session.add(relay)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Relayed domain %s created' % relay)
|
flask.flash('Relayed domain %s created' % relay)
|
||||||
return flask.redirect(flask.url_for('.relay_list'))
|
return flask.redirect(flask.url_for('.relay_list'))
|
||||||
return flask.render_template('relay/create.html', form=form)
|
return flask.render_template('relay/create.html', form=form)
|
||||||
@@ -41,7 +41,7 @@ def relay_edit(relay_name):
|
|||||||
form.name.validators = []
|
form.name.validators = []
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(relay)
|
form.populate_obj(relay)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Relayed domain %s saved' % relay)
|
flask.flash('Relayed domain %s saved' % relay)
|
||||||
return flask.redirect(flask.url_for('.relay_list'))
|
return flask.redirect(flask.url_for('.relay_list'))
|
||||||
return flask.render_template('relay/edit.html', form=form,
|
return flask.render_template('relay/edit.html', form=form,
|
||||||
@@ -53,8 +53,8 @@ def relay_edit(relay_name):
|
|||||||
@access.confirmation_required("delete {relay_name}")
|
@access.confirmation_required("delete {relay_name}")
|
||||||
def relay_delete(relay_name):
|
def relay_delete(relay_name):
|
||||||
relay = models.Relay.query.get(relay_name) or flask.abort(404)
|
relay = models.Relay.query.get(relay_name) or flask.abort(404)
|
||||||
db.session.delete(relay)
|
models.db.session.delete(relay)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Relayed domain %s deleted' % relay)
|
flask.flash('Relayed domain %s deleted' % relay)
|
||||||
return flask.redirect(flask.url_for('.relay_list'))
|
return flask.redirect(flask.url_for('.relay_list'))
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, forms, access
|
from mailu.ui import ui, forms, access
|
||||||
|
|
||||||
from passlib import pwd
|
from passlib import pwd
|
||||||
@@ -32,8 +32,8 @@ def token_create(user_email):
|
|||||||
token = models.Token(user=user)
|
token = models.Token(user=user)
|
||||||
token.set_password(form.raw_password.data)
|
token.set_password(form.raw_password.data)
|
||||||
form.populate_obj(token)
|
form.populate_obj(token)
|
||||||
db.session.add(token)
|
models.db.session.add(token)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Authentication token created')
|
flask.flash('Authentication token created')
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.token_list', user_email=user.email))
|
flask.url_for('.token_list', user_email=user.email))
|
||||||
@@ -46,8 +46,8 @@ def token_create(user_email):
|
|||||||
def token_delete(token_id):
|
def token_delete(token_id):
|
||||||
token = models.Token.query.get(token_id) or flask.abort(404)
|
token = models.Token.query.get(token_id) or flask.abort(404)
|
||||||
user = token.user
|
user = token.user
|
||||||
db.session.delete(token)
|
models.db.session.delete(token)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Authentication token deleted')
|
flask.flash('Authentication token deleted')
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.token_list', user_email=user.email))
|
flask.url_for('.token_list', user_email=user.email))
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from mailu import db, models
|
from mailu import models
|
||||||
from mailu.ui import ui, access, forms
|
from mailu.ui import ui, access, forms
|
||||||
|
from flask import current_app as app
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
import flask_login
|
import flask_login
|
||||||
@@ -33,8 +34,8 @@ def user_create(domain_name):
|
|||||||
user = models.User(domain=domain)
|
user = models.User(domain=domain)
|
||||||
form.populate_obj(user)
|
form.populate_obj(user)
|
||||||
user.set_password(form.pw.data)
|
user.set_password(form.pw.data)
|
||||||
db.session.add(user)
|
models.db.session.add(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
user.send_welcome()
|
user.send_welcome()
|
||||||
flask.flash('User %s created' % user)
|
flask.flash('User %s created' % user)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
@@ -63,7 +64,7 @@ def user_edit(user_email):
|
|||||||
form.populate_obj(user)
|
form.populate_obj(user)
|
||||||
if form.pw.data:
|
if form.pw.data:
|
||||||
user.set_password(form.pw.data)
|
user.set_password(form.pw.data)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s updated' % user)
|
flask.flash('User %s updated' % user)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.user_list', domain_name=user.domain.name))
|
flask.url_for('.user_list', domain_name=user.domain.name))
|
||||||
@@ -77,8 +78,8 @@ def user_edit(user_email):
|
|||||||
def user_delete(user_email):
|
def user_delete(user_email):
|
||||||
user = models.User.query.get(user_email) or flask.abort(404)
|
user = models.User.query.get(user_email) or flask.abort(404)
|
||||||
domain = user.domain
|
domain = user.domain
|
||||||
db.session.delete(user)
|
models.db.session.delete(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('User %s deleted' % user)
|
flask.flash('User %s deleted' % user)
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.user_list', domain_name=domain.name))
|
flask.url_for('.user_list', domain_name=domain.name))
|
||||||
@@ -93,7 +94,7 @@ def user_settings(user_email):
|
|||||||
form = forms.UserSettingsForm(obj=user)
|
form = forms.UserSettingsForm(obj=user)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(user)
|
form.populate_obj(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Settings updated for %s' % user)
|
flask.flash('Settings updated for %s' % user)
|
||||||
if user_email:
|
if user_email:
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
@@ -113,7 +114,7 @@ def user_password(user_email):
|
|||||||
flask.flash('Passwords do not match', 'error')
|
flask.flash('Passwords do not match', 'error')
|
||||||
else:
|
else:
|
||||||
user.set_password(form.pw.data)
|
user.set_password(form.pw.data)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Password updated for %s' % user)
|
flask.flash('Password updated for %s' % user)
|
||||||
if user_email:
|
if user_email:
|
||||||
return flask.redirect(flask.url_for('.user_list',
|
return flask.redirect(flask.url_for('.user_list',
|
||||||
@@ -130,7 +131,7 @@ def user_forward(user_email):
|
|||||||
form = forms.UserForwardForm(obj=user)
|
form = forms.UserForwardForm(obj=user)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(user)
|
form.populate_obj(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Forward destination updated for %s' % user)
|
flask.flash('Forward destination updated for %s' % user)
|
||||||
if user_email:
|
if user_email:
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
@@ -147,9 +148,45 @@ def user_reply(user_email):
|
|||||||
form = forms.UserReplyForm(obj=user)
|
form = forms.UserReplyForm(obj=user)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
form.populate_obj(user)
|
form.populate_obj(user)
|
||||||
db.session.commit()
|
models.db.session.commit()
|
||||||
flask.flash('Auto-reply message updated for %s' % user)
|
flask.flash('Auto-reply message updated for %s' % user)
|
||||||
if user_email:
|
if user_email:
|
||||||
return flask.redirect(
|
return flask.redirect(
|
||||||
flask.url_for('.user_list', domain_name=user.domain.name))
|
flask.url_for('.user_list', domain_name=user.domain.name))
|
||||||
return flask.render_template('user/reply.html', form=form, user=user)
|
return flask.render_template('user/reply.html', form=form, user=user)
|
||||||
|
|
||||||
|
|
||||||
|
@ui.route('/user/signup', methods=['GET', 'POST'])
|
||||||
|
@ui.route('/user/signup/<domain_name>', methods=['GET', 'POST'])
|
||||||
|
def user_signup(domain_name=None):
|
||||||
|
available_domains = {
|
||||||
|
domain.name: domain
|
||||||
|
for domain in models.Domain.query.filter_by(signup_enabled=True).all()
|
||||||
|
if not domain.max_users or len(domain.users) < domain.max_users
|
||||||
|
}
|
||||||
|
if not available_domains:
|
||||||
|
flask.flash('No domain available for registration')
|
||||||
|
if not domain_name:
|
||||||
|
return flask.render_template('user/signup_domain.html',
|
||||||
|
available_domains=available_domains)
|
||||||
|
domain = available_domains.get(domain_name) or flask.abort(404)
|
||||||
|
quota_bytes = domain.max_quota_bytes or app.config['DEFAULT_QUOTA']
|
||||||
|
if app.config['RECAPTCHA_PUBLIC_KEY'] == "" or app.config['RECAPTCHA_PRIVATE_KEY'] == "":
|
||||||
|
form = forms.UserSignupForm()
|
||||||
|
else:
|
||||||
|
form = forms.UserSignupFormCaptcha()
|
||||||
|
|
||||||
|
if form.validate_on_submit():
|
||||||
|
if domain.has_email(form.localpart.data):
|
||||||
|
flask.flash('Email is already used', 'error')
|
||||||
|
else:
|
||||||
|
user = models.User(domain=domain)
|
||||||
|
form.populate_obj(user)
|
||||||
|
user.set_password(form.pw.data)
|
||||||
|
user.quota_bytes = quota_bytes
|
||||||
|
models.db.session.add(user)
|
||||||
|
models.db.session.commit()
|
||||||
|
user.send_welcome()
|
||||||
|
flask.flash('Successfully signed up %s' % user)
|
||||||
|
return flask.redirect(flask.url_for('.index'))
|
||||||
|
return flask.render_template('user/signup.html', domain=domain, form=form)
|
||||||
|
|||||||
53
core/admin/mailu/utils.py
Normal file
53
core/admin/mailu/utils.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
from mailu import models
|
||||||
|
|
||||||
|
import flask
|
||||||
|
import flask_login
|
||||||
|
import flask_script
|
||||||
|
import flask_migrate
|
||||||
|
import flask_babel
|
||||||
|
import flask_limiter
|
||||||
|
|
||||||
|
from werkzeug.contrib import fixers
|
||||||
|
|
||||||
|
|
||||||
|
# Login configuration
|
||||||
|
login = flask_login.LoginManager()
|
||||||
|
login.login_view = "ui.login"
|
||||||
|
|
||||||
|
@login.unauthorized_handler
|
||||||
|
def handle_needs_login():
|
||||||
|
return flask.redirect(
|
||||||
|
flask.url_for('ui.login', next=flask.request.endpoint)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Request rate limitation
|
||||||
|
limiter = flask_limiter.Limiter(key_func=lambda: current_user.username)
|
||||||
|
|
||||||
|
|
||||||
|
# Application translation
|
||||||
|
babel = flask_babel.Babel()
|
||||||
|
|
||||||
|
@babel.localeselector
|
||||||
|
def get_locale():
|
||||||
|
translations = list(map(str, babel.list_translations()))
|
||||||
|
return flask.request.accept_languages.best_match(translations)
|
||||||
|
|
||||||
|
|
||||||
|
# Proxy fixer
|
||||||
|
class PrefixMiddleware(object):
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
prefix = environ.get('HTTP_X_FORWARDED_PREFIX', '')
|
||||||
|
if prefix:
|
||||||
|
environ['SCRIPT_NAME'] = prefix
|
||||||
|
return self.app(environ, start_response)
|
||||||
|
|
||||||
|
def init_app(self, app):
|
||||||
|
self.app = fixers.ProxyFix(app.wsgi_app)
|
||||||
|
app.wsgi_app = self
|
||||||
|
|
||||||
|
proxy = PrefixMiddleware()
|
||||||
|
|
||||||
|
|
||||||
|
# Data migrate
|
||||||
|
migrate = flask_migrate.Migrate()
|
||||||
@@ -1,21 +1,21 @@
|
|||||||
# Translations template for PROJECT.
|
# Translations template for PROJECT.
|
||||||
# Copyright (C) 2017 ORGANIZATION
|
# Copyright (C) 2018 ORGANIZATION
|
||||||
# This file is distributed under the same license as the PROJECT project.
|
# This file is distributed under the same license as the PROJECT project.
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2017-11-05 17:17+0100\n"
|
"POT-Creation-Date: 2018-04-22 12:10+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.5.1\n"
|
"Generated-By: Babel 2.5.3\n"
|
||||||
|
|
||||||
#: mailu/ui/forms.py:32
|
#: mailu/ui/forms.py:32
|
||||||
msgid "Invalid email address."
|
msgid "Invalid email address."
|
||||||
@@ -25,21 +25,23 @@ msgstr ""
|
|||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
|
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
|
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
|
||||||
#: mailu/ui/forms.py:146
|
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
|
||||||
|
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
|
||||||
#: mailu/ui/templates/sidebar.html:99
|
#: mailu/ui/templates/sidebar.html:111
|
||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
|
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
|
||||||
|
#: mailu/ui/templates/domain/details.html:27
|
||||||
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
|
||||||
msgid "Domain name"
|
msgid "Domain name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -56,165 +58,198 @@ msgstr ""
|
|||||||
msgid "Maximum user quota"
|
msgid "Maximum user quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
|
#: mailu/ui/forms.py:50
|
||||||
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
|
msgid "Enable sign-up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
|
||||||
|
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
|
||||||
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
|
||||||
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
|
||||||
#: mailu/ui/templates/user/list.html:23
|
#: mailu/ui/templates/user/list.html:23
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
|
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
|
||||||
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
|
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
|
||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:55
|
#: mailu/ui/forms.py:57
|
||||||
msgid "Alternative name"
|
msgid "Initial admin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:60
|
#: mailu/ui/forms.py:58
|
||||||
msgid "Relayed domain name"
|
msgid "Admin password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
|
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
|
||||||
msgid "Remote host"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:69
|
|
||||||
msgid "Confirm password"
|
msgid "Confirm password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
|
#: mailu/ui/forms.py:65
|
||||||
|
msgid "Alternative name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:70
|
||||||
|
msgid "Relayed domain name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
|
||||||
|
msgid "Remote host"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:16
|
||||||
msgid "Quota"
|
msgid "Quota"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:71
|
#: mailu/ui/forms.py:81
|
||||||
msgid "Allow IMAP access"
|
msgid "Allow IMAP access"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:72
|
#: mailu/ui/forms.py:82
|
||||||
msgid "Allow POP3 access"
|
msgid "Allow POP3 access"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:74
|
#: mailu/ui/forms.py:84
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:85
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:78
|
#: mailu/ui/forms.py:89
|
||||||
|
msgid "Email address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
|
||||||
|
#: mailu/ui/templates/user/signup.html:4
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:4
|
||||||
|
msgid "Sign up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:97
|
||||||
msgid "Displayed name"
|
msgid "Displayed name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:79
|
#: mailu/ui/forms.py:98
|
||||||
msgid "Enable spam filter"
|
msgid "Enable spam filter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:80
|
#: mailu/ui/forms.py:99
|
||||||
msgid "Spam filter tolerance"
|
msgid "Spam filter tolerance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:81
|
#: mailu/ui/forms.py:100
|
||||||
msgid "Save settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:86
|
|
||||||
msgid "Password check"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
|
|
||||||
msgid "Update password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:91
|
|
||||||
msgid "Enable forwarding"
|
msgid "Enable forwarding"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:92
|
#: mailu/ui/forms.py:101
|
||||||
msgid "Keep a copy of the emails"
|
msgid "Keep a copy of the emails"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
|
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
|
||||||
#: mailu/ui/templates/alias/list.html:20
|
#: mailu/ui/templates/alias/list.html:20
|
||||||
msgid "Destination"
|
msgid "Destination"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
|
#: mailu/ui/forms.py:105
|
||||||
msgid "Update"
|
msgid "Save settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:100
|
#: mailu/ui/forms.py:110
|
||||||
|
msgid "Password check"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
|
||||||
|
msgid "Update password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:115
|
||||||
msgid "Enable automatic reply"
|
msgid "Enable automatic reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:101
|
#: mailu/ui/forms.py:116
|
||||||
msgid "Reply subject"
|
msgid "Reply subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:102
|
#: mailu/ui/forms.py:117
|
||||||
msgid "Reply body"
|
msgid "Reply body"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:109
|
#: mailu/ui/forms.py:119
|
||||||
msgid "Your token (write it down, as it will never be displayed again)"
|
msgid "End of vacation"
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
|
|
||||||
msgid "Authorized IP"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:120
|
#: mailu/ui/forms.py:120
|
||||||
|
msgid "Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:125
|
||||||
|
msgid "Your token (write it down, as it will never be displayed again)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
|
||||||
|
msgid "Authorized IP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/forms.py:136
|
||||||
msgid "Alias"
|
msgid "Alias"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:122
|
#: mailu/ui/forms.py:138
|
||||||
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:129
|
#: mailu/ui/forms.py:145
|
||||||
msgid "Admin email"
|
msgid "Admin email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
|
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:134
|
#: mailu/ui/forms.py:150
|
||||||
msgid "Manager email"
|
msgid "Manager email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:139
|
#: mailu/ui/forms.py:155
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:142
|
#: mailu/ui/forms.py:158
|
||||||
msgid "Hostname or IP"
|
msgid "Hostname or IP"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:143
|
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
|
||||||
|
#: mailu/ui/templates/client.html:47
|
||||||
msgid "TCP port"
|
msgid "TCP port"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:144
|
#: mailu/ui/forms.py:160
|
||||||
msgid "Enable TLS"
|
msgid "Enable TLS"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
|
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
|
||||||
|
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:147
|
#: mailu/ui/forms.py:163
|
||||||
msgid "Keep emails on the server"
|
msgid "Keep emails on the server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:152
|
#: mailu/ui/forms.py:168
|
||||||
msgid "Announcement subject"
|
msgid "Announcement subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:154
|
#: mailu/ui/forms.py:170
|
||||||
msgid "Announcement body"
|
msgid "Announcement body"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/forms.py:156
|
#: mailu/ui/forms.py:172
|
||||||
msgid "Send"
|
msgid "Send"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -222,8 +257,16 @@ msgstr ""
|
|||||||
msgid "Public announcement"
|
msgid "Public announcement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/announcement.html:8
|
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
|
||||||
msgid "from"
|
msgid "Client setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
|
||||||
|
msgid "Mail protocol"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
|
||||||
|
msgid "Server name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/confirm.html:4
|
#: mailu/ui/templates/confirm.html:4
|
||||||
@@ -247,75 +290,43 @@ msgstr ""
|
|||||||
msgid "to access the administration tools"
|
msgid "to access the administration tools"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
|
|
||||||
msgid "Services status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:10
|
|
||||||
msgid "Service"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
|
|
||||||
msgid "Status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:12
|
|
||||||
msgid "PID"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:13
|
|
||||||
msgid "Image"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:14
|
|
||||||
msgid "Started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/services.html:15
|
|
||||||
msgid "Last update"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:8
|
|
||||||
msgid "My account"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
|
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
|
||||||
msgid "Auto-forward"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
|
|
||||||
msgid "Auto-reply"
|
msgid "Auto-reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
|
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
|
||||||
#: mailu/ui/templates/user/list.html:37
|
#: mailu/ui/templates/user/list.html:36
|
||||||
msgid "Fetched accounts"
|
msgid "Fetched accounts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
|
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
|
||||||
msgid "Authentication tokens"
|
msgid "Authentication tokens"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:40
|
#: mailu/ui/templates/sidebar.html:35
|
||||||
msgid "Administration"
|
msgid "Administration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:49
|
#: mailu/ui/templates/sidebar.html:44
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:54
|
#: mailu/ui/templates/sidebar.html:49
|
||||||
msgid "Administrators"
|
msgid "Administrators"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:59
|
#: mailu/ui/templates/sidebar.html:54
|
||||||
msgid "Relayed domains"
|
msgid "Relayed domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
|
||||||
|
msgid "Antispam"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:66
|
#: mailu/ui/templates/sidebar.html:66
|
||||||
msgid "Mail domains"
|
msgid "Mail domains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -328,15 +339,19 @@ msgstr ""
|
|||||||
msgid "Webmail"
|
msgid "Webmail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:82
|
#: mailu/ui/templates/sidebar.html:87
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:87
|
#: mailu/ui/templates/sidebar.html:92
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/sidebar.html:93
|
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
|
||||||
|
msgid "Register a domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/sidebar.html:105
|
||||||
msgid "Sign out"
|
msgid "Sign out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -440,27 +455,31 @@ msgstr ""
|
|||||||
msgid "Domain details"
|
msgid "Domain details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:13
|
#: mailu/ui/templates/domain/details.html:15
|
||||||
msgid "Regenerate keys"
|
msgid "Regenerate keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:25
|
#: mailu/ui/templates/domain/details.html:17
|
||||||
|
msgid "Generate keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/details.html:31
|
||||||
msgid "DNS MX entry"
|
msgid "DNS MX entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:29
|
#: mailu/ui/templates/domain/details.html:35
|
||||||
msgid "DNS SPF entries"
|
msgid "DNS SPF entries"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:36
|
#: mailu/ui/templates/domain/details.html:42
|
||||||
msgid "DKIM public key"
|
msgid "DKIM public key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:40
|
#: mailu/ui/templates/domain/details.html:46
|
||||||
msgid "DNS DKIM entry"
|
msgid "DNS DKIM entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/domain/details.html:44
|
#: mailu/ui/templates/domain/details.html:50
|
||||||
msgid "DNS DMARC entry"
|
msgid "DNS DMARC entry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -504,6 +523,23 @@ msgstr ""
|
|||||||
msgid "Alternatives"
|
msgid "Alternatives"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:13
|
||||||
|
msgid ""
|
||||||
|
"In order to register a new domain, you must first setup the\n"
|
||||||
|
" domain zone so that the domain <code>MX</code> points to this server"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/domain/signup.html:18
|
||||||
|
msgid ""
|
||||||
|
"If you do not know how to setup an <code>MX</code> record for your DNS "
|
||||||
|
"zone,\n"
|
||||||
|
" please contact your DNS provider or administrator. Also, please wait "
|
||||||
|
"a\n"
|
||||||
|
" couple minutes after the <code>MX</code> is set so the local server "
|
||||||
|
"cache\n"
|
||||||
|
" expires."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/fetch/create.html:4
|
#: mailu/ui/templates/fetch/create.html:4
|
||||||
msgid "Add a fetched account"
|
msgid "Add a fetched account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -580,7 +616,7 @@ msgstr ""
|
|||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/create.html:21
|
#: mailu/ui/templates/user/create.html:22
|
||||||
msgid "Features and quotas"
|
msgid "Features and quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -616,11 +652,19 @@ msgstr ""
|
|||||||
msgid "Automatic reply"
|
msgid "Automatic reply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:14
|
#: mailu/ui/templates/user/settings.html:22
|
||||||
msgid "General settings"
|
msgid "Auto-forward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: mailu/ui/templates/user/settings.html:18
|
#: mailu/ui/templates/user/signup_domain.html:8
|
||||||
msgid "Antispam"
|
msgid "pick a domain for the new account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:14
|
||||||
|
msgid "Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: mailu/ui/templates/user/signup_domain.html:15
|
||||||
|
msgid "Available slots"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
25
core/admin/migrations/versions/049fed905da7_.py
Normal file
25
core/admin/migrations/versions/049fed905da7_.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
""" Enforce the nocase collation on the email table
|
||||||
|
|
||||||
|
Revision ID: 049fed905da7
|
||||||
|
Revises: 49d77a93118e
|
||||||
|
Create Date: 2018-04-21 13:23:56.571524
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '049fed905da7'
|
||||||
|
down_revision = '49d77a93118e'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.alter_column('email', type_=sa.String(length=255, collation="NOCASE"))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.alter_column('email', type_=sa.String(length=255))
|
||||||
|
|
||||||
28
core/admin/migrations/versions/25fd6c7bcb4a_.py
Normal file
28
core/admin/migrations/versions/25fd6c7bcb4a_.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
""" Add a column for used quota
|
||||||
|
|
||||||
|
Revision ID: 25fd6c7bcb4a
|
||||||
|
Revises: 049fed905da7
|
||||||
|
Create Date: 2018-07-25 21:56:09.729153
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '25fd6c7bcb4a'
|
||||||
|
down_revision = '049fed905da7'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.add_column(sa.Column('quota_bytes_used', sa.Integer(), nullable=False, server_default='0'))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.drop_column('user', 'quota_bytes_used')
|
||||||
24
core/admin/migrations/versions/3b281286c7bd_.py
Normal file
24
core/admin/migrations/versions/3b281286c7bd_.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
""" Add a start day for vacations
|
||||||
|
|
||||||
|
Revision ID: 3b281286c7bd
|
||||||
|
Revises: 25fd6c7bcb4a
|
||||||
|
Create Date: 2018-09-27 22:20:08.158553
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
revision = '3b281286c7bd'
|
||||||
|
down_revision = '25fd6c7bcb4a'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.add_column(sa.Column('reply_startdate', sa.Date(), nullable=False,
|
||||||
|
server_default="1900-01-01"))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.drop_column('reply_startdate')
|
||||||
@@ -13,8 +13,6 @@ down_revision = '2335c80a6bc3'
|
|||||||
from alembic import op
|
from alembic import op
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from mailu import app
|
|
||||||
|
|
||||||
|
|
||||||
fetch_table = sa.Table(
|
fetch_table = sa.Table(
|
||||||
'fetch',
|
'fetch',
|
||||||
@@ -24,13 +22,7 @@ fetch_table = sa.Table(
|
|||||||
|
|
||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
connection = op.get_bind()
|
|
||||||
op.add_column('fetch', sa.Column('keep', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()))
|
op.add_column('fetch', sa.Column('keep', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()))
|
||||||
# also apply the current config value if set
|
|
||||||
if app.config.get("FETCHMAIL_KEEP", "False") == "True":
|
|
||||||
connection.execute(
|
|
||||||
fetch_table.update().values(keep=True)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
|
|||||||
24
core/admin/migrations/versions/423155f8fc15_.py
Normal file
24
core/admin/migrations/versions/423155f8fc15_.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
""" Enable signup per domain
|
||||||
|
|
||||||
|
Revision ID: 423155f8fc15
|
||||||
|
Revises: 77aa22ad72e2
|
||||||
|
Create Date: 2017-12-02 15:07:40.052320
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '423155f8fc15'
|
||||||
|
down_revision = '77aa22ad72e2'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
with op.batch_alter_table('domain') as batch:
|
||||||
|
batch.add_column(sa.Column('signup_enabled', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
with op.batch_alter_table('domain') as batch:
|
||||||
|
batch.drop_column('signup_enabled')
|
||||||
24
core/admin/migrations/versions/49d77a93118e_.py
Normal file
24
core/admin/migrations/versions/49d77a93118e_.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
""" Add enabled flag to user model
|
||||||
|
|
||||||
|
Revision ID: 49d77a93118e
|
||||||
|
Revises: 423155f8fc15
|
||||||
|
Create Date: 2018-04-15 11:17:32.306088
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '49d77a93118e'
|
||||||
|
down_revision = '423155f8fc15'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.add_column(sa.Column('enabled', sa.Boolean(), nullable=False, server_default=sa.sql.expression.true()))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
with op.batch_alter_table('user') as batch:
|
||||||
|
batch.drop_column('user', 'enabled')
|
||||||
25
core/admin/migrations/versions/cd79ed46d9c2_.py
Normal file
25
core/admin/migrations/versions/cd79ed46d9c2_.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
""" Add a configuration table
|
||||||
|
|
||||||
|
Revision ID: cd79ed46d9c2
|
||||||
|
Revises: 25fd6c7bcb4a
|
||||||
|
Create Date: 2018-10-17 21:44:48.924921
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
revision = 'cd79ed46d9c2'
|
||||||
|
down_revision = '3b281286c7bd'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.create_table('config',
|
||||||
|
sa.Column('name', sa.String(length=255), nullable=False),
|
||||||
|
sa.Column('value', sa.String(length=255), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('name')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.drop_table('config')
|
||||||
@@ -1,51 +1,47 @@
|
|||||||
alembic==0.9.6
|
alembic==1.0.2
|
||||||
asn1crypto==0.23.0
|
asn1crypto==0.24.0
|
||||||
Babel==2.5.1
|
Babel==2.6.0
|
||||||
|
bcrypt==3.1.5
|
||||||
blinker==1.4
|
blinker==1.4
|
||||||
certifi==2017.7.27.1
|
cffi==1.11.5
|
||||||
cffi==1.11.2
|
Click==7.0
|
||||||
chardet==3.0.4
|
cryptography==2.3.1
|
||||||
click==6.7
|
decorator==4.3.0
|
||||||
cryptography==2.1.2
|
dnspython==1.16.0
|
||||||
decorator==4.1.2
|
dominate==2.3.4
|
||||||
docker-py==1.10.6
|
Flask==1.0.2
|
||||||
docker-pycreds==0.2.1
|
Flask-Babel==0.12.2
|
||||||
dominate==2.3.1
|
|
||||||
Flask==0.12.2
|
|
||||||
Flask-Babel==0.11.2
|
|
||||||
Flask-Bootstrap==3.3.7.1
|
Flask-Bootstrap==3.3.7.1
|
||||||
Flask-DebugToolbar==0.10.1
|
Flask-DebugToolbar==0.10.1
|
||||||
Flask-Limiter==0.9.5.1
|
Flask-Limiter==1.0.1
|
||||||
Flask-Login==0.4.0
|
Flask-Login==0.4.1
|
||||||
Flask-Migrate==2.1.1
|
Flask-Migrate==2.3.1
|
||||||
Flask-Script==2.0.6
|
Flask-Script==2.0.6
|
||||||
Flask-SQLAlchemy==2.3.2
|
Flask-SQLAlchemy==2.3.2
|
||||||
Flask-WTF==0.14.2
|
Flask-WTF==0.14.2
|
||||||
gunicorn==19.7.1
|
gunicorn==19.9.0
|
||||||
idna==2.6
|
idna==2.7
|
||||||
infinity==1.4
|
infinity==1.4
|
||||||
intervals==0.8.0
|
intervals==0.8.1
|
||||||
itsdangerous==0.24
|
itsdangerous==1.1.0
|
||||||
Jinja2==2.9.6
|
Jinja2==2.10
|
||||||
limits==1.2.1
|
limits==1.3
|
||||||
Mako==1.0.7
|
Mako==1.0.7
|
||||||
MarkupSafe==1.0
|
MarkupSafe==1.1.0
|
||||||
passlib==1.7.1
|
passlib==1.7.1
|
||||||
pycparser==2.18
|
pycparser==2.19
|
||||||
pyOpenSSL==17.3.0
|
pyOpenSSL==18.0.0
|
||||||
python-dateutil==2.6.1
|
python-dateutil==2.7.5
|
||||||
python-editor==1.0.3
|
python-editor==1.0.3
|
||||||
pytz==2017.2
|
pytz==2018.7
|
||||||
PyYAML==3.12
|
PyYAML==3.13
|
||||||
redis==2.10.6
|
redis==3.0.1
|
||||||
requests==2.18.4
|
|
||||||
six==1.11.0
|
six==1.11.0
|
||||||
SQLAlchemy==1.1.14
|
SQLAlchemy==1.2.13
|
||||||
tabulate==0.8.1
|
tabulate==0.8.2
|
||||||
urllib3==1.22
|
tenacity==5.0.2
|
||||||
validators==0.12.0
|
validators==0.12.2
|
||||||
visitor==0.1.3
|
visitor==0.1.3
|
||||||
websocket-client==0.44.0
|
Werkzeug==0.14.1
|
||||||
Werkzeug==0.12.2
|
WTForms==2.2.1
|
||||||
WTForms==2.1
|
|
||||||
WTForms-Components==0.10.3
|
WTForms-Components==0.10.3
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ redis
|
|||||||
WTForms-Components
|
WTForms-Components
|
||||||
passlib
|
passlib
|
||||||
gunicorn
|
gunicorn
|
||||||
docker-py
|
|
||||||
tabulate
|
tabulate
|
||||||
PyYAML
|
PyYAML
|
||||||
PyOpenSSL
|
PyOpenSSL
|
||||||
|
dnspython
|
||||||
|
bcrypt
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
os.environ["DEBUG"] = "True"
|
|
||||||
from mailu import app
|
|
||||||
app.run()
|
|
||||||
7
core/admin/start.py
Executable file
7
core/admin/start.py
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
os.system("flask mailu advertise")
|
||||||
|
os.system("flask db upgrade")
|
||||||
|
os.system("gunicorn -w 4 -b :80 --access-logfile - --error-logfile - --preload 'mailu:create_app()'")
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
python manage.py advertise
|
|
||||||
python manage.py db upgrade
|
|
||||||
gunicorn -w 4 -b 0.0.0.0:80 --access-logfile - --error-logfile - --preload mailu:app
|
|
||||||
@@ -1,12 +1,23 @@
|
|||||||
FROM alpine:edge
|
FROM alpine:3.8
|
||||||
|
# python3 shared with most images
|
||||||
RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
|
RUN apk add --no-cache \
|
||||||
&& apk add --no-cache \
|
python3 py3-pip \
|
||||||
dovecot dovecot-sqlite dovecot-pigeonhole-plugin dovecot-pigeonhole-plugin-extdata \
|
&& pip3 install --upgrade pip
|
||||||
rspamd-client@testing python py-jinja2
|
# Shared layer between rspamd, postfix, dovecot, unbound and nginx
|
||||||
|
RUN pip3 install jinja2
|
||||||
|
# Shared layer between rspamd, postfix, dovecot
|
||||||
|
RUN pip3 install tenacity
|
||||||
|
# Image specific layers under this line
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
dovecot dovecot-pigeonhole-plugin dovecot-fts-lucene rspamd-client bash \
|
||||||
|
&& pip3 install podop
|
||||||
|
|
||||||
COPY conf /conf
|
COPY conf /conf
|
||||||
COPY sieve /var/lib/dovecot
|
|
||||||
COPY start.py /start.py
|
COPY start.py /start.py
|
||||||
|
|
||||||
|
EXPOSE 110/tcp 143/tcp 993/tcp 4190/tcp 2525/tcp
|
||||||
|
VOLUME ["/data", "/mail"]
|
||||||
|
|
||||||
CMD /start.py
|
CMD /start.py
|
||||||
|
|
||||||
|
HEALTHCHECK --start-period=350s CMD echo QUIT|nc localhost 110|grep "Dovecot ready."
|
||||||
|
|||||||
5
core/dovecot/conf/auth.conf
Normal file
5
core/dovecot/conf/auth.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
uri = proxy:/tmp/podop.socket:auth
|
||||||
|
iterate_disable = yes
|
||||||
|
default_pass_scheme = plain
|
||||||
|
password_key = passdb/%u
|
||||||
|
user_key = userdb/%u
|
||||||
4
core/dovecot/conf/bin/ham
Executable file
4
core/dovecot/conf/bin/ham
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
tee >(rspamc -h antispam:11334 -P mailu learn_ham /dev/stdin) \
|
||||||
|
| rspamc -h antispam:11334 -P mailu -f 13 fuzzy_add /dev/stdin
|
||||||
4
core/dovecot/conf/bin/spam
Executable file
4
core/dovecot/conf/bin/spam
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
tee >(rspamc -h antispam:11334 -P mailu learn_spam /dev/stdin) \
|
||||||
|
>(rspamc -h antispam:11334 -P mailu -f 11 fuzzy_add /dev/stdin)
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
driver = sqlite
|
|
||||||
connect = /data/main.db
|
|
||||||
|
|
||||||
# Return the user hashed password
|
|
||||||
password_query = \
|
|
||||||
SELECT NULL as password, 'Y' as nopassword, '{{ FRONT_ADDRESS }}{% if WEBMAIL_ADDRESS %},{{ WEBMAIL_ADDRESS }}{% endif %}' as allow_nets \
|
|
||||||
FROM user \
|
|
||||||
WHERE user.email = '%u'
|
|
||||||
|
|
||||||
# Mostly get the user quota
|
|
||||||
user_query = \
|
|
||||||
SELECT '*:bytes=' || user.quota_bytes AS quota_rule \
|
|
||||||
FROM user \
|
|
||||||
WHERE user.email = '%u'
|
|
||||||
@@ -5,19 +5,23 @@ log_path = /dev/stderr
|
|||||||
protocols = imap pop3 lmtp sieve
|
protocols = imap pop3 lmtp sieve
|
||||||
postmaster_address = {{ POSTMASTER }}@{{ DOMAIN }}
|
postmaster_address = {{ POSTMASTER }}@{{ DOMAIN }}
|
||||||
hostname = {{ HOSTNAMES.split(",")[0] }}
|
hostname = {{ HOSTNAMES.split(",")[0] }}
|
||||||
mail_plugins = $mail_plugins quota
|
submission_host = {{ FRONT_ADDRESS }}
|
||||||
submission_host = front
|
|
||||||
|
|
||||||
service dict {
|
{% if DISABLE_FTS_LUCENE != 'true' %}
|
||||||
unix_listener dict {
|
###############
|
||||||
group = mail
|
# Full-text search
|
||||||
mode = 0660
|
###############
|
||||||
}
|
mail_plugins = $mail_plugins fts fts_lucene
|
||||||
}
|
|
||||||
|
|
||||||
dict {
|
plugin {
|
||||||
sieve = sqlite:/etc/dovecot/pigeonhole-sieve.dict
|
fts = lucene
|
||||||
|
|
||||||
|
fts_autoindex = yes
|
||||||
|
fts_autoindex_exclude = \Junk
|
||||||
|
|
||||||
|
fts_lucene = whitespace_chars=@.
|
||||||
}
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# Mailboxes
|
# Mailboxes
|
||||||
@@ -31,41 +35,49 @@ mail_gid = mail
|
|||||||
mail_privileged_group = mail
|
mail_privileged_group = mail
|
||||||
mail_access_groups = mail
|
mail_access_groups = mail
|
||||||
maildir_stat_dirs = yes
|
maildir_stat_dirs = yes
|
||||||
|
mailbox_list_index = yes
|
||||||
|
mail_vsize_bg_after_count = 100
|
||||||
|
mail_plugins = $mail_plugins quota quota_clone zlib
|
||||||
|
|
||||||
namespace inbox {
|
namespace inbox {
|
||||||
inbox = yes
|
inbox = yes
|
||||||
mailbox Trash {
|
{% for mailbox in ("Trash", "Drafts", "Sent", "Junk") %}
|
||||||
|
mailbox {{ mailbox }} {
|
||||||
auto = subscribe
|
auto = subscribe
|
||||||
special_use = \Trash
|
special_use = \{{ mailbox }}
|
||||||
}
|
|
||||||
mailbox Drafts {
|
|
||||||
auto = subscribe
|
|
||||||
special_use = \Drafts
|
|
||||||
}
|
|
||||||
mailbox Sent {
|
|
||||||
auto = subscribe
|
|
||||||
special_use = \Sent
|
|
||||||
}
|
|
||||||
mailbox Junk {
|
|
||||||
auto = subscribe
|
|
||||||
special_use = \Junk
|
|
||||||
}
|
}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin {
|
||||||
|
quota = count:User quota
|
||||||
|
quota_vsizes = yes
|
||||||
|
quota_clone_dict = proxy:/tmp/podop.socket:quota
|
||||||
|
|
||||||
|
{% if COMPRESSION in [ 'gz', 'bz2' ] %}
|
||||||
|
zlib_save = {{ COMPRESSION }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if COMPRESSION_LEVEL %}
|
||||||
|
zlib_save_level = {{ COMPRESSION_LEVEL }}
|
||||||
|
{% endif %}
|
||||||
}
|
}
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# Authentication
|
# Authentication
|
||||||
###############
|
###############
|
||||||
|
auth_username_chars =
|
||||||
auth_mechanisms = plain login
|
auth_mechanisms = plain login
|
||||||
disable_plaintext_auth = no
|
disable_plaintext_auth = no
|
||||||
|
|
||||||
passdb {
|
passdb {
|
||||||
driver = sql
|
driver = dict
|
||||||
args = /etc/dovecot/dovecot-sql.conf.ext
|
args = /etc/dovecot/auth.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
userdb {
|
userdb {
|
||||||
driver = sql
|
driver = dict
|
||||||
args = /etc/dovecot/dovecot-sql.conf.ext
|
args = /etc/dovecot/auth.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
service auth {
|
service auth {
|
||||||
@@ -86,7 +98,6 @@ service auth-worker {
|
|||||||
###############
|
###############
|
||||||
# IMAP & POP
|
# IMAP & POP
|
||||||
###############
|
###############
|
||||||
|
|
||||||
protocol imap {
|
protocol imap {
|
||||||
mail_plugins = $mail_plugins imap_quota imap_sieve
|
mail_plugins = $mail_plugins imap_quota imap_sieve
|
||||||
}
|
}
|
||||||
@@ -104,7 +115,6 @@ service imap-login {
|
|||||||
###############
|
###############
|
||||||
# Delivery
|
# Delivery
|
||||||
###############
|
###############
|
||||||
|
|
||||||
protocol lmtp {
|
protocol lmtp {
|
||||||
mail_plugins = $mail_plugins sieve
|
mail_plugins = $mail_plugins sieve
|
||||||
recipient_delimiter = {{ RECIPIENT_DELIMITER }}
|
recipient_delimiter = {{ RECIPIENT_DELIMITER }}
|
||||||
@@ -116,15 +126,9 @@ service lmtp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin {
|
|
||||||
quota = maildir:User quota
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# Filtering
|
# Filtering
|
||||||
###############
|
###############
|
||||||
|
|
||||||
service managesieve-login {
|
service managesieve-login {
|
||||||
inet_listener sieve {
|
inet_listener sieve {
|
||||||
port = 4190
|
port = 4190
|
||||||
@@ -136,15 +140,13 @@ service managesieve {
|
|||||||
|
|
||||||
plugin {
|
plugin {
|
||||||
sieve = file:~/sieve;active=~/.dovecot.sieve
|
sieve = file:~/sieve;active=~/.dovecot.sieve
|
||||||
sieve_plugins = sieve_extdata sieve_imapsieve sieve_extprograms
|
sieve_before = dict:proxy:/tmp/podop.socket:sieve
|
||||||
sieve_global_extensions = +vnd.dovecot.extdata +spamtest +spamtestplus +vnd.dovecot.execute
|
sieve_plugins = sieve_imapsieve sieve_extprograms
|
||||||
sieve_before = /var/lib/dovecot/before.sieve
|
sieve_extensions = +spamtest +spamtestplus +editheader
|
||||||
sieve_default = /var/lib/dovecot/default.sieve
|
sieve_global_extensions = +vnd.dovecot.execute
|
||||||
sieve_after = /var/lib/dovecot/after.sieve
|
|
||||||
sieve_extdata_dict_uri = proxy::sieve
|
|
||||||
|
|
||||||
# Sieve execute
|
# Sieve execute
|
||||||
sieve_execute_bin_dir = /var/lib/dovecot/bin
|
sieve_execute_bin_dir = /conf/bin
|
||||||
|
|
||||||
# Send vacation replies even for aliases
|
# Send vacation replies even for aliases
|
||||||
# See the Pigeonhole documentation about warnings: http://wiki2.dovecot.org/Pigeonhole/Sieve/Extensions/Vacation
|
# See the Pigeonhole documentation about warnings: http://wiki2.dovecot.org/Pigeonhole/Sieve/Extensions/Vacation
|
||||||
@@ -163,11 +165,11 @@ plugin {
|
|||||||
# Learn from spam
|
# Learn from spam
|
||||||
imapsieve_mailbox1_name = Junk
|
imapsieve_mailbox1_name = Junk
|
||||||
imapsieve_mailbox1_causes = COPY
|
imapsieve_mailbox1_causes = COPY
|
||||||
imapsieve_mailbox1_before = file:/var/lib/dovecot/report-spam.sieve
|
imapsieve_mailbox1_before = file:/conf/report-spam.sieve
|
||||||
imapsieve_mailbox2_name = *
|
imapsieve_mailbox2_name = *
|
||||||
imapsieve_mailbox2_from = Junk
|
imapsieve_mailbox2_from = Junk
|
||||||
imapsieve_mailbox2_causes = COPY
|
imapsieve_mailbox2_causes = COPY
|
||||||
imapsieve_mailbox2_before = file:/var/lib/dovecot/report-ham.sieve
|
imapsieve_mailbox2_before = file:/conf/report-ham.sieve
|
||||||
}
|
}
|
||||||
|
|
||||||
###############
|
###############
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
connect = /data/main.db
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/spam_enabled
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = spam_enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/spam_threshold
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = spam_threshold
|
|
||||||
}
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/reply_enabled
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = reply_enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/reply_subject
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = reply_subject
|
|
||||||
}
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/reply_body
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = reply_body
|
|
||||||
}
|
|
||||||
|
|
||||||
map {
|
|
||||||
pattern = priv/reply_enddate
|
|
||||||
table = user
|
|
||||||
username_field = email
|
|
||||||
value_field = reply_enddate
|
|
||||||
}
|
|
||||||
11
core/dovecot/conf/report-ham.sieve
Normal file
11
core/dovecot/conf/report-ham.sieve
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
require ["vnd.dovecot.execute", "copy", "imapsieve", "environment", "variables"];
|
||||||
|
|
||||||
|
if environment :matches "imap.mailbox" "*" {
|
||||||
|
set "mailbox" "${1}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if string "${mailbox}" "Trash" {
|
||||||
|
stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute :pipe "ham";
|
||||||
3
core/dovecot/conf/report-spam.sieve
Normal file
3
core/dovecot/conf/report-spam.sieve
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
require "vnd.dovecot.execute";
|
||||||
|
|
||||||
|
execute :pipe "spam";
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
require "variables";
|
|
||||||
require "vacation";
|
|
||||||
require "fileinto";
|
|
||||||
require "envelope";
|
|
||||||
require "mailbox";
|
|
||||||
require "imap4flags";
|
|
||||||
require "regex";
|
|
||||||
require "relational";
|
|
||||||
require "date";
|
|
||||||
require "comparator-i;ascii-numeric";
|
|
||||||
require "vnd.dovecot.extdata";
|
|
||||||
require "vnd.dovecot.execute";
|
|
||||||
require "spamtestplus";
|
|
||||||
|
|
||||||
if allof (string :is "${extdata.spam_enabled}" "1",
|
|
||||||
spamtest :percent :value "gt" :comparator "i;ascii-numeric" "${extdata.spam_threshold}")
|
|
||||||
{
|
|
||||||
setflag "\\seen";
|
|
||||||
fileinto :create "Junk";
|
|
||||||
stop;
|
|
||||||
}
|
|
||||||
|
|
||||||
if exists "X-Virus" {
|
|
||||||
discard;
|
|
||||||
stop;
|
|
||||||
}
|
|
||||||
|
|
||||||
if allof (string :is "${extdata.reply_enabled}" "1",
|
|
||||||
currentdate :value "le" "date" "${extdata.reply_enddate}")
|
|
||||||
{
|
|
||||||
vacation :days 1 :subject "${extdata.reply_subject}" "${extdata.reply_body}";
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
rspamc -h antispam:11334 -P mailu "learn_$1" /dev/stdin <&0
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
require "vnd.dovecot.execute";
|
|
||||||
|
|
||||||
execute :pipe "mailtrain" "ham";
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
require "vnd.dovecot.execute";
|
|
||||||
|
|
||||||
execute :pipe "mailtrain" "spam";
|
|
||||||
@@ -1,20 +1,37 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import jinja2
|
import jinja2
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import glob
|
import glob
|
||||||
|
import multiprocessing
|
||||||
|
import tenacity
|
||||||
|
|
||||||
|
from tenacity import retry
|
||||||
|
from podop import run_server
|
||||||
|
|
||||||
|
|
||||||
|
def start_podop():
|
||||||
|
os.setuid(8)
|
||||||
|
run_server(3 if "DEBUG" in os.environ else 0, "dovecot", "/tmp/podop.socket", [
|
||||||
|
("quota", "url", "http://admin/internal/dovecot/§"),
|
||||||
|
("auth", "url", "http://admin/internal/dovecot/§"),
|
||||||
|
("sieve", "url", "http://admin/internal/dovecot/§"),
|
||||||
|
])
|
||||||
|
|
||||||
convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ))
|
convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ))
|
||||||
|
|
||||||
# Actual startup script
|
# Actual startup script
|
||||||
os.environ["FRONT_ADDRESS"] = socket.gethostbyname("front")
|
resolve = retry(socket.gethostbyname, stop=tenacity.stop_after_attempt(100), wait=tenacity.wait_random(min=2, max=5))
|
||||||
|
os.environ["FRONT_ADDRESS"] = resolve(os.environ.get("FRONT_ADDRESS", "front"))
|
||||||
|
os.environ["REDIS_ADDRESS"] = resolve(os.environ.get("REDIS_ADDRESS", "redis"))
|
||||||
if os.environ["WEBMAIL"] != "none":
|
if os.environ["WEBMAIL"] != "none":
|
||||||
os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname("webmail")
|
os.environ["WEBMAIL_ADDRESS"] = resolve(os.environ.get("WEBMAIL_ADDRESS", "webmail"))
|
||||||
|
|
||||||
for dovecot_file in glob.glob("/conf/*"):
|
for dovecot_file in glob.glob("/conf/*.conf"):
|
||||||
convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file)))
|
convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file)))
|
||||||
|
|
||||||
# Run postfix
|
# Run Podop, then postfix
|
||||||
os.system("chown -R mail:mail /mail /var/lib/dovecot")
|
multiprocessing.Process(target=start_podop).start()
|
||||||
|
os.system("chown -R mail:mail /mail /var/lib/dovecot /conf")
|
||||||
os.execv("/usr/sbin/dovecot", ["dovecot", "-c", "/etc/dovecot/dovecot.conf", "-F"])
|
os.execv("/usr/sbin/dovecot", ["dovecot", "-c", "/etc/dovecot/dovecot.conf", "-F"])
|
||||||
|
|||||||
@@ -1,8 +1,21 @@
|
|||||||
FROM alpine:edge
|
FROM alpine:3.8
|
||||||
|
# python3 shared with most images
|
||||||
RUN apk add --no-cache nginx nginx-mod-mail python py-jinja2 certbot openssl
|
RUN apk add --no-cache \
|
||||||
|
python3 py3-pip \
|
||||||
|
&& pip3 install --upgrade pip
|
||||||
|
# Shared layer between rspamd, postfix, dovecot, unbound and nginx
|
||||||
|
RUN pip3 install jinja2
|
||||||
|
# Image specific layers under this line
|
||||||
|
RUN apk add --no-cache certbot nginx nginx-mod-mail openssl curl \
|
||||||
|
&& pip3 install idna requests watchdog
|
||||||
|
|
||||||
COPY conf /conf
|
COPY conf /conf
|
||||||
COPY *.py /
|
COPY *.py /
|
||||||
|
|
||||||
|
EXPOSE 80/tcp 443/tcp 110/tcp 143/tcp 465/tcp 587/tcp 993/tcp 995/tcp 25/tcp 10025/tcp 10143/tcp
|
||||||
|
VOLUME ["/certs"]
|
||||||
|
VOLUME ["/overrides"]
|
||||||
|
|
||||||
CMD /start.py
|
CMD /start.py
|
||||||
|
|
||||||
|
HEALTHCHECK CMD curl -k -f -L http://localhost/health || exit 1
|
||||||
|
|||||||
63
core/nginx/certwatcher.py
Executable file
63
core/nginx/certwatcher.py
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Certificate watcher which reloads nginx or reconfigures it, depending on what
|
||||||
|
happens to externally supplied certificates. Only executed by start.py in case
|
||||||
|
of TLS_FLAVOR=[mail, cert]
|
||||||
|
"""
|
||||||
|
|
||||||
|
from os.path import exists, split as path_split
|
||||||
|
from os import system
|
||||||
|
import time
|
||||||
|
from watchdog.observers import Observer
|
||||||
|
from watchdog.events import FileSystemEventHandler, FileDeletedEvent, \
|
||||||
|
FileCreatedEvent, FileModifiedEvent, FileMovedEvent
|
||||||
|
|
||||||
|
class ChangeHandler(FileSystemEventHandler):
|
||||||
|
"watchdog-handler listening on any event, executing the correct configuration/reload steps"
|
||||||
|
@staticmethod
|
||||||
|
def reload_nginx():
|
||||||
|
"merely reload nginx without re-configuring everything"
|
||||||
|
if exists("/var/run/nginx.pid"):
|
||||||
|
print("Reloading a running nginx")
|
||||||
|
system("nginx -s reload")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def reexec_config():
|
||||||
|
"execute a reconfiguration of the system, which also reloads"
|
||||||
|
print("Reconfiguring system")
|
||||||
|
system("/config.py")
|
||||||
|
|
||||||
|
def on_any_event(self, event):
|
||||||
|
"event-listener checking if the affected files are the cert-files we're interested in"
|
||||||
|
if event.is_directory:
|
||||||
|
return
|
||||||
|
|
||||||
|
filename = path_split(event.src_path)[-1]
|
||||||
|
if isinstance(event, FileMovedEvent):
|
||||||
|
filename = path_split(event.dest_path)[-1]
|
||||||
|
|
||||||
|
if filename in ['cert.pem', 'key.pem']:
|
||||||
|
# all cases except for FileModified need re-configure
|
||||||
|
if isinstance(event, (FileCreatedEvent, FileMovedEvent, FileDeletedEvent)):
|
||||||
|
ChangeHandler.reexec_config()
|
||||||
|
# file modification needs only a nginx reload without config.py
|
||||||
|
elif isinstance(event, FileModifiedEvent):
|
||||||
|
ChangeHandler.reload_nginx()
|
||||||
|
# cert files have been moved away, re-configure
|
||||||
|
elif isinstance(event, FileMovedEvent) and path_split(event.src_path)[-1] in ['cert.pem', 'key.pem']:
|
||||||
|
ChangeHandler.reexec_config()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
observer = Observer()
|
||||||
|
handler = ChangeHandler()
|
||||||
|
observer.schedule(handler, "/certs", recursive=False)
|
||||||
|
observer.start()
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
observer.stop()
|
||||||
|
|
||||||
|
observer.join()
|
||||||
13
core/nginx/conf/dhparam.pem
Normal file
13
core/nginx/conf/dhparam.pem
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
-----BEGIN DH PARAMETERS-----
|
||||||
|
MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
|
||||||
|
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
|
||||||
|
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
|
||||||
|
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
|
||||||
|
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
|
||||||
|
ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
|
||||||
|
7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
|
||||||
|
nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e
|
||||||
|
8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx
|
||||||
|
iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K
|
||||||
|
zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=
|
||||||
|
-----END DH PARAMETERS-----
|
||||||
@@ -20,13 +20,29 @@ http {
|
|||||||
absolute_redirect off;
|
absolute_redirect off;
|
||||||
resolver {{ RESOLVER }} valid=30s;
|
resolver {{ RESOLVER }} valid=30s;
|
||||||
|
|
||||||
|
{% if REAL_IP_HEADER %}
|
||||||
|
real_ip_header {{ REAL_IP_HEADER }};
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if REAL_IP_FROM %}{% for from_ip in REAL_IP_FROM.split(',') %}
|
||||||
|
set_real_ip_from {{ from_ip }};
|
||||||
|
{% endfor %}{% endif %}
|
||||||
|
|
||||||
|
# Header maps
|
||||||
|
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
|
||||||
|
default $http_x_forwarded_proto;
|
||||||
|
'' $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Disable the main http server when on kubernetes (port 80 and 443)
|
||||||
|
{% if KUBERNETES_INGRESS != 'true' %}
|
||||||
# Main HTTP server
|
# Main HTTP server
|
||||||
server {
|
server {
|
||||||
# Variables for proxifying
|
# Variables for proxifying
|
||||||
set $admin admin;
|
set $admin {{ HOST_ADMIN }};
|
||||||
set $antispam antispam:11334;
|
set $antispam {{ HOST_ANTISPAM }};
|
||||||
set $webmail webmail;
|
set $webmail {{ HOST_WEBMAIL }};
|
||||||
set $webdav webdav:5232;
|
set $webdav {{ HOST_WEBDAV }};
|
||||||
|
|
||||||
# Always listen over HTTP
|
# Always listen over HTTP
|
||||||
listen 80;
|
listen 80;
|
||||||
@@ -34,44 +50,61 @@ http {
|
|||||||
|
|
||||||
# Only enable HTTPS if TLS is enabled with no error
|
# Only enable HTTPS if TLS is enabled with no error
|
||||||
{% if TLS and not TLS_ERROR %}
|
{% if TLS and not TLS_ERROR %}
|
||||||
listen 443 ssl;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 ssl;
|
listen [::]:443 ssl http2;
|
||||||
|
|
||||||
include /etc/nginx/tls.conf;
|
include /etc/nginx/tls.conf;
|
||||||
ssl_session_cache shared:SSLHTTP:50m;
|
ssl_session_cache shared:SSLHTTP:50m;
|
||||||
add_header Strict-Transport-Security max-age=15768000;
|
add_header Strict-Transport-Security 'max-age=31536000';
|
||||||
|
|
||||||
{% if not TLS_FLAVOR == "mail" %}
|
{% if not TLS_FLAVOR in [ 'mail', 'mail-letsencrypt' ] %}
|
||||||
if ($scheme = http) {
|
if ($proxy_x_forwarded_proto = http) {
|
||||||
return 301 https://$host$request_uri;
|
return 301 https://$host$request_uri;
|
||||||
}
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
add_header X-Frame-Options 'SAMEORIGIN';
|
||||||
|
add_header X-Content-Type-Options 'nosniff';
|
||||||
|
add_header X-Permitted-Cross-Domain-Policies 'none';
|
||||||
|
add_header X-XSS-Protection '1; mode=block';
|
||||||
|
add_header Referrer-Policy 'same-origin';
|
||||||
|
|
||||||
# In any case, enable the proxy for certbot if the flavor is letsencrypt
|
# In any case, enable the proxy for certbot if the flavor is letsencrypt
|
||||||
{% if TLS_FLAVOR == 'letsencrypt' %}
|
{% if TLS_FLAVOR in [ 'letsencrypt', 'mail-letsencrypt' ] %}
|
||||||
location ^~ /.well-known/acme-challenge/ {
|
location ^~ /.well-known/acme-challenge/ {
|
||||||
proxy_pass http://127.0.0.1:8008;
|
proxy_pass http://127.0.0.1:8008;
|
||||||
}
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# If TLS is failing, prevent access to anything except certbot
|
# If TLS is failing, prevent access to anything except certbot
|
||||||
{% if TLS_ERROR %}
|
{% if TLS_ERROR and not TLS_FLAVOR == "mail" %}
|
||||||
location / {
|
location / {
|
||||||
return 403;
|
return 403;
|
||||||
}
|
}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
# Actual logic
|
include /overrides/*.conf;
|
||||||
{% if WEBMAIL != 'none' %}
|
|
||||||
location / {
|
|
||||||
return 301 $scheme://$host/webmail/;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# Actual logic
|
||||||
|
{% if WEB_WEBMAIL != '/' %}
|
||||||
|
location / {
|
||||||
|
{% if WEBROOT_REDIRECT %}
|
||||||
|
return 301 {{ WEBROOT_REDIRECT }};
|
||||||
|
{% else %}
|
||||||
|
return 404;
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if WEBMAIL != 'none' %}
|
||||||
location {{ WEB_WEBMAIL }} {
|
location {{ WEB_WEBMAIL }} {
|
||||||
|
{% if WEB_WEBMAIL != '/' %}
|
||||||
rewrite ^({{ WEB_WEBMAIL }})$ $1/ permanent;
|
rewrite ^({{ WEB_WEBMAIL }})$ $1/ permanent;
|
||||||
rewrite ^{{ WEB_WEBMAIL }}/(.*) /$1 break;
|
rewrite ^{{ WEB_WEBMAIL }}/(.*) /$1 break;
|
||||||
proxy_set_header Host $host;
|
{% endif %}
|
||||||
|
include /etc/nginx/proxy.conf;
|
||||||
|
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }};
|
||||||
proxy_pass http://$webmail;
|
proxy_pass http://$webmail;
|
||||||
}
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -83,8 +116,8 @@ http {
|
|||||||
|
|
||||||
location ~ {{ WEB_ADMIN }}/(ui|static) {
|
location ~ {{ WEB_ADMIN }}/(ui|static) {
|
||||||
rewrite ^{{ WEB_ADMIN }}/(.*) /$1 break;
|
rewrite ^{{ WEB_ADMIN }}/(.*) /$1 break;
|
||||||
|
include /etc/nginx/proxy.conf;
|
||||||
proxy_set_header X-Forwarded-Prefix {{ WEB_ADMIN }};
|
proxy_set_header X-Forwarded-Prefix {{ WEB_ADMIN }};
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_pass http://$admin;
|
proxy_pass http://$admin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,9 +135,15 @@ http {
|
|||||||
rewrite ^/webdav/(.*) /$1 break;
|
rewrite ^/webdav/(.*) /$1 break;
|
||||||
auth_request /internal/auth/basic;
|
auth_request /internal/auth/basic;
|
||||||
auth_request_set $user $upstream_http_x_user;
|
auth_request_set $user $upstream_http_x_user;
|
||||||
|
include /etc/nginx/proxy.conf;
|
||||||
proxy_set_header X-Remote-User $user;
|
proxy_set_header X-Remote-User $user;
|
||||||
|
proxy_set_header X-Script-Name /webdav;
|
||||||
proxy_pass http://$webdav;
|
proxy_pass http://$webdav;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location ~ ^/.well-known/(carddav|caldav) {
|
||||||
|
return 301 /webdav/;
|
||||||
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@@ -117,12 +156,17 @@ http {
|
|||||||
proxy_pass_request_body off;
|
proxy_pass_request_body off;
|
||||||
proxy_set_header Content-Length "";
|
proxy_set_header Content-Length "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /health {
|
||||||
|
return 204;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
# Forwarding authentication server
|
# Forwarding authentication server
|
||||||
server {
|
server {
|
||||||
# Variables for proxifying
|
# Variables for proxifying
|
||||||
set $admin admin;
|
set $admin {{ HOST_ADMIN }};
|
||||||
|
|
||||||
listen 127.0.0.1:8000;
|
listen 127.0.0.1:8000;
|
||||||
|
|
||||||
@@ -136,6 +180,7 @@ mail {
|
|||||||
server_name {{ HOSTNAMES.split(",")[0] }};
|
server_name {{ HOSTNAMES.split(",")[0] }};
|
||||||
auth_http http://127.0.0.1:8000/auth/email;
|
auth_http http://127.0.0.1:8000/auth/email;
|
||||||
proxy_pass_error_message on;
|
proxy_pass_error_message on;
|
||||||
|
resolver {{ RESOLVER }} valid=30s;
|
||||||
|
|
||||||
{% if TLS and not TLS_ERROR %}
|
{% if TLS and not TLS_ERROR %}
|
||||||
include /etc/nginx/tls.conf;
|
include /etc/nginx/tls.conf;
|
||||||
@@ -206,7 +251,7 @@ mail {
|
|||||||
listen 465 ssl;
|
listen 465 ssl;
|
||||||
listen [::]:465 ssl;
|
listen [::]:465 ssl;
|
||||||
protocol smtp;
|
protocol smtp;
|
||||||
smtp_auth plain;
|
smtp_auth plain login;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
|
|||||||
5
core/nginx/conf/proxy.conf
Normal file
5
core/nginx/conf/proxy.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Default proxy setup
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
|
||||||
@@ -2,6 +2,7 @@ ssl_protocols TLSv1.1 TLSv1.2;
|
|||||||
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384';
|
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384';
|
||||||
ssl_prefer_server_ciphers on;
|
ssl_prefer_server_ciphers on;
|
||||||
ssl_session_timeout 10m;
|
ssl_session_timeout 10m;
|
||||||
|
ssl_session_tickets off;
|
||||||
ssl_certificate {{ TLS[0] }};
|
ssl_certificate {{ TLS[0] }};
|
||||||
ssl_certificate_key {{ TLS[1] }};
|
ssl_certificate_key {{ TLS[1] }};
|
||||||
ssl_dhparam /certs/dhparam.pem;
|
ssl_dhparam /conf/dhparam.pem;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import jinja2
|
import jinja2
|
||||||
import os
|
import os
|
||||||
@@ -12,13 +12,25 @@ with open("/etc/resolv.conf") as handle:
|
|||||||
content = handle.read().split()
|
content = handle.read().split()
|
||||||
args["RESOLVER"] = content[content.index("nameserver") + 1]
|
args["RESOLVER"] = content[content.index("nameserver") + 1]
|
||||||
|
|
||||||
|
if "HOST_WEBMAIL" not in args:
|
||||||
|
args["HOST_WEBMAIL"] = "webmail"
|
||||||
|
if "HOST_ADMIN" not in args:
|
||||||
|
args["HOST_ADMIN"] = "admin"
|
||||||
|
if "HOST_WEBDAV" not in args:
|
||||||
|
args["HOST_WEBDAV"] = "webdav:5232"
|
||||||
|
if "HOST_ANTISPAM" not in args:
|
||||||
|
args["HOST_ANTISPAM"] = "antispam:11334"
|
||||||
|
|
||||||
# TLS configuration
|
# TLS configuration
|
||||||
|
cert_name = os.getenv("TLS_CERT_FILENAME", default="cert.pem")
|
||||||
|
keypair_name = os.getenv("TLS_KEYPAIR_FILENAME", default="key.pem")
|
||||||
args["TLS"] = {
|
args["TLS"] = {
|
||||||
"cert": ("/certs/cert.pem", "/certs/key.pem"),
|
"cert": ("/certs/%s" % cert_name, "/certs/%s" % keypair_name),
|
||||||
"mail": ("/certs/cert.pem", "/certs/key.pem"),
|
|
||||||
"letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
|
"letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
|
||||||
"/certs/letsencrypt/live/mailu/privkey.pem"),
|
"/certs/letsencrypt/live/mailu/privkey.pem"),
|
||||||
|
"mail": ("/certs/%s" % cert_name, "/certs/%s" % keypair_name),
|
||||||
|
"mail-letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
|
||||||
|
"/certs/letsencrypt/live/mailu/privkey.pem"),
|
||||||
"notls": None
|
"notls": None
|
||||||
}[args["TLS_FLAVOR"]]
|
}[args["TLS_FLAVOR"]]
|
||||||
|
|
||||||
@@ -26,8 +38,9 @@ if args["TLS"] and not all(os.path.exists(file_path) for file_path in args["TLS"
|
|||||||
print("Missing cert or key file, disabling TLS")
|
print("Missing cert or key file, disabling TLS")
|
||||||
args["TLS_ERROR"] = "yes"
|
args["TLS_ERROR"] = "yes"
|
||||||
|
|
||||||
|
|
||||||
# Build final configuration paths
|
# Build final configuration paths
|
||||||
convert("/conf/tls.conf", "/etc/nginx/tls.conf", args)
|
convert("/conf/tls.conf", "/etc/nginx/tls.conf", args)
|
||||||
|
convert("/conf/proxy.conf", "/etc/nginx/proxy.conf", args)
|
||||||
convert("/conf/nginx.conf", "/etc/nginx/nginx.conf", args)
|
convert("/conf/nginx.conf", "/etc/nginx/nginx.conf", args)
|
||||||
os.system("nginx -s reload")
|
if os.path.exists("/var/run/nginx.pid"):
|
||||||
|
os.system("nginx -s reload")
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user