Compare commits

...

42 commits

Author SHA1 Message Date
24c5e5b418 Merge branch 'dev' into stage
Some checks failed
/ build (push) Failing after 0s
2025-12-20 20:56:36 +01:00
1d63ab69af ffs 2025-12-20 20:56:26 +01:00
fb08f61301 call to action 2025-12-17 18:15:56 +01:00
bd1e55f731 forgot to remove -x flag 2025-12-17 18:14:45 +01:00
a211d92fd6 reload dovecot to enable imapsieve plugin 2025-12-17 17:50:42 +01:00
81e6f102b0 error codes fixed 2025-12-17 17:29:25 +01:00
a9cc36e8bb add automated installer script 2025-12-17 01:43:31 +01:00
4da8f077e6 various typos and improvements 2025-12-17 01:43:18 +01:00
912492287d restrict managesieve port - thank you Thomas Gauweiler 2025-12-09 00:57:52 +01:00
df1d49afdf add external contact form and secondary email address 2025-12-02 23:37:00 +01:00
4f159716ef legal stuff 2025-12-02 23:05:50 +01:00
f7f672fbc8 added secondary contact form 2025-12-02 23:05:28 +01:00
fd70990a60 use online-impressum 2025-12-02 18:41:44 +01:00
fa48d82579 imprints added for the German bureaucrats 2025-12-02 17:26:10 +01:00
8080437ae3 add hint on $mydestinaton 2025-12-02 14:13:34 +01:00
264dd9fcd0 adapt Ilmari's hint on TLS version and ciphers 2025-12-02 00:58:44 +01:00
af7e759c74 slug typo 2025-12-02 00:58:26 +01:00
80cffd51e3 Merge branch 'stage' into prod 2025-11-30 19:41:17 +01:00
0cd83c2034 fix slugs 2025-11-30 19:39:32 +01:00
Christoph Haas
9aa27b9159 Merge branch 'stage' into prod 2025-11-28 16:33:44 +01:00
Christoph Haas
88ac4aaa46 keep existing records in cli.ini 2025-11-28 16:27:54 +01:00
Christoph Haas
329c4e8972 added information for contributors 2025-11-28 15:55:41 +01:00
Christoph Haas
6fd3a74ff1 typo fixed. Thanks to Burps 2025-11-14 16:13:36 +01:00
b77088a0f7 typo of a2enconf versus a2ensite 2025-11-12 00:37:16 +01:00
0951a2c96f typo fixed 2025-11-12 00:26:06 +01:00
0f4d71fd5f add newlines 2025-11-09 22:30:56 +01:00
5bf9c487f4 export from drawio with transparent background for better display in firefox 2025-11-04 23:48:07 +01:00
e962886ee6 same 2025-11-04 23:31:44 +01:00
f5997c3495 fix big-picture images for dark mode 2025-11-04 23:31:10 +01:00
19f1d792c9 add managesieve plugin 2025-11-04 22:00:36 +01:00
f873ebe49a add hint on weak password schemes 2025-11-04 22:00:31 +01:00
3a13a742ea typo fixed 2025-11-04 00:04:02 +01:00
abe6291333 Merge branch 'stage' into prod 2025-11-03 23:42:50 +01:00
852f5e7832 Restart Dovecot after adding lmtp. Thanks, Josef 2025-11-03 23:42:43 +01:00
f1811384d6 Merge branch 'stage' into prod 2025-11-03 22:57:56 +01:00
107816711f fix rybbit reference 2025-11-03 22:55:58 +01:00
4992e4a8c6 Merge branch 'stage' into prod 2025-11-03 22:50:12 +01:00
1695df72a9 replace matomo by rybbit 2025-11-03 22:45:40 +01:00
d3c4afc61e Merge branch 'stage' into prod 2025-11-03 09:03:26 +01:00
370e684f06 add info on redis 2025-11-03 09:03:19 +01:00
935bbd2a6f typos 2025-11-02 21:21:48 +01:00
96c00a0650 rewording 2025-11-02 21:21:48 +01:00
45 changed files with 1757 additions and 226 deletions

View file

@ -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"

View file

@ -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)

