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
先備份一下 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
自建信箱的終極測試 “Mail-tester“
進來之後,複製中間提供的信箱
點 Send Email
中間的框框貼上剛剛複製的信息並按下 Create reverse-alias
點這個複製你要寄件的資訊
貼到寄件人,標題跟內文隨便打就可以送出啦!
送出就可以回到網站,點擊下面的 查看你的郵件得分
就可以看分數啦~
因為原本的教學沒有提到 rDNS 的設定,我也就沒理他,後來發現我的信都寄不到 iCloud mail,到 maile-tester 才發現我的得分超低的!
如果從頭到尾都有做完的話,應該可以拿到跟我一樣的分數,雖然很低,但是已經寄得到 iCloud mail 就很滿足了🥳
在我的測試中,hotmail 會直接被退件,可能要把 mail-tester 的分數再拉高一點再試試看囉😓