image-20220122225649104

SimpleLogin

SimpleLogin 是一個可以保護自己信箱不外露的一個免洗信箱的服務,他的特色有很多,像是可以一鍵退訂郵件(他會把設定的轉寄給停用),等到你需要了再打開,也可以建立自己想要的信箱帳號,我現在用的信箱[email protected] 就是用這個服務轉送的,他還支援回信的功能,讓你不再收信人跟寄件人不同!

而且支援多平臺從瀏覽器到手機,通通都可以管理 & 新建臨時郵件,更多細節就到他的官網看看

比較可惜的是它現在還沒有拆除追蹤器的功能,沒申請到鴨鴨走轉寄的朋友,不妨來試試看這個吧!

順帶一提,現在部署的版本是比較舊的版本,作者說近期會更新新的版本,就讓我們拭目以待囉!

官方 VM 建議

Ubuntu 18.09 以上,這邊建議能裝新的LTS就裝新的哦!

ram 2G 以上

需開通以下 port

  • 22 (ssh)
  • 25 (email)
  • 80, 443 (web aapp)

本次的安裝環境是 Debian 11,是在剛裝好系統的情況下操作

安裝步驟是參考 GitHub 上的教學,還有做一些小小的改動,如果英文夠好就直接看原文吧 XD 另外就是原文的教學有很多設定的解說,也是建議搭配食用哦~

我也是第一次裝這個東西,如果有哪邊講不好或是有錯誤的,歡迎到底下留言讓我知道!

安裝 simple-login

建立資料夾

mkdir -p sl/db
mkdir -p sl/upload
mkdir -p sl/pgp

安裝必要套件

apt update && apt install -y dnsutils

DKIM

openssl genrsa -out dkim.key 1024
openssl rsa -in dkim.key -pubout -out dkim.pub.key

DNS

以下的設定都是用我的域名來做例子,照著操作的朋友要記得改域名哦~

MX record

新增一個 mydomain.com. 指向 app.mydomain.com. ,並把優先順序 (priority) 設定為 10

使用以下指令來檢查 DNS 紀錄是否已經生效

dig @1.1.1.1 beeeeemo.dev mx

如果成功,會回傳 MX 所指向的位置,我這邊是設定 sl.beeeeemo.dev

;; ANSWER SECTION:
beeeeemo.dev.		300	IN	MX	10 sl.beeeeemo.dev.

A record

dig @1.1.1.1 sl.beeeeemo.dev. a

成功的話會回傳主機的 IP

DKIM

新增一個 TXT record 來設定 DKIM,名稱:dkim._domainkey.mydomain.com.

Value 使用以下腳本來產生

# 先到剛剛 openssl 產生 key 的目錄
sed "s/-----BEGIN PUBLIC KEY-----/v=DKIM1; k=rsa; p=/g" dkim.pub.key | sed 's/-----END PUBLIC KEY-----//g' |tr -d '\n' | awk 1

成功的話會回傳

v=DKIM1; k=rsa; p=XXXXXXXXXXX....

把他寫在 TXT 的 Value

檢查 TXT 的有沒有成功吧~

dig @1.1.1.1 dkim._domainkey.beeeeemo.dev txt

SPF

新增一個 TXT record, mydomain.com. 以我當例子的話就是 beeeeemo.dev.

v=spf1 mx ~all
dig @1.1.1.1 beeeeemo.dev txt

DMARC

新增一個 TXT record, _dmarc.mydomain.com. 以我當例子的話就是 _dmarc.beeeeemo.dev

v=DMARC1; p=quarantine; adkim=r; aspf=r

還是要檢查 XD

dig @1.1.1.1 _dmarc.beeeeemo.dev txt

DNS 的部分就完成了! 接下來開始裝 web app 吧~

Docker

安裝 Docker

wget -qO- https://get.docker.com/ | sh

建立 Docker network

docker network create -d bridge \
    --subnet=240.0.0.0/24 \
    --gateway=240.0.0.1 \
    sl-network