View file

@ -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(),
], ],

View file

@ -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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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="&lt;font style=&quot;&quot;&gt;Other&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;&quot;&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;(TCP port 25)&lt;/div&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-50" edge="1"> <mxCell id="gQG6ldMYRfHswNwDJcwK-46" value="SMTP&lt;div&gt;(TCP port 25)&lt;/div&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-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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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="&lt;span style=&quot;font-size: 16px;&quot;&gt;I would like to send an email to john@example.com&lt;/span&gt;" 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="&lt;span style=&quot;font-size: 16px;&quot;&gt;I would like to send an email to john@example.com&lt;/span&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;(DNS)&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;AAAA: 2001:876:18:5::ce&lt;/div&gt;" 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&lt;div&gt;AAAA: 2001:876:18:5::ce&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;ESMTP Postfix&lt;/div&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" source="gQG6ldMYRfHswNwDJcwK-77" target="gQG6ldMYRfHswNwDJcwK-78" edge="1"> <mxCell id="gQG6ldMYRfHswNwDJcwK-76" value="220 smtp01.example.net&lt;div&gt;ESMTP Postfix&lt;/div&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" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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 &quot;remoteserver&quot;" 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 &quot;remoteserver&quot;" 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="&lt;div&gt;250-smtp01.example.com&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;250-SIZE 40000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;250-STARTTLS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;250-ENHANCEDSTATUSCODES&lt;/div&gt;&lt;div&gt;250-8BITMIME&lt;/div&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" source="gQG6ldMYRfHswNwDJcwK-87" target="gQG6ldMYRfHswNwDJcwK-88" edge="1"> <mxCell id="gQG6ldMYRfHswNwDJcwK-86" value="&lt;div&gt;250-smtp01.example.com&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;250-SIZE 40000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;250-STARTTLS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;250-ENHANCEDSTATUSCODES&lt;/div&gt;&lt;div&gt;250-8BITMIME&lt;/div&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" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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: &amp;lt;someone@else.com&amp;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: &amp;lt;someone@else.com&amp;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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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: &amp;lt;john@example.org&amp;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: &amp;lt;john@example.org&amp;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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;database&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;Spam check&lt;/div&gt;" 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&lt;div&gt;Spam check&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;Spam check&lt;/div&gt;" 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&lt;div&gt;Spam check&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;server&lt;/span&gt;&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;IMAP server&lt;/div&gt;" 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&lt;div&gt;IMAP server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;mail server&lt;/div&gt;" 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&lt;div&gt;IMAP server&lt;/div&gt;" 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&lt;div&gt;IMAP server&lt;/div&gt;" 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="&lt;font style=&quot;font-size: 16px; color: rgb(0, 0, 0);&quot;&gt;/var/vmail&lt;/font&gt;" 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="&lt;font style=&quot;font-size: 16px;&quot;&gt;/var/vmail&lt;/font&gt;" 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>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

991
public/ispmail.sh Executable file
View 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

View file

@ -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>

View 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

View file

@ -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. Dont hurry and skip parts - **Patience**. We will proceed slowly and after every step ensure that you are still on track. Dont 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

View file

@ -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.) Lets synchronize again. *rsync* will only copy those files that have changed which makes it much copied consistently.) Lets 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.

View file

@ -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 |
| :--------- | :---------- | :--------------------------------------------------------- | | :--------- | :---------- | :--------------------------------------------------------- |

View file

@ -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.

View file

@ -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:

View file

@ -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

View file

@ -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',
); );
``` ```

View file

@ -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

View file

@ -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
--- ---

View file

@ -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
``` ```

View file

@ -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
--- ---

View file

@ -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>
![Under construction](images/under-construction.jpg) 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 users 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
Lets 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 users _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 dont 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 dont want that.
So the next logical step is to make Postfix check whether a mailbox is over quota whenever a new email arrives. Lets
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 recipients 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 Johns 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. Thats
explained in the [Dovecot documentation](https://doc.dovecot.org/configuration_manual/quota/#quota-rules).
- If you directly remove files from a users 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. Lets 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
```
Dovecots 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.

View file

@ -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"

View file

@ -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.