Compare commits
42 commits
b947ea0748
...
24c5e5b418
| Author | SHA1 | Date | |
|---|---|---|---|
| 24c5e5b418 | |||
| 1d63ab69af | |||
| fb08f61301 | |||
| bd1e55f731 | |||
| a211d92fd6 | |||
| 81e6f102b0 | |||
| a9cc36e8bb | |||
| 4da8f077e6 | |||
| 912492287d | |||
| df1d49afdf | |||
| 4f159716ef | |||
| f7f672fbc8 | |||
| fd70990a60 | |||
| fa48d82579 | |||
| 8080437ae3 | |||
| 264dd9fcd0 | |||
| af7e759c74 | |||
| 80cffd51e3 | |||
| 0cd83c2034 | |||
|
|
9aa27b9159 | ||
|
|
88ac4aaa46 | ||
|
|
329c4e8972 | ||
|
|
6fd3a74ff1 | ||
| b77088a0f7 | |||
| 0951a2c96f | |||
| 0f4d71fd5f | |||
| 5bf9c487f4 | |||
| e962886ee6 | |||
| f5997c3495 | |||
| 19f1d792c9 | |||
| f873ebe49a | |||
| 3a13a742ea | |||
| abe6291333 | |||
| 852f5e7832 | |||
| f1811384d6 | |||
| 107816711f | |||
| 4992e4a8c6 | |||
| 1695df72a9 | |||
| d3c4afc61e | |||
| 370e684f06 | |||
| 935bbd2a6f | |||
| 96c00a0650 |
|
|
@ -1,9 +1,47 @@
|
||||||
on: [push]
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- stage
|
||||||
jobs:
|
jobs:
|
||||||
print-content:
|
build:
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
environment: ${{ github.ref_name }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: list directory contents
|
|
||||||
run: ls -la
|
- name: Setup Node.js
|
||||||
|
uses: https://code.forgejo.org/actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: "22"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build Astro project
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Deploy dist to dist-${{ github.ref_name }}
|
||||||
|
run: |
|
||||||
|
git config user.name "forgejo-actions[bot]"
|
||||||
|
git config user.email "forgejo-actions[bot]@users.noreply.local"
|
||||||
|
|
||||||
|
git checkout --orphan temp-build
|
||||||
|
git rm -rf .
|
||||||
|
|
||||||
|
git add dist
|
||||||
|
git commit -m "Update dist/ [skip ci]"
|
||||||
|
|
||||||
|
git push \
|
||||||
|
https://x-access-token:${{ secrets.GITHUB_TOKEN }}@${{ github.server_url#https:// }}/{{ github.repository }} \
|
||||||
|
temp-build:dist-${{ github.ref_name }} \
|
||||||
|
--force
|
||||||
|
|
||||||
|
- name: Trigger deployment webhook
|
||||||
|
env:
|
||||||
|
DEPLOY_WEBHOOK: ${{ secrets.COOLIFY_STAGE_DEPLOY_WEBHOOK }}
|
||||||
|
DEPLOY_TOKEN: ${{ secrets.COOLIFY_STAGE_DEPLOY_TOKEN }}
|
||||||
|
run: |
|
||||||
|
curl -v "$DEPLOY_WEBHOOK" \
|
||||||
|
--header "Authorization: Bearer $DEPLOY_TOKEN"
|
||||||
|
|
|
||||||
32
README.md
|
|
@ -1,18 +1,30 @@
|
||||||
# ISPmail guide
|
# ISPmail guide
|
||||||
|
|
||||||
This repository holds the ISPmail guide as found on workaround.org.
|
This repository contains the ISPmail guide as found on workaround.org.
|
||||||
|
|
||||||
It was built using the static site generator [Starlight](https://starlight.astro.build).
|
The web site is built the static site generator [Starlight](https://starlight.astro.build) which creates beautiful
|
||||||
|
documentation with table of contents, a search function and customizable widgets.
|
||||||
|
|
||||||
More information on how to contribute will follow.
|
The illustrations were created using DrawIO. The flip-book-style diagrams on the _big picture_ page were created using:
|
||||||
|
|
||||||
# Software used
|
|
||||||
|
|
||||||
Static site generator: https://starlight.astro.build/
|
|
||||||
|
|
||||||
Diagrams/Illustrations:
|
|
||||||
|
|
||||||
- DrawIO
|
|
||||||
- https://github.com/pascal-brand38/astro-splide
|
- https://github.com/pascal-brand38/astro-splide
|
||||||
- https://pascal-brand38.github.io/astro-dev/packages/astro-splide/
|
- https://pascal-brand38.github.io/astro-dev/packages/astro-splide/
|
||||||
- https://splidejs.com/guides/options/
|
- https://splidejs.com/guides/options/
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Feel free to clone this repository (the _prod_ branch) and make changes. You will need NodeJS to create the HTML from
|
||||||
|
the sources:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt install nodejs
|
||||||
|
npm i
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Merge requests are always welcome. Typo fixes and rephrasing are always welcome because I am not a native english
|
||||||
|
speaker. If you want to contribute or change larger sections please talk to me first.
|
||||||
|
|
||||||
|
Or just create an _issue_ here on Github so that I know what needs fixing.
|
||||||
|
|
||||||
|
…[Christoph](mailto:ispmail@christoph-haas.de)
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,26 @@ import remarkSmartypants from "remark-smartypants";
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
site: "https://workaround.org",
|
site: "https://workaround.org",
|
||||||
|
redirects: {
|
||||||
|
"/ispmail-trxie/imap/": "/ispmail-trixie/imap/",
|
||||||
|
"/ispmail-trxie/anti-spoofing-dkim-spf": "/ispmail-trixie/anti-spoofing-dkim-spf",
|
||||||
|
"/ispmail-trxie/catch-all": "/ispmail-trixie/catch-all",
|
||||||
|
"/ispmail-trxie/quotas": "/ispmail-trixie/quotas",
|
||||||
|
"/ispmail-trxie/going-live": "/ispmail-trixie/going-live",
|
||||||
|
},
|
||||||
integrations: [
|
integrations: [
|
||||||
starlight({
|
starlight({
|
||||||
|
head: [
|
||||||
|
{
|
||||||
|
tag: "script",
|
||||||
|
attrs: {
|
||||||
|
src: "https://rybbit.workaround.org/api/script.js",
|
||||||
|
"data-site-id": "1",
|
||||||
|
async: true,
|
||||||
|
defer: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
expressiveCode: {
|
expressiveCode: {
|
||||||
frames: {
|
frames: {
|
||||||
removeCommentsWhenCopyingTerminalFrames: false, // keep the commented lines when copying shell snippets
|
removeCommentsWhenCopyingTerminalFrames: false, // keep the commented lines when copying shell snippets
|
||||||
|
|
@ -55,17 +73,17 @@ export default defineConfig({
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
// https://github.com/felix-berlin/astro-matomo
|
// https://github.com/felix-berlin/astro-matomo
|
||||||
matomo({
|
// matomo({
|
||||||
enabled: import.meta.env.PROD, // Only load in production
|
// enabled: import.meta.env.PROD, // Only load in production
|
||||||
host: "https://matomo.workaround.org/",
|
// host: "https://matomo.workaround.org/",
|
||||||
setCookieDomain: "*.workaround.org",
|
// setCookieDomain: "*.workaround.org",
|
||||||
trackerUrl: "js/", // defaults to matomo.php
|
// trackerUrl: "js/", // defaults to matomo.php
|
||||||
srcUrl: "js/", // defaults to matomo.js
|
// srcUrl: "js/", // defaults to matomo.js
|
||||||
siteId: 1,
|
// siteId: 1,
|
||||||
heartBeatTimer: 5,
|
// heartBeatTimer: 5,
|
||||||
disableCookies: true,
|
// disableCookies: true,
|
||||||
debug: false,
|
// debug: false,
|
||||||
}),
|
// }),
|
||||||
sitemap(),
|
sitemap(),
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,34 @@
|
||||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.0.6 Chrome/138.0.7204.100 Electron/37.2.3 Safari/537.36" version="28.0.6">
|
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5">
|
||||||
<diagram name="Seite-1" id="KTvmaRo9VcoZ5VeuPiA4">
|
<diagram name="Seite-1" id="KTvmaRo9VcoZ5VeuPiA4">
|
||||||
<mxGraphModel dx="2466" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
<mxGraphModel dx="2466" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0" adaptiveColors="simple">
|
||||||
<root>
|
<root>
|
||||||
<mxCell id="0" />
|
<mxCell id="0" />
|
||||||
<mxCell id="1" parent="0" />
|
<mxCell id="1" parent="0" />
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-4" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-4" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="120" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="120" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-9" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-9" value="<font style="">Other</font><div><font style="">mail&nbsp;<span style="background-color: transparent;">server</span></font></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fontSize=16;fontStyle=0;fillColor=#dae8fc;fontColor=#000000;strokeColor=#6c8ebf;align=center;verticalAlign=middle;fontFamily=Helvetica;" parent="1" vertex="1">
|
||||||
<mxGeometry x="110" y="150" width="130" height="50" as="geometry" />
|
<mxGeometry x="110" y="150" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-17" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-17" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="640" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="640" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-24" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-65" target="gQG6ldMYRfHswNwDJcwK-22" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-24" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;fillColor=#dae8fc;fontStyle=0;" parent="1" source="gQG6ldMYRfHswNwDJcwK-65" target="gQG6ldMYRfHswNwDJcwK-22" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-22" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-22" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontColor=#000000;align=center;verticalAlign=middle;fontFamily=Helvetica;fontStyle=0;labelBackgroundColor=none;" parent="1" vertex="1">
|
||||||
<mxGeometry x="370" y="670" width="140" height="50" as="geometry" />
|
<mxGeometry x="370" y="670" width="140" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-29" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-29" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="1160" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="1160" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-34" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-34" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="1680" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="1680" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-40" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-40" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="2200" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="2200" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-45" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-45" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="2720" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="2720" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-46" value="SMTP<div>(TCP port 25)</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-50" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-46" value="SMTP<div>(TCP port 25)</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-50" edge="1">
|
||||||
|
|
@ -37,40 +37,40 @@
|
||||||
<mxPoint x="370" y="2770" as="targetPoint" />
|
<mxPoint x="370" y="2770" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-50" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-50" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="190" y="2930" width="150" height="50" as="geometry" />
|
<mxGeometry x="190" y="2930" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-51" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-51" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="3240" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="3240" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-56" value="07" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-56" value="07" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-120" y="3470" width="60" height="30" as="geometry" />
|
<mxGeometry x="-120" y="3470" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-57" value="06" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-57" value="06" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-130" y="2930" width="60" height="30" as="geometry" />
|
<mxGeometry x="-130" y="2930" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-58" value="05" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-58" value="05" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-130" y="2370" width="60" height="30" as="geometry" />
|
<mxGeometry x="-130" y="2370" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-59" value="04" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-59" value="04" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-130" y="1890" width="60" height="30" as="geometry" />
|
<mxGeometry x="-130" y="1890" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-60" value="03" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-60" value="03" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-140" y="1350" width="60" height="30" as="geometry" />
|
<mxGeometry x="-140" y="1350" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-61" value="02" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-61" value="02" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-140" y="850" width="60" height="30" as="geometry" />
|
<mxGeometry x="-140" y="850" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-62" value="01" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-62" value="01" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-110" y="300" width="60" height="30" as="geometry" />
|
<mxGeometry x="-110" y="300" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-64" value="<span style="font-size: 16px;">I would like to send an email to john@example.com</span>" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.cloud_callout;fontFamily=Helvetica;fontSize=11;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;spacingLeft=20;spacingTop=20;spacingRight=20;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-64" value="<span style="font-size: 16px;">I would like to send an email to john@example.com</span>" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.cloud_callout;fontFamily=Helvetica;fontSize=11;labelBackgroundColor=none;flipV=1;fillColor=#f5f5f5;strokeColor=#666666;spacingLeft=20;spacingTop=20;spacingRight=20;fontStyle=0;fillStyle=auto;shadow=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="220" y="180" width="230" height="130" as="geometry" />
|
<mxGeometry x="220" y="180" width="230" height="130" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-65" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-65" value="Other<div>mail&nbsp;<span style="">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;align=center;verticalAlign=middle;fontFamily=Helvetica;labelBackgroundColor=none;" parent="1" vertex="1">
|
||||||
<mxGeometry x="110" y="670" width="130" height="50" as="geometry" />
|
<mxGeometry x="110" y="670" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-28" value="What is the MX record for the domain example.com?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-28" value="What is the MX record for the domain example.com?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="200" y="710" width="140" height="110" as="geometry" />
|
<mxGeometry x="200" y="710" width="140" height="110" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-66" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-67" target="gQG6ldMYRfHswNwDJcwK-68" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-66" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-67" target="gQG6ldMYRfHswNwDJcwK-68" edge="1">
|
||||||
|
|
@ -78,25 +78,25 @@
|
||||||
<mxPoint x="-120" y="1110" as="sourcePoint" />
|
<mxPoint x="-120" y="1110" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-67" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-67" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="370" y="1190" width="140" height="50" as="geometry" />
|
<mxGeometry x="370" y="1190" width="140" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-68" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-68" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="110" y="1190" width="130" height="50" as="geometry" />
|
<mxGeometry x="110" y="1190" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-33" value="smtp01.example.net" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-33" value="smtp01.example.net" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="270" y="1230" width="160" height="50" as="geometry" />
|
<mxGeometry x="270" y="1230" width="160" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-69" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-71" target="gQG6ldMYRfHswNwDJcwK-70" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-69" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-71" target="gQG6ldMYRfHswNwDJcwK-70" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-70" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-70" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="370" y="1710" width="140" height="50" as="geometry" />
|
<mxGeometry x="370" y="1710" width="140" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-71" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-71" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="110" y="1710" width="130" height="50" as="geometry" />
|
<mxGeometry x="110" y="1710" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-39" value="What are the A and AAAAA records for smtp01.example.net?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-39" value="What are the A and AAAAA records for smtp01.example.net?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="200" y="1750" width="170" height="90" as="geometry" />
|
<mxGeometry x="200" y="1750" width="170" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-72" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-73" target="gQG6ldMYRfHswNwDJcwK-74" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-72" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-73" target="gQG6ldMYRfHswNwDJcwK-74" edge="1">
|
||||||
|
|
@ -104,16 +104,16 @@
|
||||||
<mxPoint x="-120" y="2150" as="sourcePoint" />
|
<mxPoint x="-120" y="2150" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-73" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-73" value="Name server<div>(DNS)</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="370" y="2230" width="140" height="50" as="geometry" />
|
<mxGeometry x="370" y="2230" width="140" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-74" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-74" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="110" y="2230" width="130" height="50" as="geometry" />
|
<mxGeometry x="110" y="2230" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-44" value="A: 100.17.195.84<div>AAAA: 2001:876:18:5::ce</div>" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-44" value="A: 100.17.195.84<div>AAAA: 2001:876:18:5::ce</div>" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="290" y="2270" width="200" height="70" as="geometry" />
|
<mxGeometry x="290" y="2270" width="200" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-75" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-75" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="2750" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="2750" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-76" value="220 smtp01.example.net<div>ESMTP Postfix</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-77" target="gQG6ldMYRfHswNwDJcwK-78" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-76" value="220 smtp01.example.net<div>ESMTP Postfix</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-77" target="gQG6ldMYRfHswNwDJcwK-78" edge="1">
|
||||||
|
|
@ -122,16 +122,16 @@
|
||||||
<mxPoint x="690" y="3290" as="targetPoint" />
|
<mxPoint x="690" y="3290" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-77" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-77" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="190" y="3450" width="150" height="50" as="geometry" />
|
<mxGeometry x="190" y="3450" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-78" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-78" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="3270" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="3270" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-55" value="Nice to see you." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-55" value="Nice to see you." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="300" y="3410" width="150" height="60" as="geometry" />
|
<mxGeometry x="300" y="3410" width="150" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-79" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-79" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="3760" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="3760" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-80" value="EHLO remoteserver" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-81" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-80" value="EHLO remoteserver" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-81" edge="1">
|
||||||
|
|
@ -140,19 +140,19 @@
|
||||||
<mxPoint x="370" y="3810" as="targetPoint" />
|
<mxPoint x="370" y="3810" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-81" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-81" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="190" y="3970" width="150" height="50" as="geometry" />
|
<mxGeometry x="190" y="3970" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-82" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-82" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="3790" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="3790" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-83" value="08" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-83" value="08" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-70" y="3970" width="60" height="30" as="geometry" />
|
<mxGeometry x="-70" y="3970" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-84" value="Hi, my name is "remoteserver"" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-84" value="Hi, my name is "remoteserver"" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="240" y="3800" width="170" height="90" as="geometry" />
|
<mxGeometry x="240" y="3800" width="170" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-85" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-85" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="4280" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="4280" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-86" value="<div>250-smtp01.example.com</div><div><span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">250-SIZE 40000000</span></div><div><span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">250-STARTTLS</span></div><div>250-ENHANCEDSTATUSCODES</div><div>250-8BITMIME</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-87" target="gQG6ldMYRfHswNwDJcwK-88" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-86" value="<div>250-smtp01.example.com</div><div><span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">250-SIZE 40000000</span></div><div><span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">250-STARTTLS</span></div><div>250-ENHANCEDSTATUSCODES</div><div>250-8BITMIME</div>" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-87" target="gQG6ldMYRfHswNwDJcwK-88" edge="1">
|
||||||
|
|
@ -161,19 +161,19 @@
|
||||||
<mxPoint x="216.1111111111113" y="4400" as="targetPoint" />
|
<mxPoint x="216.1111111111113" y="4400" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-87" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-87" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="220" y="4560" width="150" height="50" as="geometry" />
|
<mxGeometry x="220" y="4560" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-88" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-88" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="4310" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="4310" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-89" value="These are the features that I support." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-89" value="These are the features that I support." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="330" y="4510" width="180" height="70" as="geometry" />
|
<mxGeometry x="330" y="4510" width="180" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-90" value="09" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-90" value="09" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-80" y="4480" width="60" height="30" as="geometry" />
|
<mxGeometry x="-80" y="4480" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-91" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-91" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="4800" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="4800" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-92" value="STARTTLS" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-93" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-92" value="STARTTLS" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-93" edge="1">
|
||||||
|
|
@ -182,19 +182,19 @@
|
||||||
<mxPoint x="370" y="4850" as="targetPoint" />
|
<mxPoint x="370" y="4850" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-93" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-93" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="5090" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="5090" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-94" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-94" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="4830" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="4830" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-95" value="Let us switch to encrypted communication" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-95" value="Let us switch to encrypted communication" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="230" y="4850" width="170" height="90" as="geometry" />
|
<mxGeometry x="230" y="4850" width="170" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-96" value="10" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-96" value="10" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-50" y="4970" width="60" height="30" as="geometry" />
|
<mxGeometry x="-50" y="4970" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-97" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-97" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="5320" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="5320" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-98" value="MAIL FROM: &lt;someone@else.com&gt;" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-99" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-98" value="MAIL FROM: &lt;someone@else.com&gt;" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-99" edge="1">
|
||||||
|
|
@ -203,22 +203,22 @@
|
||||||
<mxPoint x="370" y="5370" as="targetPoint" />
|
<mxPoint x="370" y="5370" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-99" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-99" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="5610" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="5610" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-100" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-100" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="5350" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="5350" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-101" value="I have an email from someone@else.com" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-101" value="I have an email from someone@else.com" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="230" y="5370" width="170" height="90" as="geometry" />
|
<mxGeometry x="230" y="5370" width="170" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-102" value="11" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-102" value="11" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-60" y="5530" width="60" height="30" as="geometry" />
|
<mxGeometry x="-60" y="5530" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-103" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-103" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="5430" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="5430" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-104" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-104" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="5840" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="5840" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-105" value="Ok" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-106" target="gQG6ldMYRfHswNwDJcwK-107" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-105" value="Ok" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-106" target="gQG6ldMYRfHswNwDJcwK-107" edge="1">
|
||||||
|
|
@ -227,19 +227,19 @@
|
||||||
<mxPoint x="-130" y="5840" as="targetPoint" />
|
<mxPoint x="-130" y="5840" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-106" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-106" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="6130" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="6130" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-107" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-107" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="5870" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="5870" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-109" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-109" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="5950" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="5950" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-110" value="12" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-110" value="12" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-50" y="6050" width="60" height="30" as="geometry" />
|
<mxGeometry x="-50" y="6050" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-112" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-112" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="6360" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="6360" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-113" value="RCPT TO: &lt;john@example.org&gt;" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-114" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-113" value="RCPT TO: &lt;john@example.org&gt;" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" target="gQG6ldMYRfHswNwDJcwK-114" edge="1">
|
||||||
|
|
@ -248,25 +248,25 @@
|
||||||
<mxPoint x="370" y="6410" as="targetPoint" />
|
<mxPoint x="370" y="6410" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-114" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-114" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="6650" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="6650" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-115" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-115" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="6390" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="6390" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-116" value="That email is meant for john@example.org" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-116" value="That email is meant for john@example.org" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="230" y="6410" width="170" height="90" as="geometry" />
|
<mxGeometry x="230" y="6410" width="170" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-117" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-117" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="6470" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="6470" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-118" value="13" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-118" value="13" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-30" y="6580" width="60" height="30" as="geometry" />
|
<mxGeometry x="-30" y="6580" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-124" value="14" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-124" value="14" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-60" y="7080" width="60" height="30" as="geometry" />
|
<mxGeometry x="-60" y="7080" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-125" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-125" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="6880" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="6880" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-126" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-127" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-126" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-127" edge="1">
|
||||||
|
|
@ -278,22 +278,22 @@
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-132" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-127" target="gQG6ldMYRfHswNwDJcwK-131" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-132" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-127" target="gQG6ldMYRfHswNwDJcwK-131" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-127" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-127" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="7170" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="7170" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-128" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-128" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="6910" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="6910" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-130" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-130" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="6990" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="6990" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-131" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-131" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="570" y="7170" width="150" height="50" as="geometry" />
|
<mxGeometry x="570" y="7170" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-133" value="Is example.org our domain?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-133" value="Is example.org our domain?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="300" y="7110" width="130" height="70" as="geometry" />
|
<mxGeometry x="300" y="7110" width="130" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-134" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-134" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="7400" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="7400" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-135" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-137" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-135" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-137" edge="1">
|
||||||
|
|
@ -307,25 +307,25 @@
|
||||||
<mxPoint x="710" y="8020" as="sourcePoint" />
|
<mxPoint x="710" y="8020" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-137" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-137" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="7690" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="7690" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-138" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-138" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="7430" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="7430" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-139" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-139" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="7510" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="7510" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-140" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-140" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="570" y="7690" width="150" height="50" as="geometry" />
|
<mxGeometry x="570" y="7690" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-141" value="Yes, I found it in my virtual_domains table" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-141" value="Yes, I found it in my virtual_domains table" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="470" y="7610" width="150" height="90" as="geometry" />
|
<mxGeometry x="470" y="7610" width="150" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-142" value="15" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-142" value="15" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-50" y="7600" width="60" height="30" as="geometry" />
|
<mxGeometry x="-50" y="7600" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-143" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-143" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="7920" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="7920" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-144" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-146" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-144" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-146" edge="1">
|
||||||
|
|
@ -337,25 +337,25 @@
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-145" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-146" target="gQG6ldMYRfHswNwDJcwK-149" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-145" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-146" target="gQG6ldMYRfHswNwDJcwK-149" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-146" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-146" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="8210" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="8210" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-147" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-147" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="7950" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="7950" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-148" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-148" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="8030" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="8030" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-149" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-149" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="570" y="8210" width="150" height="50" as="geometry" />
|
<mxGeometry x="570" y="8210" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-150" value="And is john@example.org a known user?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-150" value="And is john@example.org a known user?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="300" y="8130" width="180" height="90" as="geometry" />
|
<mxGeometry x="300" y="8130" width="180" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-151" value="16" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-151" value="16" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-30" y="8155" width="60" height="30" as="geometry" />
|
<mxGeometry x="-30" y="8155" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-152" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-152" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="8440" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="8440" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-153" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-155" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-153" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-155" edge="1">
|
||||||
|
|
@ -369,46 +369,46 @@
|
||||||
<mxPoint x="710" y="9060" as="sourcePoint" />
|
<mxPoint x="710" y="9060" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-155" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-155" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="8730" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="8730" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-156" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-156" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="8470" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="8470" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-157" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-157" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="8550" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="8550" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-158" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-158" value="MariaDB<div>database</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="570" y="8730" width="150" height="50" as="geometry" />
|
<mxGeometry x="570" y="8730" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-159" value="Yes, I found it in my virtual_users table" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-159" value="Yes, I found it in my virtual_users table" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="440" y="8660" width="180" height="80" as="geometry" />
|
<mxGeometry x="440" y="8660" width="180" height="80" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-160" value="17" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-160" value="17" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-50" y="8640" width="60" height="30" as="geometry" />
|
<mxGeometry x="-50" y="8640" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-161" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-161" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="8960" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="8960" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-171" value="Ok" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-164" target="gQG6ldMYRfHswNwDJcwK-165" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-171" value="Ok" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-164" target="gQG6ldMYRfHswNwDJcwK-165" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-164" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-164" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="9250" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="9250" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-165" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-165" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="8990" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="8990" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-166" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-166" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="9070" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="9070" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-169" value="18" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-169" value="18" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-30" y="9180" width="60" height="30" as="geometry" />
|
<mxGeometry x="-30" y="9180" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-170" value="Looks good." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-170" value="Looks good." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="320" y="9200" width="130" height="60" as="geometry" />
|
<mxGeometry x="320" y="9200" width="130" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-172" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-172" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="9480" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="9480" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-173" value="DATA" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-175" target="gQG6ldMYRfHswNwDJcwK-174" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-173" value="DATA" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-175" target="gQG6ldMYRfHswNwDJcwK-174" edge="1">
|
||||||
|
|
@ -416,22 +416,22 @@
|
||||||
<mxPoint x="-200" y="9510" as="sourcePoint" />
|
<mxPoint x="-200" y="9510" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-174" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-174" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="9770" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="9770" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-175" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-175" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="9510" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="9510" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-176" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-176" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="9590" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="9590" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-177" value="19" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-177" value="19" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-30" y="9700" width="60" height="30" as="geometry" />
|
<mxGeometry x="-30" y="9700" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-179" value="Let me send you the email now" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-179" value="Let me send you the email now" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="220" y="9540" width="140" height="70" as="geometry" />
|
<mxGeometry x="220" y="9540" width="140" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-180" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-180" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="10000" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="10000" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-181" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-183" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-181" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-183" edge="1">
|
||||||
|
|
@ -443,25 +443,25 @@
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-182" value="TCP port 11332" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-183" target="gQG6ldMYRfHswNwDJcwK-186" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-182" value="TCP port 11332" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-183" target="gQG6ldMYRfHswNwDJcwK-186" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-183" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-183" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="10290" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="10290" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-184" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#CCCCCC;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-184" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="10030" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="10030" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-185" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-185" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="10110" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="10110" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-186" value="rspamd<div>Spam check</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-186" value="rspamd<div>Spam check</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="620" y="10180" width="150" height="50" as="geometry" />
|
<mxGeometry x="620" y="10180" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-188" value="20" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-188" value="20" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-40" y="10210" width="60" height="30" as="geometry" />
|
<mxGeometry x="-40" y="10210" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-189" value="Do you think this email is spam?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-189" value="Do you think this email is spam?" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="330" y="10310" width="145" height="90" as="geometry" />
|
<mxGeometry x="330" y="10310" width="145" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-190" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-190" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="10520" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="10520" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-191" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-193" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-191" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#CCCCCC;" parent="1" target="gQG6ldMYRfHswNwDJcwK-193" edge="1">
|
||||||
|
|
@ -475,25 +475,25 @@
|
||||||
<mxPoint x="1140" y="10950" as="sourcePoint" />
|
<mxPoint x="1140" y="10950" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-193" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-193" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="10810" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="10810" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-194" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-194" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="10550" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="10550" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-195" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-195" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="10630" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="10630" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-196" value="rspamd<div>Spam check</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-196" value="rspamd<div>Spam check</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="620" y="10700" width="150" height="50" as="geometry" />
|
<mxGeometry x="620" y="10700" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-197" value="21" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-197" value="21" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-40" y="10730" width="60" height="30" as="geometry" />
|
<mxGeometry x="-40" y="10730" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-199" value="A few minor issues but the email seems legit" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-199" value="A few minor issues but the email seems legit" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="520" y="10620" width="145" height="90" as="geometry" />
|
<mxGeometry x="520" y="10620" width="145" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-200" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-200" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="11040" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="11040" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-201" value="250 2.0.0 Ok: queued as 7855B7FD86" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#000000;" parent="1" source="gQG6ldMYRfHswNwDJcwK-203" target="gQG6ldMYRfHswNwDJcwK-204" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-201" value="250 2.0.0 Ok: queued as 7855B7FD86" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;strokeColor=#000000;" parent="1" source="gQG6ldMYRfHswNwDJcwK-203" target="gQG6ldMYRfHswNwDJcwK-204" edge="1">
|
||||||
|
|
@ -502,61 +502,61 @@
|
||||||
<mxPoint x="-80" y="11370" as="targetPoint" />
|
<mxPoint x="-80" y="11370" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-203" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-203" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="11330" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="11330" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-204" value="Other<div>mail&nbsp;<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-204" value="Other<div>mail&nbsp;<span style="background-color: transparent;">server</span></div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=16;fontStyle=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="120" y="11070" width="130" height="50" as="geometry" />
|
<mxGeometry x="120" y="11070" width="130" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-205" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-205" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#C73500;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#fa6800;shape=mxgraph.mscae.enterprise.lock;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="160" y="11150" width="30" height="38.46" as="geometry" />
|
<mxGeometry x="160" y="11150" width="30" height="38.46" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-208" value="22" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-208" value="22" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-20" y="11250" width="60" height="30" as="geometry" />
|
<mxGeometry x="-20" y="11250" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-209" value="Thanks. I will deliver it." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-209" value="Thanks. I will deliver it." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="320" y="11360" width="130" height="70" as="geometry" />
|
<mxGeometry x="320" y="11360" width="130" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-210" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-210" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="11560" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="11560" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-218" value="LMTP" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-212" target="gQG6ldMYRfHswNwDJcwK-217" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-218" value="LMTP" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-212" target="gQG6ldMYRfHswNwDJcwK-217" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-212" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-212" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="11850" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="11850" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-215" value="23" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-215" value="23" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-20" y="11770" width="60" height="30" as="geometry" />
|
<mxGeometry x="-20" y="11770" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-216" value="Please save this new email for john@example.org" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-216" value="Please save this new email for john@example.org" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=1;fillColor=#fff2cc;strokeColor=#d6b656;flipH=0;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="320" y="11880" width="180" height="100" as="geometry" />
|
<mxGeometry x="320" y="11880" width="180" height="100" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-217" value="Dovecot<div>IMAP server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-217" value="Dovecot<div>IMAP server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="630" y="11700" width="150" height="50" as="geometry" />
|
<mxGeometry x="630" y="11700" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-223" value="24" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-223" value="24" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Helvetica;fontSize=11;fontColor=#000000;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="-20" y="12290" width="60" height="30" as="geometry" />
|
<mxGeometry x="-20" y="12290" width="60" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-228" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-228" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=5;verticalAlign=bottom;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="80" y="12080" width="800" height="500" as="geometry" />
|
<mxGeometry x="80" y="12080" width="800" height="500" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-229" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#CCCCCC;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-230" target="gQG6ldMYRfHswNwDJcwK-233" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-229" value="" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#CCCCCC;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=16;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-230" target="gQG6ldMYRfHswNwDJcwK-233" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-230" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;opacity=50;fontColor=#CCCCCC;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-230" value="Postfix<div>mail server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;opacity=50;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="210" y="12370" width="150" height="50" as="geometry" />
|
<mxGeometry x="210" y="12370" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-235" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-233" target="gQG6ldMYRfHswNwDJcwK-234" edge="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-235" style="edgeStyle=none;shape=connector;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=default;strokeWidth=3;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=11;fontColor=default;labelBackgroundColor=default;endArrow=classic;" parent="1" source="gQG6ldMYRfHswNwDJcwK-233" target="gQG6ldMYRfHswNwDJcwK-234" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-233" value="Dovecot<div>IMAP server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-233" value="Dovecot<div>IMAP server</div>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=16;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="630" y="12220" width="150" height="50" as="geometry" />
|
<mxGeometry x="630" y="12220" width="150" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-234" value="<font style="font-size: 16px; color: rgb(0, 0, 0);">/var/vmail</font>" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.storage;fontFamily=Helvetica;fontSize=11;labelBackgroundColor=default;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-234" value="<font style="font-size: 16px;">/var/vmail</font>" style="fontColor=#000000;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.storage;fontFamily=Helvetica;fontSize=11;labelBackgroundColor=default;" parent="1" vertex="1">
|
||||||
<mxGeometry x="670" y="12415" width="70" height="70" as="geometry" />
|
<mxGeometry x="670" y="12415" width="70" height="70" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="gQG6ldMYRfHswNwDJcwK-236" value="Alright. Saving to disk." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;" parent="1" vertex="1">
|
<mxCell id="gQG6ldMYRfHswNwDJcwK-236" value="Alright. Saving to disk." style="whiteSpace=wrap;html=1;shape=mxgraph.basic.roundRectCallout;dx=30;dy=15;size=5;boundedLbl=1;fontFamily=Helvetica;fontSize=16;labelBackgroundColor=none;flipV=0;fillColor=#fff2cc;strokeColor=#d6b656;flipH=1;fontColor=#000000;" parent="1" vertex="1">
|
||||||
<mxGeometry x="550" y="12140" width="120" height="90" as="geometry" />
|
<mxGeometry x="550" y="12140" width="120" height="90" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</root>
|
</root>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
991
public/ispmail.sh
Executable file
|
|
@ -0,0 +1,991 @@
|
||||||
|
#!/bin/bash -e
|
||||||
|
#
|
||||||
|
# Installer for ISPmail servers
|
||||||
|
# Copyright © 2025 Christoph Haas <ispmail@christoph-haas.de>
|
||||||
|
#
|
||||||
|
# License: Creative Commons BY-NC-SA license
|
||||||
|
#
|
||||||
|
# Version 0.1
|
||||||
|
# 2025-12-14
|
||||||
|
#
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 -f fqdn"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
FQDN=""
|
||||||
|
|
||||||
|
while getopts "f:h" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
f) FQDN="$OPTARG" ;;
|
||||||
|
h) usage ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
############ pre flight check ############
|
||||||
|
|
||||||
|
pre_flight() {
|
||||||
|
# Check for root
|
||||||
|
if [[ $EUIA -ne 0 ]]; then
|
||||||
|
echo "❌ You must run this script as root."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Trixie
|
||||||
|
DEBIAN_VERSION=$(cut -d'.' -f1 /etc/debian_version)
|
||||||
|
if [[ "$DEBIAN_VERSION" -ne 13 ]]; then
|
||||||
|
echo "❌ Sorry, this installer only works on Debian 13/Trixie."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
# FQDN needs to be given as an option
|
||||||
|
if [[ $FQDN = "" ]]; then
|
||||||
|
echo "❌ You must specify your FQDN using the '-f' option."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
############## Intro ##############
|
||||||
|
|
||||||
|
intro() {
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⢶⢞⣞⢟⢽⢫⢏⠗⡗⢖⠦⡢⡠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣮⢾⡷⣯⣿⣽⣗⢷⡹⣮⢦⣣⡢⣅⢓⣕⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⡿⣟⣯⢿⢯⢷⡻⡽⢽⢾⢽⣳⠓⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣺⡽⡾⣽⣽⣵⣇⣯⡺⣸⡹⣌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡟⢔⢕⡇⣏⢿⡿⡏⢀⡉⡉⠈⢳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⣟⠌⡜⢜⣿⡳⣏⢊⠘⠪⡿⡕⠀⠈⢷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢼⣷⡱⡨⡪⡮⡮⣎⠆⡐⡐⠄⠂⠀⣀⣟⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣾⣮⣯⣞⡇⣆⣪⣬⣼⢷⣿⡽⣯⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣟⡿⠾⠟⠿⠻⠿⠿⠿⠿⠿⠞⠯⠿⠷⠟⢿⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢿⣽⡇⠂⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠄⢐⣿⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣽⣿⢿⢅⠁⠄⠑⢄⠄⠀⠀⠄⠀⠐⠈⢀⠀⡀⠠⣿⣯⣷⣤⡀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣾⢫⢂⠂⡐⠠⠀⠑⢔⢀⠀⠂⠁⡈⢀⠠⠀⠀⢳⣿⣻⣿⣿⣦⣄⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⣴⣿⣿⢿⡿⣟⣿⢯⣪⡢⡁⠄⠂⢈⠀⠄⠱⣔⡈⡀⠄⠠⠀⠠⣀⡨⣾⢿⣻⢿⢿⡿⣷⡀⠀⠀
|
||||||
|
⠀⠀⠀⠨⣿⣷⡿⣿⣻⣿⣾⢿⣽⢯⡿⣶⡡⠀⡐⠨⢈⠠⠑⠦⣐⠰⣵⣟⢗⢽⢝⡽⣝⣟⣯⣿⣯⡧⠀⠀
|
||||||
|
⠀⠀⠀⠈⢻⢾⣿⣿⢿⣿⣟⣿⣟⣿⣟⡿⡪⠐⡀⠡⢀⠐⠠⠁⠕⢝⢿⣽⡿⣮⡷⣽⢵⣻⣽⡷⣟⠊⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠙⠿⣾⡿⣷⣟⣷⣟⡷⣟⣷⡂⠡⠀⡂⠄⡈⠄⠡⢡⢱⣟⡷⣝⣵⢽⣺⣽⢷⡻⠝⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⡐⣿⣿⣯⢳⢹⢛⢛⠓⠅⠅⢂⠐⡀⡂⠌⠌⡂⠕⡛⠟⢛⢺⣿⢿⠕⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⢐⠵⣿⣯⠪⡊⢆⢂⢌⢄⢅⣐⢐⢠⢂⢡⢐⡀⡂⡄⡂⡀⠈⣾⡻⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⢭⢻⣯⢣⠱⡡⡃⣊⠢⡑⢄⢃⢑⠌⡐⡐⢈⠠⠐⠀⠀⠂⡸⠀⢀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠈⢎⢽⢪⢊⢆⢪⢐⡑⢌⠢⡂⢅⢂⠢⠐⠠⠀⠂⡀⢁⠀⢂⢈⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠣⢣⡪⡢⡣⡪⡪⢌⢆⢕⢢⡑⡅⡅⡅⡅⡔⡠⠂⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⡀⢀⠀⡀⡀⡀⡀⣄⣦⡶⣟⣿⣻⣾⣾⡇⡃⠍⡊⡊⣾⢾⣷⣻⣞⠎⣔⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⢁⠐⠠⢁⢂⢂⠂⢗⢽⢿⢍⢇⢭⣻⢯⡗⡍⡦⣣⢲⢜⣎⢣⡻⡯⡮⡨⢸⢷⢱⠀⡀⠀⠀⠀⠀⠀⠀
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠂⠈⠈⠄⠁⠌⠈⠨⠈⠐⠈⠈⠐⠀⠡⠈⠨⠈⠈⠐⠐⠀⠂⠀⠁⠈⠀⠀⠀⠀
|
||||||
|
|
||||||
|
This installer does all the steps described in the ISPmail tutorial from
|
||||||
|
https://workaround.org to turn your bare Debian 13/Trixie installation into a
|
||||||
|
mail server.
|
||||||
|
|
||||||
|
It will install software packages and alter your system configuration. Do not
|
||||||
|
run it on a server that is currently used in production. This installer is
|
||||||
|
meant to help you set up multiple servers without going through the ISPmail
|
||||||
|
guide time and again. It will not read the ISPmail guide for you.
|
||||||
|
|
||||||
|
Enter to continue. CTRL-C to abort.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
############# Packages ###############
|
||||||
|
|
||||||
|
apt_install() {
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -qq \
|
||||||
|
postfix-mysql dovecot-mysql \
|
||||||
|
dovecot-imapd dovecot-lmtpd dovecot-managesieved \
|
||||||
|
apache2 python3-certbot-apache libapache2-mod-php \
|
||||||
|
php-intl php-mbstring php-xml unzip certbot \
|
||||||
|
roundcube-mysql roundcube roundcube-plugins swaks libnet-ssleay-perl \
|
||||||
|
mutt unattended-upgrades mariadb-server \
|
||||||
|
rspamd redis-server opendkim-tools bind9-dnsutils pwgen curl
|
||||||
|
}
|
||||||
|
|
||||||
|
############# MariaDB ###############
|
||||||
|
|
||||||
|
init_mariadb_schema() {
|
||||||
|
mariadb <<'EOT'
|
||||||
|
create database if not exists mailserver;
|
||||||
|
grant all privileges on mailserver.* to 'mailadmin'@'localhost' identified by 'MAILADMIN-PASSWORD-HERE';
|
||||||
|
grant select on mailserver.* to 'mailserver'@'127.0.0.1' identified by 'MAILSERVER-PASSWORD-HERE';
|
||||||
|
|
||||||
|
USE mailserver;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `virtual_domains` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`name` varchar(50) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY (`name`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `virtual_aliases` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`domain_id` int(11) NOT NULL,
|
||||||
|
`source` varchar(100) NOT NULL,
|
||||||
|
`destination` varchar(100) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `virtual_users` (
|
||||||
|
`id` int(11) NOT NULL auto_increment,
|
||||||
|
`domain_id` int(11) NOT NULL,
|
||||||
|
`email` varchar(100) NOT NULL,
|
||||||
|
`password` varchar(150) NOT NULL,
|
||||||
|
`quota` bigint(11) NOT NULL DEFAULT 0,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `email` (`email`),
|
||||||
|
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
REPLACE INTO virtual_domains
|
||||||
|
(id, name)
|
||||||
|
VALUES (10,'example.org');
|
||||||
|
|
||||||
|
REPLACE INTO virtual_users
|
||||||
|
(id, domain_id, password, email)
|
||||||
|
VALUES (
|
||||||
|
1,
|
||||||
|
10,
|
||||||
|
'{BLF-CRYPT}$2y$05$.WedBCNZiwxY1CG3aleIleu6lYjup2CIg0BP4M4YCZsO204Czz07W',
|
||||||
|
'john@example.org');
|
||||||
|
|
||||||
|
REPLACE INTO virtual_aliases
|
||||||
|
(id, domain_id, source, destination)
|
||||||
|
VALUES (
|
||||||
|
1,
|
||||||
|
10,
|
||||||
|
'jack@example.org',
|
||||||
|
'john@example.org');
|
||||||
|
EOT
|
||||||
|
|
||||||
|
echo "✅ Database ready. Schema is set up."
|
||||||
|
}
|
||||||
|
|
||||||
|
############# Certbot ###############
|
||||||
|
|
||||||
|
certbot_config() {
|
||||||
|
# Certbot renewal
|
||||||
|
cat > /etc/letsencrypt/cli.ini << 'EOF'
|
||||||
|
# Restart services after renewing a certificate
|
||||||
|
post-hook = systemctl reload postfix dovecot apache2
|
||||||
|
|
||||||
|
# Because we are using logrotate for greater flexibility, disable the
|
||||||
|
# internal certbot logrotation.
|
||||||
|
max-log-backups = 0
|
||||||
|
|
||||||
|
# Adjust interactive output regarding automated renewal
|
||||||
|
preconfigured-renewal = True
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
############# Postfix ###############
|
||||||
|
|
||||||
|
postfix_config() {
|
||||||
|
cat > /etc/postfix/mariadb-virtual-mailbox-domains.cf << EOF
|
||||||
|
user = mailserver
|
||||||
|
password = MAILSERVER-PASSWORD-HERE
|
||||||
|
hosts = 127.0.0.1
|
||||||
|
dbname = mailserver
|
||||||
|
query = SELECT 1 FROM virtual_domains WHERE name='%s'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/postfix/mariadb-virtual-alias-maps.cf << EOF
|
||||||
|
user = mailserver
|
||||||
|
password = MAILSERVER-PASSWORD-HERE
|
||||||
|
hosts = 127.0.0.1
|
||||||
|
dbname = mailserver
|
||||||
|
query = SELECT destination FROM virtual_aliases WHERE source='%s'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/postfix/mariadb-virtual-mailbox-maps.cf << EOF
|
||||||
|
user = mailserver
|
||||||
|
password = MAILSERVER-PASSWORD-HERE
|
||||||
|
hosts = 127.0.0.1
|
||||||
|
dbname = mailserver
|
||||||
|
query = SELECT 1 FROM virtual_users WHERE email='%s'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
postconf virtual_mailbox_domains=mysql:/etc/postfix/mariadb-virtual-mailbox-domains.cf
|
||||||
|
postconf virtual_mailbox_maps=mysql:/etc/postfix/mariadb-virtual-mailbox-maps.cf
|
||||||
|
postconf virtual_alias_maps=mysql:/etc/postfix/mariadb-virtual-alias-maps.cf
|
||||||
|
|
||||||
|
chown root:postfix /etc/postfix/mariadb-*.cf
|
||||||
|
chmod o= /etc/postfix/mariadb-*.cf
|
||||||
|
|
||||||
|
# Postfix check
|
||||||
|
RES=$(postmap -q example.org mysql:/etc/postfix/mariadb-virtual-mailbox-domains.cf)
|
||||||
|
if [[ $RES -ne 1 ]]; then
|
||||||
|
echo "❌ The mariadb-virtual-mailbox-domains.cf mapping failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
RES=$(postmap -q jack@example.org mysql:/etc/postfix/mariadb-virtual-alias-maps.cf)
|
||||||
|
if [[ $RES != 'john@example.org' ]]; then
|
||||||
|
echo "❌ The mariadb-virtual-alias-maps.cf mapping failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
RES=$(postmap -q john@example.org mysql:/etc/postfix/mariadb-virtual-mailbox-maps.cf)
|
||||||
|
if [[ $RES -ne 1 ]]; then
|
||||||
|
echo "❌ The mariadb-virtual-mailbox-maps.cf mapping failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Mappings work."
|
||||||
|
}
|
||||||
|
|
||||||
|
############# Dovecot ###############
|
||||||
|
|
||||||
|
dovecot_config() {
|
||||||
|
groupadd -f --system vmail
|
||||||
|
id -a vmail 2>/dev/null >/dev/null || useradd --system --gid vmail vmail
|
||||||
|
mkdir -p /var/vmail
|
||||||
|
chown -R vmail:vmail /var/vmail
|
||||||
|
chmod u=rwx,g=rx,o= /var/vmail
|
||||||
|
|
||||||
|
sed -i '/!include/s/^/#/' /etc/dovecot/conf.d/10-auth.conf
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-mail.conf << EOF
|
||||||
|
mail_driver = maildir
|
||||||
|
mail_home = /var/vmail/%{user | domain}/%{user | username}
|
||||||
|
mail_path = ~/Maildir
|
||||||
|
mail_uid = vmail
|
||||||
|
mail_gid = vmail
|
||||||
|
mail_inbox_path = ~/Maildir/
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-master.conf << EOF
|
||||||
|
service auth {
|
||||||
|
unix_listener /var/spool/postfix/private/dovecot-auth {
|
||||||
|
mode = 0660
|
||||||
|
user = postfix
|
||||||
|
group = postfix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-ssl.conf << EOF
|
||||||
|
ssl = required
|
||||||
|
ssl_server_cert_file = /etc/letsencrypt/live/$FQDN/fullchain.pem
|
||||||
|
ssl_server_key_file = /etc/letsencrypt/live/$FQDN/privkey.pem
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-lmtp-username-format.conf << EOF
|
||||||
|
protocol lmtp {
|
||||||
|
auth_username_format =
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-sql.conf << EOF
|
||||||
|
sql_driver = mysql
|
||||||
|
|
||||||
|
mysql /var/run/mysqld/mysqld.sock {
|
||||||
|
user = mailserver
|
||||||
|
password = 'MAILSERVER-PASSWORD-HERE'
|
||||||
|
dbname = mailserver
|
||||||
|
host = 127.0.0.1
|
||||||
|
}
|
||||||
|
|
||||||
|
userdb sql {
|
||||||
|
query = SELECT email as user FROM virtual_users WHERE email='%{user}'
|
||||||
|
iterate_query = SELECT email as user FROM virtual_users
|
||||||
|
}
|
||||||
|
|
||||||
|
passdb sql {
|
||||||
|
query = SELECT password FROM virtual_users where email='%{user}'
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# fix permissions
|
||||||
|
chown root:root /etc/dovecot/conf.d/99-ispmail-sql.conf
|
||||||
|
chmod go= /etc/dovecot/conf.d/99-ispmail-sql.conf
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-managesieve.conf << EOF
|
||||||
|
service managesieve-login {
|
||||||
|
# Listen only on localhost
|
||||||
|
inet_listener sieve {
|
||||||
|
listen= 127.0.0.1
|
||||||
|
port = 4190
|
||||||
|
}
|
||||||
|
|
||||||
|
# Disable the deprecated listener
|
||||||
|
inet_listener sieve_deprecated {
|
||||||
|
port = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl restart dovecot
|
||||||
|
|
||||||
|
# Check if running
|
||||||
|
systemctl is-active --quiet dovecot.service
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Dovecot failed to start properly."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
echo "✅ Dovecot is running fine."
|
||||||
|
|
||||||
|
# Check query
|
||||||
|
JOHNS_MAILDIR=$(doveadm user john@example.org | grep ^mail_path | cut -f2)
|
||||||
|
if [[ $JOHNS_MAILDIR != '/var/vmail/example.org/john/Maildir' ]]; then
|
||||||
|
echo "❌ Could not find John's mail_path."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
echo "✅ Lookup works."
|
||||||
|
}
|
||||||
|
|
||||||
|
############# LMTP ###############
|
||||||
|
|
||||||
|
lmtp_config() {
|
||||||
|
# Add an LMTP listening socket in Dovecot
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-lmtp-listener.conf << EOF
|
||||||
|
service lmtp {
|
||||||
|
# Used internally by Dovecot
|
||||||
|
unix_listener lmtp {
|
||||||
|
}
|
||||||
|
|
||||||
|
# Listen to LMTP connections from Postfix
|
||||||
|
unix_listener /var/spool/postfix/private/dovecot-lmtp {
|
||||||
|
mode = 0600
|
||||||
|
user = postfix
|
||||||
|
group = postfix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Restart Dovecot
|
||||||
|
systemctl restart dovecot
|
||||||
|
|
||||||
|
postconf virtual_transport=lmtp:unix:private/dovecot-lmtp
|
||||||
|
|
||||||
|
# Testing delivery
|
||||||
|
echo Testing email delivery internally.
|
||||||
|
if [[ -d /var/vmail/example.org/john/Maildir/new/ ]]; then
|
||||||
|
rm -f /var/vmail/example.org/john/Maildir/new/*
|
||||||
|
fi
|
||||||
|
swaks --server localhost --to john@example.org --tls --silent
|
||||||
|
|
||||||
|
DELIVERY=0
|
||||||
|
for i in $(seq 1 50); do
|
||||||
|
NUM_FILES=$(ls -1 /var/vmail/example.org/john/Maildir/new/ | wc -l)
|
||||||
|
if [[ $NUM_FILES -eq 1 ]]; then
|
||||||
|
DELIVERY=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 0.2
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $DELIVERY -eq 0 ]]; then
|
||||||
|
echo "❌ Mail delivery to john@example.org failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
echo "✅ Test successful."
|
||||||
|
}
|
||||||
|
|
||||||
|
############ APACHE #############
|
||||||
|
|
||||||
|
apache_config() {
|
||||||
|
cat > /etc/apache2/sites-available/000-default-le-ssl.conf << EOF
|
||||||
|
<VirtualHost *:443>
|
||||||
|
ServerAdmin postmaster@$FQDN
|
||||||
|
ServerName $FQDN
|
||||||
|
DocumentRoot /var/lib/roundcube/public_html
|
||||||
|
|
||||||
|
ErrorLog \${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog \${APACHE_LOG_DIR}/access.log combined
|
||||||
|
|
||||||
|
SSLCertificateFile /etc/letsencrypt/live/$FQDN/fullchain.pem
|
||||||
|
SSLCertificateKeyFile /etc/letsencrypt/live/$FQDN/privkey.pem
|
||||||
|
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||||
|
Include /etc/roundcube/apache.conf
|
||||||
|
|
||||||
|
<Location /rspamd>
|
||||||
|
Require all granted
|
||||||
|
</Location>
|
||||||
|
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/rspamd$ /rspamd/ [R,L]
|
||||||
|
RewriteRule ^/rspamd/(.*) http://localhost:11334/\$1 [P,L]
|
||||||
|
</VirtualHost>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Enable the required Apache modules
|
||||||
|
a2enmod proxy_http -q
|
||||||
|
a2enmod rewrite -q
|
||||||
|
|
||||||
|
# Restart Apache
|
||||||
|
systemctl restart apache2
|
||||||
|
# Check if running
|
||||||
|
systemctl is-active --quiet apache2.service
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Apache has not started properly."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
echo "✅ Apache is running fine."
|
||||||
|
|
||||||
|
# Set imap_host and smtp_host in /etc/roundcube/config.inc.php
|
||||||
|
sed -i "s|^\s*\$config\['imap_host'\]\s*=.*|\$config['imap_host'] = 'tls://$FQDN:143';|" /etc/roundcube/config.inc.php
|
||||||
|
sed -i "s|^\s*\$config\['smtp_host'\]\s*=.*|\$config['smtp_host'] = 'tls://$FQDN:587';|" /etc/roundcube/config.inc.php
|
||||||
|
|
||||||
|
# Check if web interface is loading
|
||||||
|
curl -s https://$FQDN | grep title | grep -q "Roundcube Webmail"
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Webmail interface is not reachable at https://$FQDN"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Relaying #############
|
||||||
|
|
||||||
|
relaying_setup() {
|
||||||
|
postconf -M submission/inet="submission inet n - y - - smtpd"
|
||||||
|
postconf -P "submission/inet/syslog_name=postfix/submission"
|
||||||
|
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
|
||||||
|
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
|
||||||
|
postconf -P "submission/inet/smtpd_sasl_type=dovecot"
|
||||||
|
postconf -P "submission/inet/smtpd_sasl_path=private/dovecot-auth"
|
||||||
|
postconf -P "submission/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject"
|
||||||
|
postconf -P "submission/inet/smtpd_sender_restrictions=reject_sender_login_mismatch,permit_sasl_authenticated,reject"
|
||||||
|
|
||||||
|
postconf -M submissions/inet="submissions inet n - y - - smtpd"
|
||||||
|
postconf -P "submissions/inet/syslog_name=postfix/submissions"
|
||||||
|
postconf -P "submissions/inet/smtpd_tls_wrappermode=yes"
|
||||||
|
postconf -P "submissions/inet/smtpd_sasl_auth_enable=yes"
|
||||||
|
postconf -P "submissions/inet/smtpd_sasl_type=dovecot"
|
||||||
|
postconf -P "submissions/inet/smtpd_sasl_path=private/dovecot-auth"
|
||||||
|
postconf -P "submissions/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject"
|
||||||
|
postconf -P "submissions/inet/smtpd_sender_restrictions=reject_sender_login_mismatch,permit_sasl_authenticated,reject"
|
||||||
|
|
||||||
|
postfix reload 2>/dev/null
|
||||||
|
|
||||||
|
postconf smtp_tls_security_level=encrypt
|
||||||
|
postconf smtpd_tls_security_level=encrypt
|
||||||
|
postconf smtp_tls_mandatory_protocols=">=TLSv1.2"
|
||||||
|
postconf smtpd_tls_mandatory_protocols=">=TLSv1.2"
|
||||||
|
postconf smtp_tls_mandatory_ciphers=high
|
||||||
|
postconf smtpd_tls_mandatory_ciphers=high
|
||||||
|
postconf smtpd_tls_cert_file=/etc/letsencrypt/live/$FQDN/fullchain.pem
|
||||||
|
postconf smtpd_tls_key_file=/etc/letsencrypt/live/$FQDN/privkey.pem
|
||||||
|
|
||||||
|
# Create a mapping configuration from the user to themself
|
||||||
|
cat > /etc/postfix/mariadb-email2email.cf << EOF
|
||||||
|
user = mailserver
|
||||||
|
password = MAILSERVER-PASSWORD-HERE
|
||||||
|
hosts = 127.0.0.1
|
||||||
|
dbname = mailserver
|
||||||
|
query = SELECT email FROM virtual_users WHERE email='%s'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Fix permissions
|
||||||
|
chown root:postfix /etc/postfix/mariadb-email2email.cf
|
||||||
|
chmod u=rw,g=r,o= /etc/postfix/mariadb-email2email.cf
|
||||||
|
|
||||||
|
# Tell Postfix to use this mapping
|
||||||
|
postconf smtpd_sender_login_maps=mysql:/etc/postfix/mariadb-email2email.cf
|
||||||
|
|
||||||
|
# Test spoofing
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:587 \
|
||||||
|
--from brunhilde@example.org \
|
||||||
|
--to list@example.com \
|
||||||
|
--tls \
|
||||||
|
--auth-user john@example.org \
|
||||||
|
--auth-password summersun \
|
||||||
|
--silent 3
|
||||||
|
|
||||||
|
if [[ $? -ne 24 ]]; then
|
||||||
|
echo "❌ Forged sender spoofing test failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Forged sender spoofing successfully rejected."
|
||||||
|
|
||||||
|
# Test with proper email
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:587 \
|
||||||
|
--from john@example.org \
|
||||||
|
--to list@example.com \
|
||||||
|
--tls \
|
||||||
|
--auth-user john@example.org \
|
||||||
|
--auth-password summersun \
|
||||||
|
--silent 3
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Relaying of proper email failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Relay test okay."
|
||||||
|
|
||||||
|
# Submission plaintext test
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:587 \
|
||||||
|
--from john@example.org \
|
||||||
|
--to lisa@example.com \
|
||||||
|
--silent 3
|
||||||
|
if [[ $? -ne 23 ]]; then
|
||||||
|
echo "❌ Relaying over submission without STARTTLS was accepted."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Plaintext auth refused via submission port."
|
||||||
|
|
||||||
|
# Submission encryption but no auth test
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:587 \
|
||||||
|
--from john@example.org \
|
||||||
|
--to lisa@example.com \
|
||||||
|
-tls \
|
||||||
|
--silent 3
|
||||||
|
if [[ $? -ne 24 ]]; then
|
||||||
|
echo "❌ Relaying over submission with STARTTLS but without auth was accepted."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Encrypted non-auth refused via submission port."
|
||||||
|
|
||||||
|
# Test encryption and auth over submission
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:587 \
|
||||||
|
--from john@example.org \
|
||||||
|
--to lisa@example.com \
|
||||||
|
-tls \
|
||||||
|
--auth-user john@example.org \
|
||||||
|
--auth-password summersun \
|
||||||
|
--silent 3
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Relaying over submission with STARTTLS and auth failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Encrypted and authenticated relaying over submission works."
|
||||||
|
|
||||||
|
# Test encryption and auth over submissions
|
||||||
|
set +e
|
||||||
|
swaks --server localhost:465 \
|
||||||
|
--from john@example.org \
|
||||||
|
--to lisa@example.com \
|
||||||
|
--tls-on-connect \
|
||||||
|
--auth-user john@example.org \
|
||||||
|
--auth-password summersun \
|
||||||
|
--silent 3
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ Relaying over submissions with STARTTLS and auth failed."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Encrypted and authenticated relaying over submissions works."
|
||||||
|
}
|
||||||
|
|
||||||
|
############ IMAP ##############
|
||||||
|
|
||||||
|
imap_test() {
|
||||||
|
# Test IMAP access
|
||||||
|
apt-get -qq install fetchmail
|
||||||
|
cat > ~/.fetchmailrc <<EOF
|
||||||
|
poll "$FQDN" proto IMAP
|
||||||
|
user "john@example.org" there with password "summersun"
|
||||||
|
EOF
|
||||||
|
set +e
|
||||||
|
fetchmail --check -s 2>/dev/null
|
||||||
|
rm ~/.fetchmailrc
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "❌ IMAP connection failed"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ IMAP connection test successful."
|
||||||
|
}
|
||||||
|
|
||||||
|
############ rspamd #############
|
||||||
|
|
||||||
|
rspamd_config() {
|
||||||
|
postconf smtpd_milters=inet:127.0.0.1:11332
|
||||||
|
postconf non_smtpd_milters=inet:127.0.0.1:11332
|
||||||
|
postconf inet_protocols=all
|
||||||
|
systemctl restart postfix
|
||||||
|
|
||||||
|
cat > /tmp/gtube.txt <<EOF
|
||||||
|
This is the GTUBE, the
|
||||||
|
Generic
|
||||||
|
Test for
|
||||||
|
Unsolicited
|
||||||
|
Bulk
|
||||||
|
Email
|
||||||
|
|
||||||
|
If your spam filter supports it, the GTUBE provides a test by which you
|
||||||
|
can verify that the filter is installed correctly and is detecting incoming
|
||||||
|
spam. You can send yourself a test mail containing the following string of
|
||||||
|
characters (in upper case and with no white spaces and line breaks):
|
||||||
|
|
||||||
|
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
|
||||||
|
EOF
|
||||||
|
|
||||||
|
set +e
|
||||||
|
swaks --server $FQDN:25 \
|
||||||
|
--from lisa@example.com \
|
||||||
|
--to john@example.org \
|
||||||
|
-tls \
|
||||||
|
--body @/tmp/gtube.txt \
|
||||||
|
--silent 3
|
||||||
|
if [[ $? -ne 26 ]]; then
|
||||||
|
echo "❌ GTUBE spam test pattern was not rejected"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ GTUBE spam test was rejected successfully."
|
||||||
|
|
||||||
|
# Add learning scripts
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-sieve-movetojunk.conf << 'EOF'
|
||||||
|
sieve_script spam-to-junk-folder {
|
||||||
|
driver = file
|
||||||
|
type = after
|
||||||
|
path = /etc/dovecot/sieve/spam-to-junk-folder.sieve
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enable the execution of Sieve rules when Postfix sends an email to Dovecot over LMTP
|
||||||
|
protocol lmtp {
|
||||||
|
mail_plugins {
|
||||||
|
sieve = yes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make sure that every user has a Junk folder and is subscribed to it
|
||||||
|
namespace inbox {
|
||||||
|
mailbox Junk {
|
||||||
|
special_use = \Junk
|
||||||
|
auto = subscribe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Restart Dovecot
|
||||||
|
systemctl reload dovecot
|
||||||
|
|
||||||
|
# Create the directory for Sieve files
|
||||||
|
mkdir -p /etc/dovecot/sieve
|
||||||
|
|
||||||
|
# Create the Sieve script to move Spam mails to the user's Junk folder
|
||||||
|
cat > /etc/dovecot/sieve/spam-to-junk-folder.sieve << 'EOF'
|
||||||
|
require ["fileinto"];
|
||||||
|
|
||||||
|
if header :contains "X-Spam" "Yes" {
|
||||||
|
fileinto "Junk";
|
||||||
|
stop;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Make the sieve script machine-readable
|
||||||
|
sievec /etc/dovecot/sieve/spam-to-junk-folder.sieve 2>/dev/null
|
||||||
|
|
||||||
|
# Create a config file to enable automatic spam training
|
||||||
|
cat > /etc/rspamd/local.d/classifier-bayes.conf << 'EOF'
|
||||||
|
# Store training data in the Redis database
|
||||||
|
servers = "127.0.0.1:6379";
|
||||||
|
backend = "redis";
|
||||||
|
|
||||||
|
# Enable automatic training
|
||||||
|
autolearn = true; # if rspamd is sure that an email is spam, it will be learned
|
||||||
|
min_learns = 200; # do not trust the data before at least 200 mails have been learned
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Restart rspamd
|
||||||
|
#systemctl restart rspamd
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-imapsieve.conf << 'EOF'
|
||||||
|
# Enable the imap_sieve plugin
|
||||||
|
protocol imap {
|
||||||
|
mail_plugins {
|
||||||
|
imap_sieve = yes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Allow the use of the pipe plugin to send mails to shell scripts
|
||||||
|
sieve_plugins {
|
||||||
|
sieve_extprograms = yes
|
||||||
|
sieve_imapsieve = yes
|
||||||
|
}
|
||||||
|
|
||||||
|
sieve_global_extensions {
|
||||||
|
vnd.dovecot.pipe = yes
|
||||||
|
}
|
||||||
|
|
||||||
|
# Where to look for Sieve scripts that use the Pipe functionality
|
||||||
|
sieve_pipe_bin_dir = /etc/dovecot/sieve
|
||||||
|
|
||||||
|
# Moved into Junk? -> Learn as spam.
|
||||||
|
mailbox Junk {
|
||||||
|
sieve_script spam {
|
||||||
|
type = before
|
||||||
|
cause = copy
|
||||||
|
path = /etc/dovecot/sieve/learn-spam.sieve
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Moved out of Junk? -> Learn as ham.
|
||||||
|
imapsieve_from Junk {
|
||||||
|
sieve_script ham {
|
||||||
|
type = before
|
||||||
|
cause = copy
|
||||||
|
path = /etc/dovecot/sieve/learn-ham.sieve
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Create spam learning script
|
||||||
|
cat > /etc/dovecot/sieve/learn-spam.sieve << 'EOF'
|
||||||
|
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
|
||||||
|
pipe :copy "rspamd-learn-spam.sh";
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Create ham learning script
|
||||||
|
cat > /etc/dovecot/sieve/learn-ham.sieve << 'EOF'
|
||||||
|
require ["vnd.dovecot.pipe", "copy", "imapsieve", "variables"];
|
||||||
|
pipe :copy "rspamd-learn-ham.sh";
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Compile the Sieve scripts
|
||||||
|
systemctl reload dovecot
|
||||||
|
sievec /etc/dovecot/sieve/learn-spam.sieve 2>/dev/null
|
||||||
|
sievec /etc/dovecot/sieve/learn-ham.sieve 2>/dev/null
|
||||||
|
|
||||||
|
# Fix permissions
|
||||||
|
chmod u=rw,go= /etc/dovecot/sieve/learn-{spam,ham}.{sieve,svbin}
|
||||||
|
chown vmail:vmail /etc/dovecot/sieve/learn-{spam,ham}.{sieve,svbin}
|
||||||
|
|
||||||
|
# Create the shell script for learning spam
|
||||||
|
cat > /etc/dovecot/sieve/rspamd-learn-spam.sh << 'EOF'
|
||||||
|
#!/bin/sh
|
||||||
|
# Receives an email from Dovecot's Sieve script and pipe it into rspamc
|
||||||
|
exec /usr/bin/rspamc learn_spam
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Create the shell script for learning ham
|
||||||
|
cat > /etc/dovecot/sieve/rspamd-learn-ham.sh << 'EOF'
|
||||||
|
#!/bin/sh
|
||||||
|
# Receives an email from Dovecot's Sieve script and pipe it into rspamc
|
||||||
|
exec /usr/bin/rspamc learn_ham
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Fix permissions of the shell scripts
|
||||||
|
chmod u=rwx,go= /etc/dovecot/sieve/rspamd-learn-{spam,ham}.sh
|
||||||
|
chown vmail:vmail /etc/dovecot/sieve/rspamd-learn-{spam,ham}.sh
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-sieve-debug.conf << 'EOF'
|
||||||
|
# Enable detailed logging of Sieve scripts
|
||||||
|
log_debug=category=sieve
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-autoexpunge.conf << 'EOF'
|
||||||
|
# Remove mails from the Junk and Trash folders after 30 days
|
||||||
|
mailbox Junk {
|
||||||
|
special_use = \Junk
|
||||||
|
auto = subscribe
|
||||||
|
mailbox_autoexpunge = 30d
|
||||||
|
}
|
||||||
|
mailbox Trash {
|
||||||
|
special_use = \Trash
|
||||||
|
auto = subscribe
|
||||||
|
mailbox_autoexpunge = 30d
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make expunging more efficient
|
||||||
|
mailbox_list_index = yes
|
||||||
|
mail_always_cache_fields = date.save
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Restart Dovecot
|
||||||
|
systemctl restart dovecot
|
||||||
|
|
||||||
|
# Generate a random password that is 15 characters long
|
||||||
|
RSPAMD_PW=$(pwgen 15 1)
|
||||||
|
|
||||||
|
# Create a hash of that password
|
||||||
|
HASH=$(rspamadm pw -p $RSPAMD_PW)
|
||||||
|
|
||||||
|
# Add the hashed password to rspamd's configuration
|
||||||
|
echo "password = \"$HASH\"" > /etc/rspamd/local.d/worker-controller.inc
|
||||||
|
|
||||||
|
# Restart rspamd
|
||||||
|
systemctl reload rspamd
|
||||||
|
|
||||||
|
echo "✅ rspamd set up"
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Show summary at the end #############
|
||||||
|
|
||||||
|
dkim_config() {
|
||||||
|
postconf smtpd_milters=inet:127.0.0.1:11332
|
||||||
|
postconf non_smtpd_milters=inet:127.0.0.1:11332
|
||||||
|
|
||||||
|
# Create the directory
|
||||||
|
mkdir -p /var/lib/rspamd/dkim
|
||||||
|
|
||||||
|
# Fix permissions
|
||||||
|
chown _rspamd:_rspamd /var/lib/rspamd/dkim
|
||||||
|
|
||||||
|
# Tell rspamd to look up selectors in our mapping file
|
||||||
|
cat > /etc/rspamd/local.d/dkim_signing.conf << 'EOF'
|
||||||
|
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
|
||||||
|
selector_map = "/etc/rspamd/dkim_selectors.map";
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# TODO: create a key for $FQDN and test it
|
||||||
|
|
||||||
|
# Restart rspamd
|
||||||
|
systemctl restart rspamd
|
||||||
|
|
||||||
|
echo "✅ DKIM signing ready to use"
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Catch-all aliases #############
|
||||||
|
|
||||||
|
catchall_config() {
|
||||||
|
# Create the john-to-himself mapping
|
||||||
|
cat > /etc/postfix/mariadb-email2email.cf << EOF
|
||||||
|
user = mailserver
|
||||||
|
password = MAILSERVER-PASSWORD-HERE
|
||||||
|
hosts = 127.0.0.1
|
||||||
|
dbname = mailserver
|
||||||
|
query = SELECT email FROM virtual_users WHERE email='%s'
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Fix the permissions of that file
|
||||||
|
chgrp postfix /etc/postfix/mariadb-*.cf
|
||||||
|
chmod u=rw,g=r,o= /etc/postfix/mariadb-*.cf
|
||||||
|
|
||||||
|
# Add the new mapping to the virtual_alias_maps
|
||||||
|
# (The order is not important. Postfix will check all mapping files.)
|
||||||
|
postconf virtual_alias_maps=mysql:/etc/postfix/mariadb-virtual-alias-maps.cf,mysql:/etc/postfix/mariadb-email2email.cf
|
||||||
|
|
||||||
|
result=$(postmap -q john@example.org mysql:/etc/postfix/mariadb-email2email.cf)
|
||||||
|
|
||||||
|
if [[ $result != "john@example.org" ]]; then
|
||||||
|
echo "❌ email2email mapping for catch-all aliases do not work properly"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
echo "✅ Catch-all aliases ready to use."
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Going-live #############
|
||||||
|
|
||||||
|
going_live() {
|
||||||
|
# Create two random passwords
|
||||||
|
PW_MAILADMIN=$(pwgen -s 32 1)
|
||||||
|
PW_MAILSERVER=$(pwgen -s 32 1)
|
||||||
|
|
||||||
|
# Replace the dummy passwords
|
||||||
|
sed -i "s|MAILADMIN-PASSWORD-HERE|$PW_MAILADMIN|g" /etc/roundcube/plugins/password/config.inc.php
|
||||||
|
|
||||||
|
sed -i "s|MAILSERVER-PASSWORD-HERE|$PW_MAILSERVER|g" \
|
||||||
|
/etc/dovecot/conf.d/99-ispmail-sql.conf \
|
||||||
|
/etc/postfix/mariadb-virtual-mailbox-maps.cf \
|
||||||
|
/etc/postfix/mariadb-virtual-mailbox-domains.cf \
|
||||||
|
/etc/postfix/mariadb-virtual-alias-maps.cf \
|
||||||
|
/etc/postfix/mariadb-email2email.cf
|
||||||
|
|
||||||
|
# Restart the services
|
||||||
|
systemctl restart postfix dovecot
|
||||||
|
|
||||||
|
# Update MariaDB user passwords
|
||||||
|
mariadb <<EOF
|
||||||
|
ALTER USER 'mailadmin'@'localhost' IDENTIFIED BY '${PW_MAILADMIN}';
|
||||||
|
ALTER USER 'mailserver'@'127.0.0.1' IDENTIFIED BY '${PW_MAILSERVER}';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "✅ Dummy passwords changed."
|
||||||
|
# TODO: remove example.org
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Show summary at the end #############
|
||||||
|
|
||||||
|
show_passwords() {
|
||||||
|
echo "============================================================="
|
||||||
|
echo " PLEASE NOTE:"
|
||||||
|
echo "============================================================="
|
||||||
|
echo
|
||||||
|
echo "Web mail URL: https://$FQDN"
|
||||||
|
echo
|
||||||
|
echo "rspamd web interface URL: https://$FQDN/rspamd"
|
||||||
|
echo "rspamd web interface password: $RSPAMD_PW"
|
||||||
|
echo "Database passwords:"
|
||||||
|
echo "mailadmin password: $PW_MAILADMIN"
|
||||||
|
echo "mailserver password: $PW_MAILSERVER"
|
||||||
|
echo
|
||||||
|
echo "============================================================="
|
||||||
|
echo "Your mail server is now ready to be used. Now it is time to"
|
||||||
|
echo "add your domains, users and aliases to the database."
|
||||||
|
echo "Set up DNS records and DKIM keys."
|
||||||
|
echo "Details are found in the ISPmail guide at https://workaround.org"
|
||||||
|
echo
|
||||||
|
echo "Please report bugs at https://github.com/Signum/ispmail-workaround-org/issues"
|
||||||
|
}
|
||||||
|
|
||||||
|
############ Banner helper #############
|
||||||
|
|
||||||
|
banner() {
|
||||||
|
echo ---------------------------------------------
|
||||||
|
echo --- $1
|
||||||
|
echo ---------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
############ MAIN #############
|
||||||
|
|
||||||
|
pre_flight
|
||||||
|
intro
|
||||||
|
read
|
||||||
|
|
||||||
|
banner "Installing packages"
|
||||||
|
apt_install
|
||||||
|
|
||||||
|
banner "Preparing database schema"
|
||||||
|
init_mariadb_schema
|
||||||
|
|
||||||
|
if [[ ! -d "/etc/letsencrypt/live/$FQDN" ]]; then
|
||||||
|
banner "Getting certificate from Let's Encrypt"
|
||||||
|
certbot --apache --register-unsafely-without-email --agree-tos -d $FQDN
|
||||||
|
fi
|
||||||
|
|
||||||
|
certbot_config
|
||||||
|
|
||||||
|
banner "Configuring Postfix"
|
||||||
|
postfix_config
|
||||||
|
|
||||||
|
banner "Configuring Dovecot"
|
||||||
|
dovecot_config
|
||||||
|
|
||||||
|
banner "Testing IMAP"
|
||||||
|
imap_test
|
||||||
|
|
||||||
|
banner "Configuring LMTP"
|
||||||
|
lmtp_config
|
||||||
|
|
||||||
|
banner "Configuring Apache and Roundcube"
|
||||||
|
apache_config
|
||||||
|
|
||||||
|
banner "Configuring relaying"
|
||||||
|
relaying_setup
|
||||||
|
|
||||||
|
banner "Configuring rspamd"
|
||||||
|
rspamd_config
|
||||||
|
|
||||||
|
banner "Preparing DKIM signing"
|
||||||
|
dkim_config
|
||||||
|
|
||||||
|
banner "Setting up catch-all aliases"
|
||||||
|
catchall_config
|
||||||
|
|
||||||
|
banner "Final steps – changing dummy passwords"
|
||||||
|
going_live
|
||||||
|
|
||||||
|
show_passwords
|
||||||
|
|
||||||
|
|
@ -16,6 +16,6 @@ import Default from "@astrojs/starlight/components/Footer.astro";
|
||||||
This guide is maintained by <a href="mailto:ispmail@christoph-haas.de">Christoph Haas</a> since 2003. All content on workaround.org can be used under the terms of
|
This guide is maintained by <a href="mailto:ispmail@christoph-haas.de">Christoph Haas</a> since 2003. All content on workaround.org can be used under the terms of
|
||||||
the
|
the
|
||||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">Creative Commons BY-NC-SA license</a>.
|
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">Creative Commons BY-NC-SA license</a>.
|
||||||
Penguin image based on AI art because I suck at drawing.
|
Penguin image based on AI art because I suck at drawing. <a href="/imprints">Imprints and legal notice.</a>.
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
31
src/content/docs/imprints.mdx
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: Legal Notice / Imprints
|
||||||
|
---
|
||||||
|
|
||||||
|
## Responsible for Content
|
||||||
|
|
||||||
|
```
|
||||||
|
Christoph Haas
|
||||||
|
c/o Online-Impressum.de #5172
|
||||||
|
Europaring 90
|
||||||
|
53757 Sankt Augustin
|
||||||
|
Germany
|
||||||
|
```
|
||||||
|
|
||||||
|
Contact: postmaster@christoph-haas.de or christoph.haas@gmail.com or via
|
||||||
|
[contact form](https://mein.online-impressum.de/workaround-org/)
|
||||||
|
|
||||||
|
## Liability for Content
|
||||||
|
|
||||||
|
As a service provider, I am responsible for my own content on these pages under German law § 7 (1) Telemediengesetz.
|
||||||
|
However, I do not guarantee the accuracy, completeness, or timeliness of the content.
|
||||||
|
|
||||||
|
## Liability for External Links
|
||||||
|
|
||||||
|
This website contains links to external third-party websites over which I have no control. Therefore, I cannot assume
|
||||||
|
any liability for such external content.
|
||||||
|
|
||||||
|
## Open-Source Notice
|
||||||
|
|
||||||
|
The source code of this project is published under an open-source license. Details can be found in the respective
|
||||||
|
repository at https://github.com/Signum/ispmail-workaround-org
|
||||||
|
|
@ -23,7 +23,8 @@ server.
|
||||||
limit is the size of your disk.
|
limit is the size of your disk.
|
||||||
- Have a **webmail** interface so users can access their emails securely from any location using a web browser.
|
- Have a **webmail** interface so users can access their emails securely from any location using a web browser.
|
||||||
- Let your users fetch email using **IMAP** and send email through your servers using **SMTP**.
|
- Let your users fetch email using **IMAP** and send email through your servers using **SMTP**.
|
||||||
- Add automatic cryptographic signatures using DKIM to outgoing emails to prove that you are the owner of your domain.
|
- Add automatic cryptographic signatures using **DKIM** to outgoing emails to prove that you are the owner of your
|
||||||
|
domain.
|
||||||
- Allow users to manage server-based **filter rules**. Distribute incoming emails to different folders. Forward copies.
|
- Allow users to manage server-based **filter rules**. Distribute incoming emails to different folders. Forward copies.
|
||||||
Or send out-of-office notifications.
|
Or send out-of-office notifications.
|
||||||
- Mitigate **brute force** attacks.
|
- Mitigate **brute force** attacks.
|
||||||
|
|
@ -51,9 +52,10 @@ server.
|
||||||
- An **internet domain** (or several) to receive emails for. You need to be able to set A, MX and TXT records for that
|
- An **internet domain** (or several) to receive emails for. You need to be able to set A, MX and TXT records for that
|
||||||
domain. You should also be able to set PTR records for your IP address because some mail servers on the internet
|
domain. You should also be able to set PTR records for your IP address because some mail servers on the internet
|
||||||
require you to have matching forward and reverse DNS records.
|
require you to have matching forward and reverse DNS records.
|
||||||
- **Patience**. We will proceed slowly and after every step ensure that are still on track. Don’t hurry and skip parts
|
- **Patience**. We will proceed slowly and after every step ensure that you are still on track. Don’t hurry and skip
|
||||||
even if they appear confusing at first. If you get lost just submit your question at the bottom of any page throughout
|
parts even if they appear confusing at first. If you get lost just submit your question at the bottom of any page
|
||||||
this guide and help is on the way. Or join the [chat channel](https://riot.im/app/#/room/#ispmail:matrix.org).
|
throughout this guide and help is on the way. Or join the
|
||||||
|
[chat channel](https://riot.im/app/#/room/#ispmail:matrix.org).
|
||||||
|
|
||||||
## What this is not about
|
## What this is not about
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,18 +77,32 @@ mariadb mailserver < mailserver.sql
|
||||||
Obviously any database changes on the old server from now on will have to be done on the new server as well until the
|
Obviously any database changes on the old server from now on will have to be done on the new server as well until the
|
||||||
migration is done.
|
migration is done.
|
||||||
|
|
||||||
|
## Weak password schemes
|
||||||
|
|
||||||
|
Please check if any of your users have hashed passwords that are considered
|
||||||
|
[weak](https://doc.dovecot.org/2.4.2/core/config/auth/schemes.html) by Dovecot. Those passwords using a `PLAIN-MD5`
|
||||||
|
scheme are not accepted by Dovecot by default. But you can enable them again using:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat > 99-ispmail-weak-schemes.conf << EOF
|
||||||
|
auth_allow_weak_schemes = yes
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Your users should change their passwords using Roundcube. That way a new hash with a more secure schema is created.
|
||||||
|
|
||||||
## Roundcube contacts
|
## Roundcube contacts
|
||||||
|
|
||||||
If your users are using Roundcube as a webmail interface then you should migrate their data like their contact lists.
|
If your users are using Roundcube as a webmail interface then you should migrate their data like their contact lists.
|
||||||
Dump the SQL from the old server:
|
Dump the SQL from the old server:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
mariadb-dump roundcube > roundcube.sql
|
mariadb-dump roundcube > roundcube.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
Copy that file to the new server and import it:
|
Copy that file to the new server and import it:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
mariadb roundcube < roundcube.sql
|
mariadb roundcube < roundcube.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -103,7 +117,15 @@ UPDATE users SET mail_host='new.mail.server';
|
||||||
## Migrate rspamd spam training data
|
## Migrate rspamd spam training data
|
||||||
|
|
||||||
If you have been using rspamd with the Redis backend then copy over the Redis database from your previous server.
|
If you have been using rspamd with the Redis backend then copy over the Redis database from your previous server.
|
||||||
Details are found in the rspamd chapter.
|
|
||||||
|
Stop rspamd on both the old and the new server. Then:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rsync -va oldserver:/var/lib/redis/ /var/lib/redis/
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the redis database is started again on the new server, `rspamc stat` should show you that the training data is
|
||||||
|
found.
|
||||||
|
|
||||||
## Migrate the Maildirs hot
|
## Migrate the Maildirs hot
|
||||||
|
|
||||||
|
|
@ -129,9 +151,10 @@ need to copy emails from another server where you only have IMAP access but cann
|
||||||
|
|
||||||
Copy over everything in /etc/letsencrypt and /var/lib/rspamd/dkim from your old to the new server.
|
Copy over everything in /etc/letsencrypt and /var/lib/rspamd/dkim from your old to the new server.
|
||||||
|
|
||||||
```
|
```sh
|
||||||
rsync -va oldserver:/etc/letsencrypt/ /etc/letsencrypt/
|
rsync -va oldserver:/etc/letsencrypt/archive/ /etc/letsencrypt/archive/
|
||||||
rsync -va oldserver:/var/lib/rspamd/dkim/ /var/lib/rspamd/dkim/
|
rsync -va oldserver:/var/lib/rspamd/dkim/ /var/lib/rspamd/dkim/
|
||||||
|
rsync -v oldserver:/etc/rspamd/dkim_selectors.map /etc/rspamd
|
||||||
```
|
```
|
||||||
|
|
||||||
## Downtime
|
## Downtime
|
||||||
|
|
@ -144,7 +167,7 @@ You told your users about the downtime, right? The time has come? Okay. Shut dow
|
||||||
copied consistently.) Let’s synchronize again. *rsync* will only copy those files that have changed which makes it much
|
copied consistently.) Let’s synchronize again. *rsync* will only copy those files that have changed which makes it much
|
||||||
faster than the first sync. On your new server run:
|
faster than the first sync. On your new server run:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
rsync -va --delete oldserver:/var/vmail/ /var/vmail/
|
rsync -va --delete oldserver:/var/vmail/ /var/vmail/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -177,3 +200,13 @@ postconf soft_bounce=no
|
||||||
## Shut down the old server
|
## Shut down the old server
|
||||||
|
|
||||||
If possible do a final backup of the old server. If users are not complaining then dismiss the old system after a week.
|
If possible do a final backup of the old server. If users are not complaining then dismiss the old system after a week.
|
||||||
|
|
||||||
|
## Further issues
|
||||||
|
|
||||||
|
You may see error messages like:
|
||||||
|
|
||||||
|
```
|
||||||
|
Error: sieve: binary /var/vmail/example.org/user/.dovecot.svbin: read: binary stored with different major version 2.0 (!= 3.0; automatically fixed when re-compiled)
|
||||||
|
```
|
||||||
|
|
||||||
|
You may need to run `sievec` on those files.
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ CREATE DATABASE mailserver;
|
||||||
|
|
||||||
## Create the database users
|
## Create the database users
|
||||||
|
|
||||||
In this section you will create the basic database `mailserver` and two users:
|
In this section you will create the basic database called `mailserver` and two users:
|
||||||
|
|
||||||
| User | Permissions | Purpose |
|
| User | Permissions | Purpose |
|
||||||
| :--------- | :---------- | :--------------------------------------------------------- |
|
| :--------- | :---------- | :--------------------------------------------------------- |
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,17 @@ It is important that services that use the certificate load the new certificate
|
||||||
command will create a file `/etc/letsencrypt/cli.ini` that handles it:
|
command will create a file `/etc/letsencrypt/cli.ini` that handles it:
|
||||||
|
|
||||||
```sh title="Run this on your server"
|
```sh title="Run this on your server"
|
||||||
echo > /etc/letsencrypt/cli.ini "post-hook = systemctl reload postfix dovecot apache2"
|
cat > /etc/letsencrypt/cli.ini << 'EOF'
|
||||||
|
# Restart services after renewing a certificate
|
||||||
|
post-hook = systemctl reload postfix dovecot apache2
|
||||||
|
|
||||||
|
# Because we are using logrotate for greater flexibility, disable the
|
||||||
|
# internal certbot logrotation.
|
||||||
|
max-log-backups = 0
|
||||||
|
|
||||||
|
# Adjust interactive output regarding automated renewal
|
||||||
|
preconfigured-renewal = True
|
||||||
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
Perfect. You won't have to worry about the certificate again.
|
Perfect. You won't have to worry about the certificate again.
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ for our purpose.
|
||||||
|
|
||||||
The `/etc/dovecot/conf.d/10-auth.conf` file is dealing with authentication. At the end of this file you will find a list
|
The `/etc/dovecot/conf.d/10-auth.conf` file is dealing with authentication. At the end of this file you will find a list
|
||||||
of authentication backends that Dovecot ships with. By default it will use _system users_ (those from /etc/passwd). But
|
of authentication backends that Dovecot ships with. By default it will use _system users_ (those from /etc/passwd). But
|
||||||
we want to use the MariaDB database backend. Please comment all all include statements:
|
we want to use the MariaDB database backend. Please comment out all include statements:
|
||||||
|
|
||||||
```text title="Edit your /etc/dovecot/conf.d/10-auth.conf"
|
```text title="Edit your /etc/dovecot/conf.d/10-auth.conf"
|
||||||
#!include auth-system.conf.ext
|
#!include auth-system.conf.ext
|
||||||
|
|
@ -113,8 +113,8 @@ to authenticate your users which is relevant later when we set up _relaying_.
|
||||||
Earlier in this guide you created both a key and a certificate file to encrypt the communication with IMAPS and HTTPS
|
Earlier in this guide you created both a key and a certificate file to encrypt the communication with IMAPS and HTTPS
|
||||||
between the users and your mail server. You need to tell Dovecot where to find these files. Also set
|
between the users and your mail server. You need to tell Dovecot where to find these files. Also set
|
||||||
[ssl=required](https://doc.dovecot.org/2.4.1/core/config/ssl.html#how-to-specify-when-ssl-tls-is-required) to prevent
|
[ssl=required](https://doc.dovecot.org/2.4.1/core/config/ssl.html#how-to-specify-when-ssl-tls-is-required) to prevent
|
||||||
that someone sends their password without encryption. Again we will create a new file `99-ispmail-master.conf` to
|
that someone sends their password without encryption. Again we will create a new file `99-ispmail-ssl.conf` to override
|
||||||
override the defaults.
|
the defaults.
|
||||||
|
|
||||||
<Aside type="danger" title="Important">
|
<Aside type="danger" title="Important">
|
||||||
|
|
||||||
|
|
@ -178,6 +178,32 @@ Dovecot can also read the path to a user's home directory and the user-ID and gr
|
||||||
a fixed schema for the home directory (`/var/vmail/DOMAIN/USER`) (as defined by `mail_home`) and the user and group are
|
a fixed schema for the home directory (`/var/vmail/DOMAIN/USER`) (as defined by `mail_home`) and the user and group are
|
||||||
always `vmail` and `vmail`.
|
always `vmail` and `vmail`.
|
||||||
|
|
||||||
|
### 99-ispmail-managesieve.conf
|
||||||
|
|
||||||
|
Later, we will implement server-side automation using **Sieve** rules. By default, Dovecot exposes two TCP ports to the
|
||||||
|
internet: 2000 and 4190. Port 2000 is deprecated anyway and can be safely disabled, while port 4190 is the one we will
|
||||||
|
use. However, unless you have a compelling reason, it is recommended not to make this port publicly accessible. So let
|
||||||
|
us restrict it to the _localhost_ interface:
|
||||||
|
|
||||||
|
```sh title="Run this on your server"
|
||||||
|
cat > /etc/dovecot/conf.d/99-ispmail-managesieve.conf << EOF
|
||||||
|
service managesieve-login {
|
||||||
|
# Listen only on localhost
|
||||||
|
inet_listener sieve {
|
||||||
|
listen= 127.0.0.1
|
||||||
|
port = 4190
|
||||||
|
}
|
||||||
|
|
||||||
|
# Disable the deprecated listener
|
||||||
|
inet_listener sieve_deprecated {
|
||||||
|
port = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
_(Thanks to Thomas Gauweiler for spotting that.)_
|
||||||
|
|
||||||
## Restart and test
|
## Restart and test
|
||||||
|
|
||||||
Restart Dovecot from the shell:
|
Restart Dovecot from the shell:
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ other.
|
||||||
First we need to add a UNIX socket where Dovecot listens for incoming LMTP connections:
|
First we need to add a UNIX socket where Dovecot listens for incoming LMTP connections:
|
||||||
|
|
||||||
```sh title="Run this on your server"
|
```sh title="Run this on your server"
|
||||||
|
# Add an LMTP listening socket in Dovecot
|
||||||
cat > /etc/dovecot/conf.d/99-ispmail-lmtp-listener.conf << EOF
|
cat > /etc/dovecot/conf.d/99-ispmail-lmtp-listener.conf << EOF
|
||||||
service lmtp {
|
service lmtp {
|
||||||
# Used internally by Dovecot
|
# Used internally by Dovecot
|
||||||
|
|
@ -43,6 +44,9 @@ service lmtp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Restart Dovecot
|
||||||
|
systemctl restart dovecot
|
||||||
```
|
```
|
||||||
|
|
||||||
The first `unix_listener lmtp` is just used internally by Dovecot and does not concern us. The second part is what you
|
The first `unix_listener lmtp` is just used internally by Dovecot and does not concern us. The second part is what you
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ There are two directories dealing with virtual hosts:
|
||||||
The actual file containing the configuration lives in _sites-available_. If that configuration should be active, then a
|
The actual file containing the configuration lives in _sites-available_. If that configuration should be active, then a
|
||||||
symbolic link (symlink) is added to the _sites-enabled_ directory pointing to the file in the _sites-available_
|
symbolic link (symlink) is added to the _sites-enabled_ directory pointing to the file in the _sites-available_
|
||||||
directory. That way you can switch sites on and off without deleting the actual configuration file. You can enable a
|
directory. That way you can switch sites on and off without deleting the actual configuration file. You can enable a
|
||||||
site using the `a2enconf` (apache2 enable config) command or disable it using `a2disconf`.
|
site using the `a2ensite` (apache2 enable config) command or disable it using `a2dissite`.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
@ -137,6 +137,7 @@ plugins change it to:
|
||||||
```
|
```
|
||||||
$config['plugins'] = array(
|
$config['plugins'] = array(
|
||||||
'password',
|
'password',
|
||||||
|
'managesieve',
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ submission inet n - y - - smtpd
|
||||||
-o smtpd_tls_security_level=encrypt
|
-o smtpd_tls_security_level=encrypt
|
||||||
-o smtpd_sasl_auth_enable=yes
|
-o smtpd_sasl_auth_enable=yes
|
||||||
-o smtpd_sasl_type=dovecot
|
-o smtpd_sasl_type=dovecot
|
||||||
-o smtpd_sasl_path=private/auth
|
-o smtpd_sasl_path=private/dovecot-auth
|
||||||
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
|
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -143,8 +143,12 @@ Please replace `mail.example.org` by the FQDN you chose.
|
||||||
</Aside>
|
</Aside>
|
||||||
|
|
||||||
```sh title="Run this on your server"
|
```sh title="Run this on your server"
|
||||||
postconf smtp_tls_security_level=may
|
postconf smtp_tls_security_level=encrypt
|
||||||
postconf smtpd_tls_security_level=may
|
postconf smtpd_tls_security_level=encrypt
|
||||||
|
postconf smtp_tls_mandatory_protocols=">=TLSv1.2"
|
||||||
|
postconf smtpd_tls_mandatory_protocols=">=TLSv1.2"
|
||||||
|
postconf smtp_tls_mandatory_ciphers=high
|
||||||
|
postconf smtpd_tls_mandatory_ciphers=high
|
||||||
postconf smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.org/fullchain.pem
|
postconf smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.org/fullchain.pem
|
||||||
postconf smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.org/privkey.pem
|
postconf smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.org/privkey.pem
|
||||||
```
|
```
|
||||||
|
|
@ -152,12 +156,24 @@ postconf smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.org/privkey.pem
|
||||||
What it means:
|
What it means:
|
||||||
|
|
||||||
- **smtp_tls_security_level**: \
|
- **smtp_tls_security_level**: \
|
||||||
Allow encrypted _outgoing_ SMTP connections but do not enforce it.
|
Enforce encrypted _outgoing_ SMTP connections.
|
||||||
- **smtpd_tls_security_level**: \
|
- **smtpd_tls_security_level**: \
|
||||||
Allow encrypted _incoming_ SMTP connections but do not enforce it.
|
Enforce encrypted _incoming_ SMTP connections.
|
||||||
|
- **smtp_tls_mandatory_protocols** / **smtpd_tls_mandatory_protocols**: \
|
||||||
|
Only allow recommended versions of [TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security). Version 1.2 has been
|
||||||
|
introduced 2008. Version 1.3 is from 2018.
|
||||||
|
- **smtp_tls_mandatory_ciphers** / **smtpd_tls_mandatory_ciphers**: \
|
||||||
|
The list of encryption algorithms that you allow for communnication. Default is _medium_.
|
||||||
- **smtpd_tls_cert_file** and **smtpd_tls_key_file**: \
|
- **smtpd_tls_cert_file** and **smtpd_tls_key_file**: \
|
||||||
Where to find the private key and certificate for encryption.
|
Where to find the private key and certificate for encryption.
|
||||||
|
|
||||||
|
<Aside type="tip" title="Losen the encryption?">
|
||||||
|
In rare cases you may fail to communicate with other computers because they only support older TLS versions (up to
|
||||||
|
1.1) or ciphers that are not considered secure nowadays. In that case you can remove the `smtpd_tls_security_level`,
|
||||||
|
`smtpd_tls_mandatory_protocols` and `smtpd_tls_mandatory_ciphers` settings from your `main.cf` file and fall back to
|
||||||
|
the relaxed security requirements.
|
||||||
|
</Aside>
|
||||||
|
|
||||||
Please note that configuration in `main.cf` applies to all Postfix services. So the above configuration enabled
|
Please note that configuration in `main.cf` applies to all Postfix services. So the above configuration enabled
|
||||||
encryption for both server-to-server and human-to-server (`submission`) services. The `smtpd_sasl_auth_enable` will only
|
encryption for both server-to-server and human-to-server (`submission`) services. The `smtpd_sasl_auth_enable` will only
|
||||||
be set for the `submission` service to enable authentication there.[^1]
|
be set for the `submission` service to enable authentication there.[^1]
|
||||||
|
|
@ -203,7 +219,7 @@ EOF
|
||||||
chown root:postfix /etc/postfix/mariadb-email2email.cf
|
chown root:postfix /etc/postfix/mariadb-email2email.cf
|
||||||
chmod u=rw,g=r,o= /etc/postfix/mariadb-email2email.cf
|
chmod u=rw,g=r,o= /etc/postfix/mariadb-email2email.cf
|
||||||
|
|
||||||
# Tell Postfix to use thi smapping
|
# Tell Postfix to use this mapping
|
||||||
postconf smtpd_sender_login_maps=mysql:/etc/postfix/mariadb-email2email.cf
|
postconf smtpd_sender_login_maps=mysql:/etc/postfix/mariadb-email2email.cf
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -261,6 +277,13 @@ If you want to allow that, create a new \*.cf file with a mapping query like thi
|
||||||
|
|
||||||
</Aside>
|
</Aside>
|
||||||
|
|
||||||
|
<Aside type="danger" title="Check your $mydestination">
|
||||||
|
|
||||||
|
Please check the `mydestination` setting in your `main.cf` file. Make sure that it does not contain any domain name that
|
||||||
|
you also use as one of your _virtual domains_. If in doubt just set it to `localhost`.
|
||||||
|
|
||||||
|
</Aside>
|
||||||
|
|
||||||
## Test it
|
## Test it
|
||||||
|
|
||||||
### No encryption, no authentication
|
### No encryption, no authentication
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: IMAP
|
title: IMAP
|
||||||
lastUpdated: 2025-11-01
|
lastUpdated: 2025-11-01
|
||||||
slug: ispmail-trxie/imap
|
slug: ispmail-trixie/imap
|
||||||
sidebar:
|
sidebar:
|
||||||
order: 190
|
order: 190
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Prevent spoofing using DKIM and SPF
|
title: Prevent spoofing using DKIM and SPF
|
||||||
lastUpdated: 2025-11-01
|
lastUpdated: 2025-11-01
|
||||||
slug: ispmail-trxie/anti-spoofing-dkim-spf
|
slug: ispmail-trixie/anti-spoofing-dkim-spf
|
||||||
sidebar:
|
sidebar:
|
||||||
order: 310
|
order: 310
|
||||||
---
|
---
|
||||||
|
|
@ -311,11 +311,11 @@ You could either just send an email from your mail client (or Roundcube) through
|
||||||
address. Or you could use swaks. Use your own addresses and password of course:
|
address. Or you could use swaks. Use your own addresses and password of course:
|
||||||
|
|
||||||
```sh title="Run this on your server"
|
```sh title="Run this on your server"
|
||||||
swaks --server localhost:587
|
swaks --server localhost:587 \
|
||||||
--from some.address@example.org
|
--from some.address@example.org \
|
||||||
--to some.external.address@example.net
|
--to some.external.address@example.net \
|
||||||
-tls
|
-tls \
|
||||||
--auth-user some.address@example.org
|
--auth-user some.address@example.org \
|
||||||
--auth-password your_secreet_password
|
--auth-password your_secreet_password
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Catch-all addresses
|
title: Catch-all addresses
|
||||||
lastUpdated: 2025-11-02
|
lastUpdated: 2025-11-02
|
||||||
slug: ispmail-trxie/catch-all
|
slug: ispmail-trixie/catch-all
|
||||||
sidebar:
|
sidebar:
|
||||||
order: 320
|
order: 320
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,320 @@
|
||||||
---
|
---
|
||||||
title: Quotas
|
title: Quotas
|
||||||
lastUpdated: 2025-11-01
|
lastUpdated: 2025-11-01
|
||||||
slug: ispmail-trxie/quotas
|
slug: ispmail-trixie/quotas
|
||||||
sidebar:
|
sidebar:
|
||||||
order: 330
|
order: 330
|
||||||
---
|
---
|
||||||
|
|
||||||
import { Aside } from "@astrojs/starlight/components";
|
import { Aside } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
<Aside type="tip" title="Coming soon">
|
<Aside type="tip" title="Optional feature">
|
||||||
This page is currently rewritten. It will be online in a couple of days.
|
This feature is completely optional. If you are eager to get finished then skip this page and maybe come back later.
|
||||||
</Aside>
|
</Aside>
|
||||||
|
|
||||||

|
Quotas are size limits for users. You can make sure that users do not waste arbitrary amounts of disk space but are
|
||||||
|
forced to clean up old emails every now and then.
|
||||||
|
|
||||||
|
The magic happens in two places:
|
||||||
|
|
||||||
|
1. Postfix needs to reject new emails if the user’s mailbox is over quota.
|
||||||
|
2. Dovecot needs to keep track of the quota and how much the user has already used up of it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
https://doc.dovecot.org/2.4.2/core/plugins/quota.html#quota-service
|
||||||
|
|
||||||
|
https://sys4.de/en/blog/postfix-dovecot-mailbox-quota/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
https://www.postfix.org/SMTPD_POLICY_README.html
|
||||||
|
|
||||||
|
telnet 127.0.0.1 13373 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
|
||||||
|
recipient=chris@auenland.workaround.org
|
||||||
|
|
||||||
|
action=554 5.2.2 Quota exceeded (mailbox for user is full)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```swaks --from nonexistens@example.org --to chris@auenland.workaround.org
|
||||||
|
=== Trying auenland.workaround.org:25...
|
||||||
|
=== Connected to auenland.workaround.org.
|
||||||
|
<- 220 auenland ESMTP Postfix (Debian)
|
||||||
|
-> EHLO minty
|
||||||
|
<- 250-auenland
|
||||||
|
<- 250-PIPELINING
|
||||||
|
<- 250-SIZE 10240000
|
||||||
|
<- 250-VRFY
|
||||||
|
<- 250-ETRN
|
||||||
|
<- 250-STARTTLS
|
||||||
|
<- 250-ENHANCEDSTATUSCODES
|
||||||
|
<- 250-8BITMIME
|
||||||
|
<- 250-DSN
|
||||||
|
<- 250-SMTPUTF8
|
||||||
|
<- 250 CHUNKING
|
||||||
|
-> MAIL FROM:<nonexistens@example.org>
|
||||||
|
<- 250 2.1.0 Ok
|
||||||
|
-> RCPT TO:<chris@auenland.workaround.org>
|
||||||
|
<** 554 5.2.2 <chris@auenland.workaround.org>: Recipient address rejected: Quota exceeded (mailbox for user is full)
|
||||||
|
-> QUIT
|
||||||
|
<- 221 2.0.0 Bye
|
||||||
|
=== Connection closed with remote host.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
cat 99-ispmail-quota.conf
|
||||||
|
mail_plugins {
|
||||||
|
quota = yes
|
||||||
|
}
|
||||||
|
|
||||||
|
quota "User quota" {
|
||||||
|
storage_size = 100K
|
||||||
|
storage_grace = 0
|
||||||
|
|
||||||
|
warning warn-95 {
|
||||||
|
quota_storage_percentage = 95
|
||||||
|
execute quota-warning {
|
||||||
|
args = 95 %{user}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
warning warn-80 {
|
||||||
|
quota_storage_percentage = 80
|
||||||
|
execute quota-warning {
|
||||||
|
args = 80 %{user}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
service quota-status {
|
||||||
|
executable = quota-status -p postfix
|
||||||
|
inet_listener quota-status {
|
||||||
|
port = 13373
|
||||||
|
}
|
||||||
|
client_limit = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example quota-warning service. The unix listener's permissions should be
|
||||||
|
# set in a way that mail processes can connect to it. Below example assumes
|
||||||
|
# that mail processes run as vmail user. If you use mode=0666, all system users
|
||||||
|
# can generate quota warnings to anyone.
|
||||||
|
service quota-warning {
|
||||||
|
executable = script /usr/local/bin/ispmail-quota-warning.sh
|
||||||
|
user = dovecot
|
||||||
|
unix_listener quota-warning {
|
||||||
|
user = vmail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
##
|
||||||
|
## Quota backends
|
||||||
|
##
|
||||||
|
|
||||||
|
# Multiple backends are supported:
|
||||||
|
# count: Default and recommended, quota driver tracks the quota internally within Dovecot's index files.
|
||||||
|
# maildir: Maildir++ quota
|
||||||
|
# fs: Read-only support for filesystem quota
|
||||||
|
#quota "User quota" {
|
||||||
|
# driver = count
|
||||||
|
#}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
cat /usr/local/bin/ispmail-quota-warning.sh
|
||||||
|
#!/bin/sh
|
||||||
|
PERCENT=$1
|
||||||
|
USER=$2
|
||||||
|
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o quota_enforce=no
|
||||||
|
From: postmaster@domain.com
|
||||||
|
Subject: quota warning
|
||||||
|
|
||||||
|
Your mailbox is now $PERCENT% full.
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Dovecot quota policy service
|
||||||
|
|
||||||
|
Let’s start with Dovecot. Find the file `/etc/dovecot/conf.d/90-quota.conf` and edit it. There are several `plugin {}`
|
||||||
|
sections. Take one and make it look like:
|
||||||
|
|
||||||
|
```
|
||||||
|
plugin {
|
||||||
|
quota = count:User quota
|
||||||
|
quota_vsizes = yes
|
||||||
|
|
||||||
|
quota_status_success = DUNNO
|
||||||
|
quota_status_nouser = DUNNO
|
||||||
|
quota_status_overquota = "452 4.2.2 Mailbox is full and cannot receive any more emails"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The first line defines that you want to calculate the used space in a user’s _maildir_. There are several
|
||||||
|
[backends](https://doc.dovecot.org/configuration_manual/quota_plugin/) like that but the
|
||||||
|
_[count](https://doc.dovecot.org/configuration_manual/quota/quota_count/#quota-backend-count)_ is the best choice in
|
||||||
|
this context. (Previous guides used _maildir_ here.) The string “User quota” is just an arbitrary string that may be
|
||||||
|
queried from a mail user agent.
|
||||||
|
|
||||||
|
The lines starting with “`quota_status_…`” set return values for the service that you will set up in a minute. It will
|
||||||
|
tell Postfix that it will not interfere (_DUNNO_ – colloquial way to say “I don’t know”). And it will return a string
|
||||||
|
with a return code 452 if the user is over quota. Codes starting with “4” mean temporary errors. It will tell the
|
||||||
|
sending party that it is worth retrying at a later time. However if the user does not resolve the issue it will lead to
|
||||||
|
a _bounce_ error email after three days.
|
||||||
|
|
||||||
|
In the same file (_90-quota.conf_) add another section:
|
||||||
|
|
||||||
|
```
|
||||||
|
service quota-status {
|
||||||
|
executable = /usr/lib/dovecot/quota-status -p postfix
|
||||||
|
unix_listener /var/spool/postfix/private/quota-status {
|
||||||
|
user = postfix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates a new [Dovecot service](https://doc.dovecot.org/configuration_manual/service_configuration/) responding to
|
||||||
|
requests from other processes. You surely recognize that we put it into the jail that Postfix runs in
|
||||||
|
(_/var/spool/postfix_), so that Postfix can access it.
|
||||||
|
|
||||||
|
Time to restart Dovecot:
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl restart dovecot
|
||||||
|
```
|
||||||
|
|
||||||
|
Take a look at the /var/spool/postfix/private directory. If all went as intended you will find a socket file called
|
||||||
|
`quota-status` there. Otherwise please check the `/var/log/mail.log` file for errors.
|
||||||
|
|
||||||
|
### Postfix recipient restrictions
|
||||||
|
|
||||||
|
If we stopped here, then Dovecot would reject emails for users who have no space left. However Postfix would still
|
||||||
|
happily receive new emails and attempt to forward them to Dovecot via LMTP. Dovecot however will deny that. It will then
|
||||||
|
keep the email in its queue and retry for a while. In the end it will send a _bounce_ back to the sender telling them
|
||||||
|
about the problem. So why is this bad?
|
||||||
|
|
||||||
|
1. The sender will assume that the email was delivered while it is stuck in the queue for up to three days.
|
||||||
|
2. Spam emails use forged senders. So at the time that Postfix generates the _bounce email_ it will likely send it to an
|
||||||
|
innocent person. This is called _backscatter_ and considered a mail server misconfiguration. Such a problem may get
|
||||||
|
your mail server blacklisted. You don’t want that.
|
||||||
|
|
||||||
|
So the next logical step is to make Postfix check whether a mailbox is over quota whenever a new email arrives. Let’s
|
||||||
|
hook up into the “RCPT TO” phase of the SMTP dialog when a new email comes in. Postfix checks its
|
||||||
|
_smtpd_recipient_restrictions_ configuration at this stage. Run this command in the shell:
|
||||||
|
|
||||||
|
```
|
||||||
|
postconf smtpd_recipient_restrictions=reject_unauth_destination, \
|
||||||
|
"check_policy_service unix:private/quota-status"
|
||||||
|
```
|
||||||
|
|
||||||
|
This adds two checks:
|
||||||
|
|
||||||
|
1. `reject_unauth_destination` checks whether the mail server is the final destination for the recipient’s email
|
||||||
|
address. This is pretty much the default behavior if you do not define any restrictions.
|
||||||
|
2. `check_policy_service` connects to the socket file at `/var/spool/postfix/private/quota-status` that was put there by
|
||||||
|
Dovecot. It will use it to ask Dovecot whether the user is over quota in which case the email would get rejected.
|
||||||
|
|
||||||
|
### Test it
|
||||||
|
|
||||||
|
If you are curious to see this working, then set John’s mailbox quota to 5 KB:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# mariadb mailserver
|
||||||
|
mysql> update virtual_users set quota=4000 where email='john@example.org';
|
||||||
|
```
|
||||||
|
|
||||||
|
Send him a few emails using the ‘swaks’ tool:
|
||||||
|
|
||||||
|
```
|
||||||
|
swaks --server localhost --to john@example.org
|
||||||
|
```
|
||||||
|
|
||||||
|
After a few emails you will see the rejection message:
|
||||||
|
|
||||||
|
```
|
||||||
|
-> RCPT TO:john@example.org
|
||||||
|
<** 452 4.2.2 john@example.org: Recipient address rejected: Mailbox is full and cannot receive any more emails
|
||||||
|
```
|
||||||
|
|
||||||
|
### Troubleshooting
|
||||||
|
|
||||||
|
These are things you should consider if quotas do not seem to work properly:
|
||||||
|
|
||||||
|
- Check if you have enabled “quota” in the “mail_plugins” in the 10-mail.conf file.
|
||||||
|
- Your users may complain that they have deleted many emails but are still over quota. Let them check if they actually
|
||||||
|
emptied the _Trash_ folder. Of course emails in that folder also contribute to the disk space usage. Once the Trash
|
||||||
|
folder is expunged the problem should be gone. You may also allow your users more space in the Trash folder. That’s
|
||||||
|
explained in the [Dovecot documentation](https://doc.dovecot.org/configuration_manual/quota/#quota-rules).
|
||||||
|
- If you directly remove files from a user’s Maildir instead of properly accessing the mailbox using IMAP then you will
|
||||||
|
screw up the quota calculation. In that case let Dovecot recalculate the quota:
|
||||||
|
`doveadm quota recalc -u john@example.org`
|
||||||
|
|
||||||
|
### Automatic warning emails
|
||||||
|
|
||||||
|
The last step is to inform the poor users if they accidentally went over quota. After all they do not necessarily
|
||||||
|
recognize that on their own. Let’s do that by sending them an email with a warning. Yes, we will make sure that the
|
||||||
|
email gets through even if the quota is reached.
|
||||||
|
|
||||||
|
Edit the `90-quota.conf` file again. Add this section to the file (derived from the
|
||||||
|
[Dovecot documentation](https://doc.dovecot.org/configuration_manual/quota/#quota-warning-scripts)):
|
||||||
|
|
||||||
|
```
|
||||||
|
plugin {
|
||||||
|
quota_warning = storage=95%% quota-warning 95 %u
|
||||||
|
quota_warning2 = storage=80%% quota-warning 80 %u
|
||||||
|
}
|
||||||
|
service quota-warning {
|
||||||
|
executable = script /usr/local/bin/quota-warning.sh
|
||||||
|
unix_listener quota-warning {
|
||||||
|
user = vmail
|
||||||
|
group = vmail
|
||||||
|
mode = 0660
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This section defines two automatic quota warnings. The first (quota_warning) is triggered if the user reaches 95% of the
|
||||||
|
quota. The second (quota_warning2) at 80%. These lines follow this schema:
|
||||||
|
|
||||||
|
- **Trigger** (e.g. “storage=95%”). The “%” sign needs to be used twice if you want to emit a literal percent sign. So
|
||||||
|
this is not a typo.
|
||||||
|
- The **socket** you want to call in that case. Our socket is the “service quota-warning” that calls a shell script.
|
||||||
|
- Additional **parameters** that are passed to the shell script in our case. They tell the script the percentage that
|
||||||
|
has been reached (e.g. 95) and the address of the user who should get the warning.
|
||||||
|
|
||||||
|
Apparently we need the script to run. So please create a new file at `/usr/local/bin/quota-warning.sh` and put these
|
||||||
|
lines into it:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/sh
|
||||||
|
PERCENT=$1
|
||||||
|
USER=$2
|
||||||
|
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
|
||||||
|
From: postmaster@webmail.example.org
|
||||||
|
Subject: Quota warning - $PERCENT% reached
|
||||||
|
|
||||||
|
Your mailbox can only store a limited amount of emails.
|
||||||
|
Currently it is $PERCENT% full. If you reach 100% then
|
||||||
|
new emails cannot be stored. Thanks for your understanding.
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Make this file executable:
|
||||||
|
|
||||||
|
```
|
||||||
|
chmod +x /usr/local/bin/quota-warning.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Time to restart Dovecot again:
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl restart dovecot
|
||||||
|
```
|
||||||
|
|
||||||
|
Dovecot’s quota limits can be configured in many ways. If you have special needs then give
|
||||||
|
[their documentation](https://doc.dovecot.org/configuration_manual/quota/) a look.
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Going live
|
title: Going live
|
||||||
lastUpdated: 2025-11-01
|
lastUpdated: 2025-11-01
|
||||||
slug: ispmail-trxie/going-live
|
slug: ispmail-trixie/going-live
|
||||||
sidebar:
|
sidebar:
|
||||||
order: 400
|
order: 400
|
||||||
---
|
---
|
||||||
|
|
@ -36,6 +36,12 @@ ALTER USER 'mailserver'@'127.0.0.1' IDENTIFIED BY '${PW_MAILSERVER}';
|
||||||
FLUSH PRIVILEGES;
|
FLUSH PRIVILEGES;
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Delete example data
|
||||||
|
mariadb <<EOF
|
||||||
|
DELETE FROM virtual_domains where name='example.org';
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
# Print the passwords for us to write down
|
# Print the passwords for us to write down
|
||||||
echo "mailadmin password: $PW_MAILADMIN"
|
echo "mailadmin password: $PW_MAILADMIN"
|
||||||
echo "mailserver password: $PW_MAILSERVER"
|
echo "mailserver password: $PW_MAILSERVER"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
---
|
||||||
|
title: Automated installation
|
||||||
|
lastUpdated: 2025-12-17
|
||||||
|
slug: ispmail-trixie/automated-installation
|
||||||
|
sidebar:
|
||||||
|
order: 500
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Aside } from "@astrojs/starlight/components";
|
||||||
|
|
||||||
|
I have spent an extra couple of days to provide you with a shell script that does all the steps of this guide
|
||||||
|
automatically on a fresh Debian Trixie system. The previous Bookworm guide contained an Ansible playbook for that
|
||||||
|
purpose. But although I know Ansible quite well, I have realized that it can make simple tasks very complicated. So I
|
||||||
|
thought that a shell script is the simplest way.
|
||||||
|
|
||||||
|
<Aside type="danger" title="I trust you">
|
||||||
|
You may be tempted to skip the entire guide and just download and run the installation script. I trust that you are
|
||||||
|
not doing that. Only use this script after you have set up at least one mail server while following this guide from
|
||||||
|
start to end. It is easy to use but it is meant for experienced users who want to install multiple mail servers.
|
||||||
|
</Aside>
|
||||||
|
|
||||||
|
To use the automated installer:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
wget https://workaround.org/ispmail.sh
|
||||||
|
chmod +x ispmail.sh
|
||||||
|
./ispmail.sh -f example.org
|
||||||
|
```
|
||||||
|
|
||||||
|
Use your main FQDN instead of **example.org**. It will become the main host name for Roundcube, rspamd, SMTP, IMAP and
|
||||||
|
will be taken as the common name for the Let's Encrypt certificate.
|
||||||
|
|
||||||
|
This script is something new. So please report your experience while using it down in the comments.
|
||||||