![Docker Mailcow:使用 SMTP、POP3 和 IMAP 将 Nginx 作为 docker 容器镜像的邮件反向代理](https://linux22.com/image/706867/Docker%20Mailcow%EF%BC%9A%E4%BD%BF%E7%94%A8%20SMTP%E3%80%81POP3%20%E5%92%8C%20IMAP%20%E5%B0%86%20Nginx%20%E4%BD%9C%E4%B8%BA%20docker%20%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E7%9A%84%E9%82%AE%E4%BB%B6%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
在我的服务器上,我正在运行mailcow:dockerized在 Debian 服务器上的解决方案,我想使用 nginx 不仅作为 http 反向代理,还想将其用作 SMTP imap 和 pop3,如https://www.nginx.com/resources/admin-guide/mail-proxy/
但是我越读这个链接,就越难弄清楚如何做到这一点。在 http 中,如何做到这一点很明显:
server {
listen 80;
server_name mail.example.tk;
location /.well-known {
proxy_pass http://127.0.0.1:8080/.well-known ;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100m;
}
location / {
rewrite ^(.*) https://$server_name$1 permanent;
}
}
server {
listen 443 ssl;
server_name mail.example.tk;
ssl_certificate /opt/docker-mailcow/data/assets/ssl/cert.pem;
ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100m;
}
}
但是使用 smtp、pop3 和 imap 该怎么做呢?请记住,docker 镜像与 nginx 在同一台服务器上运行,它们是:
827c20cee898 mailcow/dovecot:1.0 "/docker-entrypoin..." 50 minutes ago Up 50 minutes 24/tcp, 10001/tcp, 0.0.0.0:2110->110/tcp, 0.
76a977a8064e mailcow/postfix:1.0 "/bin/sh -c 'exec ..." 50 minutes ago Up 50 minutes 588/tcp, 0.0.0.0:2525->25/tcp, 0.0.0.0:2465-
有任何想法吗?
答案1
根据评论,问题似乎与邮件代理的 HTTP 身份验证服务器有关。指南的部分内容谈到了这一点:
客户端发出的每个 POP3/IMAP/SMTP 请求都将首先在外部 HTTP 身份验证服务器上或通过身份验证脚本进行身份验证。对于 NGINX 邮件服务器代理来说,拥有身份验证服务器是必需的。您可以根据基于 HTTP 协议的 NGINX 身份验证协议自行创建服务器。
它链接到http://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#protocol这进一步说明了请求和响应应该是什么样的。它给出了以下请求示例:
GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain # plain/apop/cram-md5/external
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap # imap/pop3/smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org
这是您的auth_http
服务器将收到的内容。然后,您的auth_http
服务器将需要响应以下内容:
HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143
来自服务器的响应包含请求将代理到的服务器 IP 和端口。
不幸的是,他们没有提供任何示例 HTTP 服务器或可运行的代码。不过,我在另一篇文章中找到了 PHP 服务器脚本作为示例,网址为https://www.nginx.com/resources/wiki/start/topics/examples/imapauthenticatewithapachephpscript/。