docker network create -d bridge \
    --subnet=173.0.0.0/24 \
    --gateway=173.0.0.1 \
    sl-network

Postgres

記得要修改 db 的帳號密碼

docker run -d \
    --name sl-db \
    -e POSTGRES_PASSWORD=mypassword \
    -e POSTGRES_USER=myuser \
    -e POSTGRES_DB=simplelogin \
    -p 127.0.0.1:5432:5432 \
    -v $(pwd)/sl/db:/var/lib/postgresql/data \
    --restart always \
    --network="sl-network" \
    postgres:12.1

測試看看能不能連進去~

docker exec -it sl-db psql -U myuser simplelogin

如果有進到 postgres console,輸入 exit 離開

Postfix

apt-get install -y postfix postfix-pgsql -y

選擇 Internet Site

image-20220122204745651

image-20220122204814296

先備份一下 config

cp -n /etc/postfix/main.cf{,.bak}

編輯 /etc/postfix/main.cf

Set your domain here 下面改成你自己的域名

# POSTFIX config file, adapted for SimpleLogin
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_security_level = may
smtpd_tls_security_level = may

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

alias_maps = hash:/etc/aliases
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 240.0.0.0/24

# Set your domain here
mydestination =
myhostname = sl.beeeeemo.dev
mydomain = beeeeemo.dev
myorigin = beeeeemo.dev
smtp_helo_name = sl.beeeeemo.dev

relay_domains = pgsql:/etc/postfix/pgsql-relay-domains.cf
transport_maps = pgsql:/etc/postfix/pgsql-transport-maps.cf

# HELO restrictions
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    permit

# Sender restrictions:
smtpd_sender_restrictions =
    permit_mynetworks,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    permit

# Recipient restrictions:
smtpd_recipient_restrictions =
   reject_unauth_pipelining,
   reject_non_fqdn_recipient,
   reject_unknown_recipient_domain,
   permit_mynetworks,
   reject_unauth_destination,
   reject_rbl_client zen.spamhaus.org,
   reject_rbl_client bl.spamcop.net,
   permit

建立 /etc/postfix/pgsql-relay-domains.cf

記得改帳號密碼

# postgres config
hosts = localhost
user = myuser
password = mypassword
dbname = simplelogin

query = SELECT domain FROM custom_domain WHERE domain='%s' AND verified=true
    UNION SELECT '%s' WHERE '%s' = 'mydomain.com' LIMIT 1;

建立 /etc/postfix/pgsql-transport-maps.cf

這裡也要記得改帳號密碼

# postgres config
hosts = localhost
user = myuser
password = mypassword
dbname = simplelogin

# forward to smtp:127.0.0.1:20381 for custom domain AND email domain
query = SELECT 'smtp:127.0.0.1:20381' FROM custom_domain WHERE domain = '%s' AND verified=true
    UNION SELECT 'smtp:127.0.0.1:20381' WHERE '%s' = 'mydomain.com' LIMIT 1;
systemctl restart postfix

建立設定檔

建立一個名為 simplelogin.env 的檔案,內容如下

記得修改域名及 DB Connection 的帳號密碼!

# WebApp URL
URL=http://sl.beeeeemo.dev

# domain used to create alias
EMAIL_DOMAIN=beeeeemo.dev

# transactional email is sent from this email address
SUPPORT_EMAIL=[email protected]

# custom domain needs to point to these MX servers
EMAIL_SERVERS_WITH_PRIORITY=[(10, "sl.beeeeemo.dev.")]

# By default, new aliases must end with ".{random_word}". This is to avoid a person taking all "nice" aliases.
# this option doesn't make sense in self-hosted. Set this variable to disable this option.
DISABLE_ALIAS_SUFFIX=1

# the DKIM private key used to compute DKIM-Signature
DKIM_PRIVATE_KEY_PATH=/dkim.key

# DB Connection
DB_URI=postgresql://myuser:mypassword@sl-db:5432/simplelogin

