我正在尝试设置一个在 Docker 中运行的 Symfony 的开发环境。最近我安装了 symfony/mailer 软件包,并可以选择安装 mailcatcher,结果是 axllent/mailpit。
但是,当我的代码尝试发送电子邮件时(我只是尝试使用 symfony 生成的注册表单和用户电子邮件验证),我收到以下错误:
Connection could not be established with host "127.0.0.1:1025": stream_socket_client(): Unable to connect to 127.0.0.1:1025 (Connection refused)
但是,如果我在控制台中尝试使用
symfony console mailer:test [email protected]
或
mailpit sendmail -t -S 127.0.0.1:1025 < email.txt
一切正常,电子邮件出现在 mailpit Web UI 中(我可以在 localhost:8025 上正常访问)。
这是我的 compose.yaml 的 mailpit 部分:
mailer:
image: axllent/mailpit
restart: unless-stopped
volumes:
- ./mailer:/data
ports:
- 1025:1025
- 8025:8025
environment:
MP_SMTP_AUTH_ACCEPT_ANY: 1
MP_SMTP_AUTH_ALLOW_INSECURE: 1
MP_MAX_MESSAGES: 5000
MP_DATABASE: /data/mailpit.db
在 .env 中,我有以下 DSN:
MAILER_DSN=smtp://127.0.0.1:1025
如何使代码也正确连接/发送电子邮件?
您需要在运行 Symfony 的容器内使用 Docker 服务名称 (
mailer
) 作为主机名,而不是本地主机 (127.0.0.1
)。
将其放入您的 .env.dev
或 .env.dev.local
:
MAILER_DSN=smtp://mailer:1025
然后使用
mailer
检查 docker compose ps
服务暴露了哪些端口。它应该返回类似这样的内容:
NAME ... PORTS
my-project-mailer-1 ... 1110/tcp, 0.0.0.0:35433->1025/tcp, 0.0.0.0:44957->8025/tcp
注意
0.0.0.0:44957->8025
。在这种情况下,可在 mailer
访问 http://localhost:44957
服务的 Web 界面。
或者在 Docker 组合中使用固定端口,使 Web 界面仅在本地计算机上在端口 48025
(
http://localhost:48025
) 上可用。
mailer:
image: axllent/mailpit
# ...
ports:
- "1025:1025"
- "127.0.0.1:48025:8025"
# ...