# 测试企业微信邮箱通道配置

列出工作区已有的企业微信通道实例，再测试一组尚未保存的企业微信邮箱配置。测试不会创建通道实例。

(sdk-ai-studio-channels-prepare)=
## 准备

1. [配置 SDK 和个人访问令牌](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-configure)。
2. [选择工作区并获取工作区 ID](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-workspaces)。
3. **完整邮箱地址**：登录要连接的企业微信邮箱，使用该账户的完整地址；按[配置前检查](../../../../guides/ai-studio/agents/tools/configuration/wecom/mail.md#配置前检查)开启 IMAP/SMTP 服务。
4. **邮箱客户端专用密码**：按[生成客户端专用密码](../../../../guides/ai-studio/agents/tools/configuration/wecom/mail.md#生成客户端专用密码)取得该邮箱的授权码，不使用邮箱登录密码。

在终端设置邮箱地址和授权码。邮箱授权码与个人访问令牌是两种不同凭据：

```bash
export WECOM_MAIL_EMAIL='<完整企业微信邮箱地址>'
export WECOM_MAIL_PASSWORD='<该邮箱生成的客户端专用密码>'
```

(sdk-ai-studio-channels-s1)=
## 读取实例并测试邮箱配置

将对应语言的代码保存为 Python 脚本或 Go 程序并运行。程序先列出当前页已有实例的 ID、名称、通道类型及最近测试状态，再提交邮箱地址和授权码进行连接测试。列表查询使用企业微信提供方，结果可能包含其他企业微信通道类型，不要求预先存在邮箱实例。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
import os

import moi_product_sdk as sdk


def main():
    client = sdk.new_with_personal_access_token(
        os.environ["PRODUCT_API_BASE_URL"], os.environ["PRODUCT_API_KEY"]
    )
    service = client.workspace(os.environ["WORKSPACE_ID"]).agents()
    instances = service.list_channel_instances("wecom")
    print("实例总数:", instances.total)
    for instance in instances.items:
        print(instance.id, instance.name, instance.channel_type,
              instance.last_test_status)

    request = sdk.ChannelInstanceCreateRequest(
        channel_type="wecom_mail",
        config={"email": os.environ["WECOM_MAIL_EMAIL"], "timeout_seconds": "30"},
        secrets={"password": os.environ["WECOM_MAIL_PASSWORD"]},
    )
    result = service.test_channel_configuration("wecom", request)
    print("测试通过:", result.ok, "执行状态:", result.status)
    print("最近测试状态:", result.last_test_status, "测试时间:", result.last_tested_at)
    if not result.ok or result.last_test_status != "succeeded":
        print("失败原因:", result.last_test_error)
        print("错误代码:", result.error_code, "修复建议:", result.suggestion)
        raise SystemExit(1)
    print("邮箱连接测试通过；配置尚未保存。")


if __name__ == "__main__":
    main()
```

::::

::::{tab-item} Go
:sync: go

```go
package main

import (
	"context"
	"fmt"
	"os"

	sdk "github.com/matrixorigin/matrixflow/sdk/go-sdk"
)

func requiredEnv(name string) string {
	value := os.Getenv(name)
	if value == "" {
		panic("请设置环境变量 " + name)
	}
	return value
}

func main() {
	ctx := context.Background()
	client, err := sdk.NewWithPersonalAccessToken(
		requiredEnv("PRODUCT_API_BASE_URL"), requiredEnv("PRODUCT_API_KEY"),
	)
	if err != nil {
		panic(err)
	}
	workspace, err := client.Workspace(requiredEnv("WORKSPACE_ID"))
	if err != nil {
		panic(err)
	}
	service := workspace.Agents()
	instances, err := service.ListChannelInstances(ctx, "wecom")
	if err != nil {
		panic(err)
	}
	fmt.Println("实例总数:", instances.Total)
	for _, instance := range instances.Items {
		fmt.Println(instance.ID, instance.Name, instance.ChannelType, instance.LastTestStatus)
	}

	request := sdk.ChannelInstanceCreateRequest{
		ChannelType: "wecom_mail",
		Config: map[string]string{
			"email": requiredEnv("WECOM_MAIL_EMAIL"), "timeout_seconds": "30",
		},
		Secrets: map[string]string{"password": requiredEnv("WECOM_MAIL_PASSWORD")},
	}
	result, err := service.TestChannelConfiguration(ctx, "wecom", request)
	if err != nil {
		panic(err)
	}
	fmt.Println("测试通过:", result.OK, "执行状态:", result.Status)
	fmt.Println("最近测试状态:", result.LastTestStatus, "测试时间:", result.LastTestedAt)
	if !result.OK || result.LastTestStatus != "succeeded" {
		fmt.Println("失败原因:", result.LastTestError)
		fmt.Println("错误代码:", result.ErrorCode, "修复建议:", result.Suggestion)
		os.Exit(1)
	}
	fmt.Println("邮箱连接测试通过；配置尚未保存。")
}
```

::::

:::::

(sdk-ai-studio-channels-action-2)=
(sdk-ai-studio-channels-limit)=
(sdk-ai-studio-channels-next)=
(sdk-ai-studio-channels-test-result)=
## 查看测试结果

测试通过标记为真且最近测试状态为 succeeded 时，程序输出“邮箱连接测试通过；配置尚未保存”。失败时输出原因、错误代码和修复建议，并以非零状态退出。

本次结果与已保存实例列表中的最近测试状态分别读取。测试会访问外部邮箱服务；通过后可按[创建邮箱实例](../../../../guides/ai-studio/agents/tools/configuration/wecom/mail.md#moi)保存配置，再绑定和验证收发。