FLASK_SECRET=put_something_secret_here

GNUPGHOME=/sl/pgp

LOCAL_FILE_UPLOAD=1

執行 simple-login container

docker run --rm \
    --name sl-migration \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/sl/upload:/code/static/upload \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    -v $(pwd)/simplelogin.env:/code/.env \
    --network="sl-network" \
    simplelogin/app:3.4.0 flask db upgrade
docker run --rm \
    --name sl-init \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/simplelogin.env:/code/.env \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    --network="sl-network" \
    simplelogin/app:3.4.0 python init_app.py
docker run --rm \
    --name sl-init \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/simplelogin.env:/code/.env \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    --network="sl-network" \
    simplelogin/app:3.4.0 python init_app.py
docker run -d \
    --name sl-app \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/sl/upload:/code/static/upload \
    -v $(pwd)/simplelogin.env:/code/.env \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    -p 127.0.0.1:7777:7777 \
    --restart always \
    --network="sl-network" \
    simplelogin/app:3.4.0
docker run -d \
    --name sl-email \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/sl/upload:/code/static/upload \
    -v $(pwd)/simplelogin.env:/code/.env \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    -p 127.0.0.1:20381:20381 \
    --restart always \
    --network="sl-network" \
    simplelogin/app:3.4.0 python email_handler.py
docker run -d \
    --name sl-job-runner \
    -v $(pwd)/sl:/sl \
    -v $(pwd)/sl/upload:/code/static/upload \
    -v $(pwd)/simplelogin.env:/code/.env \
    -v $(pwd)/dkim.key:/dkim.key \
    -v $(pwd)/dkim.pub.key:/dkim.pub.key \
    --restart always \
    --network="sl-network" \
    simplelogin/app:3.4.0 python job_runner.py

Caddy

這邊的的話 GitHub 的教學是用 Nginx,我比較喜歡 Caddy,就用 Caddy 吧 XD

docker run -d --network host --restart always \
    -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
    -v caddy_data:/data \
    caddy

新建一個 Caddyfile 的檔案,記得將域名換成自己的!

sl.beeeeemo.dev {
	reverse_proxy localhost:7777
}

如果從域名進得去服務的話,那就大致上完成了!

基本設定

因為已經安裝好了,那就可以先去註冊~

註冊好帳號,我們就進到資料庫改欄位,讓自己變成管理員 & 終生會員,不然只能試用一陣子而已

docker exec -it sl-db psql -U myuser simplelogin
UPDATE users SET lifetime = TRUE WHERE id = 1;
UPDATE users SET is_admin = TRUE WHERE id = 1;
exit

回到原本的目錄,編輯 simplelogin.env 加上這兩行來關閉註冊

DISABLE_REGISTRATION=1
DISABLE_ONBOARDING=true

編輯完重新啟動就可以啦!

rDNS

設定 RDNS,因為我是架在 VPS 上,所以就找到 Network 相關的設定,然後將 rDNS 指向到 mail server

image-20220122223406985

自建信箱的終極測試 “Mail-tester“

Mail-tester

進來之後,複製中間提供的信箱

image-20220122232200736

Send Email

image-20220122232330047

中間的框框貼上剛剛複製的信息並按下 Create reverse-alias

image-20220122232454563

點這個複製你要寄件的資訊

image-20220122232818362

貼到寄件人,標題跟內文隨便打就可以送出啦!

image-20220122234236458

送出就可以回到網站,點擊下面的 查看你的郵件得分 就可以看分數啦~

因為原本的教學沒有提到 rDNS 的設定,我也就沒理他,後來發現我的信都寄不到 iCloud mail,到 maile-tester 才發現我的得分超低的!

如果從頭到尾都有做完的話,應該可以拿到跟我一樣的分數,雖然很低,但是已經寄得到 iCloud mail 就很滿足了🥳

在我的測試中,hotmail 會直接被退件,可能要把 mail-tester 的分數再拉高一點再試試看囉😓

image-20220122231821715