跳转至

ThinkPHP

适用于 ThinkPHP 8(8.x)应用的分步指南。Mailexam 通过 yzh52521/think-mail 包(Symfony Mailer)以 SMTP 方式接入。

所需条件

  • Mailexam 账户及带 SMTP 凭据的项目
  • ThinkPHP 8 与 Composer。

欢迎邮件(或控制台)复制以下信息:

  • YOUR_LOGIN — SMTP 登录名(例如 xxxxx);
  • YOUR_PASSWORD — SMTP 密码(与登录名配对);
  • 主机 — YOUR_LOGIN.mailexam.cn与登录名一致)。

1. 依赖

composer require yzh52521/think-mail
composer require vlucas/phpdotenv  # 本地开发使用 .env

安装后项目中会出现 config/mailer.php,请按下方说明为 Mailexam 进行配置。

2. 环境变量

在项目根目录创建 .env(加入 .gitignore):

MAILEXAM_LOGIN=YOUR_LOGIN
MAILEXAM_PASSWORD=YOUR_PASSWORD
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test

在启动时加载 .env(例如在 public/index.php 中、创建应用之前):

Dotenv\Dotenv::createImmutable(dirname(__DIR__))->safeLoad();

配置中的主机:YOUR_LOGIN.mailexam.cn

发件人地址

MAIL_FROM 可以是任意测试地址 — 邮件会进入 Mailexam,而非真实收件人。

备选端口

MAILEXAM_PORT=587
MAILEXAM_PORT=2525
MAILEXAM_PORT=465
MAILEXAM_PORT=25

3. SMTP 配置

config/mailer.php

<?php

$login = getenv('MAILEXAM_LOGIN') ?: '';
$port = (int) (getenv('MAILEXAM_PORT') ?: 587);
$from = getenv('MAIL_FROM') ?: 'noreply@example.test';

return [
    'scheme' => 'smtp',
    'host' => $login . '.mailexam.cn',
    'username' => $login,
    'password' => getenv('MAILEXAM_PASSWORD') ?: '',
    'port' => $port,
    'options' => [],
    'embed' => 'cid:',
    'from' => [
        'address' => $from,
        'name' => 'Mailexam Test',
    ],
];

复杂邮件流程可使用 think-mail 的模板与附件功能 — SMTP 参数保持不变。

4. 发送测试邮件

通过 HTTP(控制器)

// app/controller/Mail.php
namespace app\controller;

use app\BaseController;
use mailer\facade\Mailer;

class Mail extends BaseController
{
    public function test()
    {
        $payload = $this->request->post();
        if ($payload === []) {
            $payload = json_decode($this->request->getContent(), true) ?? [];
        }

        $to = $payload['to'] ?? 'user@example.test';
        $subject = $payload['subject'] ?? 'ThinkPHP + Mailexam';
        $body = $payload['body'] ?? $payload['text'] ?? 'Mailexam test from ThinkPHP';

        Mailer::to($to)->subject($subject)->text($body)->send();

        return json(['status' => 'ok']);
    }
}

route/app.php 中添加路由:

use think\facade\Route;

Route::post('mail/test', 'mail/test');

启动并验证:

php -S 127.0.0.1:8080 -t public public/router.php
curl -X POST http://127.0.0.1:8080/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Test","body":"Hello"}'

邮件将出现在 Mailexam 控制台 → 您的项目 → 收件箱。

5. 本地开发与 CI

环境 建议
local 使用含 Mailexam 凭据的 .env
CI 在 pipeline 密钥中设置 MAILEXAM_LOGINMAILEXAM_PASSWORD

GitLab CI 示例:

variables:
  MAILEXAM_LOGIN: $MAILEXAM_LOGIN
  MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
  MAILEXAM_PORT: "587"
  MAIL_FROM: "noreply@example.test"

在 pipeline 中发送邮件后,通过 Mailexam API 验证投递。

6. 常见问题

TLS 或认证失败

  • host 必须为 {login}.mailexam.cnusername 为邮件中的同一登录名。
  • 登录名与密码为同一项目的配对凭据

环境变量为空

  • (new App())->http 之前调用 Dotenv::createImmutable(...)->safeLoad()
  • 生产环境在 PHP-FPM / 容器环境中设置变量。

控制台中看不到邮件

  • 查看同一 Mailexam 项目的收件箱。
  • 检查 runtime/log/ 中的 SMTP 错误。

参见