Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
在 Symfony 5 中灵活实现同步与异步邮件发送_创想鸟

在 Symfony 5 中灵活实现同步与异步邮件发送

在 Symfony 5 中灵活实现同步与异步邮件发送

本教程详细介绍了如何在 symfony 5 应用程序中同时实现同步和异步邮件发送。通过利用 symfony messenger 组件的强大功能,我们将学习如何定义自定义消息类和处理器,精确控制邮件的发送方式,从而优化用户体验和系统性能,避免邮件发送阻塞主线程。

在现代 Web 应用中,邮件发送是常见需求。根据场景不同,有时需要即时发送(同步),有时则允许后台处理(异步),以避免阻塞用户界面或长时间运行的任务。Symfony 框架通过其 Mailer 和 Messenger 组件提供了强大的邮件发送能力,但要同时实现同步和异步发送,需要对 Messenger 的工作原理有清晰的理解。

本文将指导您如何在 Symfony 5 应用中优雅地实现这一目标,确保您能根据业务需求灵活选择邮件发送模式。

理解挑战

在 Symfony 中,默认情况下,当您使用 MailerInterface::send() 方法时,邮件是同步发送的。为了实现异步发送,通常会结合 Symfony Messenger 使用。Symfony 提供了一个内置的 SymfonyComponentMailerMessengerSendEmailMessage 消息类,用于将 TemplatedEmail 对象包装成一个 Messenger 消息。

如果您直接在 Messenger 配置中路由这个内置消息:

# config/packages/messenger.yamlframework:    messenger:        transports:            async: '%env(MESSENGER_TRANSPORT_DSN)%'        routing:            'SymfonyComponentMailerMessengerSendEmailMessage': async

这会导致所有通过 MailerInterface::send() 发送的邮件都被 Messenger 捕获并推送到 async 队列,因为 MailerInterface 内部会检查是否存在 Messenger 且 SendEmailMessage 是否被路由。这使得无法同时发送同步邮件。

为了实现灵活的同步/异步发送,我们需要一种机制来明确区分哪些邮件应该异步发送,哪些应该同步发送。解决方案是为异步邮件创建自定义消息和处理器。

步骤一:定义异步邮件消息

首先,我们需要创建一个自定义消息类,它将封装所有发送异步邮件所需的数据。这个消息类应该是一个简单的 PHP 对象,包含邮件的主题、正文模板、收件人、上下文等信息。

src/Message/EmailAsync.php

subject = $subject;        $this->bodyHtmlTemplate = $bodyHtmlTemplate;        $this->bodyTextTemplate = $bodyTextTemplate;        $this->recipient = $recipient;        $this->context = $context;        $this->senderEmail = $senderEmail;    }    // 为所有属性生成公共的 getter 方法    public function getSubject(): string    {        return $this->subject;    }    public function getBodyHtmlTemplate(): string    {        return $this->bodyHtmlTemplate;    }    public function getBodyTextTemplate(): ?string    {        return $this->bodyTextTemplate;    }    public function getRecipient(): string    {        return $this->recipient;    }    public function getContext(): array    {        return $this->context;    }    public function getSenderEmail(): string    {        return $this->senderEmail;    }}

这个 EmailAsync 类只是一个数据容器,不包含任何发送逻辑。

步骤二:创建异步邮件处理器

接下来,我们需要为 EmailAsync 消息创建一个处理器。当 Messenger 接收到 EmailAsync 消息时,它会调用这个处理器来执行实际的邮件发送操作。

src/MessageHandler/EmailAsyncHandler.php

mailer = $mailer;    }    public function __invoke(EmailAsync $emailMessage)    {        // 从 EmailAsync 消息中提取邮件数据        $subject = $emailMessage->getSubject();        $bodyHtmlTemplate = $emailMessage->getBodyHtmlTemplate();        $bodyTextTemplate = $emailMessage->getBodyTextTemplate();        $recipient = $emailMessage->getRecipient();        $context = $emailMessage->getContext();        $senderEmail = $emailMessage->getSenderEmail();        // 构建 Symfony TemplatedEmail 对象        $emailToSend = (new TemplatedEmail())            ->from(new Address($senderEmail)) // 使用消息中提供的发件人            ->to(new Address($recipient))            ->subject($subject)            ->htmlTemplate($bodyHtmlTemplate)            ->context($context);        if ($bodyTextTemplate) {            $emailToSend->textTemplate($bodyTextTemplate);        }        // 通过 MailerInterface 发送邮件        $this->mailer->send($emailToSend);    }}

EmailAsyncHandler 实现了 MessageHandlerInterface 接口,并通过 __invoke 方法处理 EmailAsync 消息。在这个方法中,它使用注入的 MailerInterface 来构建并发送 TemplatedEmail。

步骤三:配置 Messenger 路由

现在,我们需要告诉 Symfony Messenger,当它遇到 AppMessageEmailAsync 类型的消息时,应该将其路由到哪个传输层(transport)。

config/packages/messenger.yaml

framework:    messenger:        transports:            # 定义一个异步传输层,例如使用 Doctrine 数据库或 RabbitMQ            # DSN 可以来自环境变量,例如 MESSENGER_TRANSPORT_DSN="doctrine://default?queue_name=async_emails"            async: '%env(MESSENGER_TRANSPORT_DSN)%'        routing:            # 将自定义的 EmailAsync 消息路由到异步传输层            'AppMessageEmailAsync': async            # 重要:确保 SymfonyComponentMailerMessengerSendEmailMessage 没有被路由到异步传输            # 这样直接使用 MailerInterface::send() 就会是同步的            # 如果之前有配置,请移除或确保它不指向异步队列            # 'SymfonyComponentMailerMessengerSendEmailMessage': null # 或者完全不配置此项

通过此配置,只有 AppMessageEmailAsync 消息才会被推送到 async 队列。而其他未被路由的消息(包括 SymfonyComponentMailerMessengerSendEmailMessage)将由 Messenger 的默认行为处理,即同步发送(如果没有其他处理器或路由规则)。

步骤四:在服务中发送异步邮件

在您的应用程序服务中,当您需要发送异步邮件时,您将注入 MessageBusInterface 并调度 EmailAsync 消息。

src/Service/MailManagerAsync.php

bus = $bus;    }    /**     * 异步发送邮件。     *     * @param string      $subject            邮件主题     * @param string      $bodyHtmlTemplate   HTML 邮件模板路径     * @param string|null $bodyTextTemplate   纯文本邮件模板路径 (可选)     * @param string      $to                 收件人邮箱地址     * @param array       $context            传递给 Twig 模板的变量     * @param string      $senderEmail        发件人邮箱地址 (可选,默认为配置值)     */    public function sendAsyncEmail(        string $subject,        string $bodyHtmlTemplate,        ?string $bodyTextTemplate,        string $to,        array $context = [],        string $senderEmail = 'no-reply@yourdomain.com'    ): void {        $emailAsync = new EmailAsync(            $subject,            $bodyHtmlTemplate,            $bodyTextTemplate,            $to,            $context,            $senderEmail        );        $this->bus->dispatch($emailAsync);    }}

现在,当您调用 MailManagerAsync::sendAsyncEmail() 方法时,邮件不会立即发送,而是被封装成 EmailAsync 消息,并推送到 Messenger 队列中等待后台处理。

步骤五:发送同步邮件

对于需要同步发送的邮件,您只需直接注入 MailerInterface 并使用其 send() 方法,无需涉及 Messenger。

src/Service/MailManagerSync.php

mailer = $mailer;        $this->defaultSenderEmail = $defaultSenderEmail;    }    /**     * 同步发送邮件。     *     * @param string      $subject            邮件主题     * @param string      $bodyHtmlTemplate   HTML 邮件模板路径     * @param string|null $bodyTextTemplate   纯文本邮件模板路径 (可选)     * @param string      $to                 收件人邮箱地址     * @param array       $context            传递给 Twig 模板的变量     * @param string|null $senderEmail        发件人邮箱地址 (可选,默认为配置值)     */    public function sendSyncEmail(        string $subject,        string $bodyHtmlTemplate,        ?string $bodyTextTemplate,        string $to,        array $context = [],        ?string $senderEmail = null    ): void {        $email = (new TemplatedEmail())            ->from(new Address($senderEmail ?? $this->defaultSenderEmail))            ->to(new Address($to))            ->subject($subject)            ->htmlTemplate($bodyHtmlTemplate)            ->context($context);        if ($bodyTextTemplate) {            $email->textTemplate($bodyTextTemplate);        }        $this->mailer->send($email);    }}

通过这种方式,MailManagerSync 服务会立即发送邮件,而不会进入任何队列。

总结与注意事项

通过上述方法,您已经成功地在 Symfony 5 应用程序中实现了同步和异步邮件发送的灵活控制:

异步邮件:通过创建自定义的 EmailAsync 消息和 EmailAsyncHandler 处理器,并将其路由到 Messenger 的异步传输层。您的服务通过 MessageBusInterface 调度这些消息。同步邮件:直接通过 MailerInterface 发送邮件,不涉及 Messenger,确保邮件立即发送。

注意事项:

Messenger Worker:为了处理异步邮件,您需要运行 Messenger worker。在生产环境中,这通常通过 Supervisor 或 Systemd 等进程管理器来管理:

php bin/console messenger:consume async

错误处理与重试:Messenger 组件提供了强大的错误处理和重试机制。您可以配置失败策略,例如在邮件发送失败时自动重试或将失败的消息发送到不同的队列进行人工审查。发件人地址:在实际应用中,发件人地址通常应从配置文件(如 services.yaml 或 parameters.yaml)中获取,而不是硬编码在代码中。模板路径:确保您的 Twig 模板路径正确无误。扩展性:这种模式具有良好的扩展性。如果未来有其他需要异步处理的任务,您也可以采用类似的消息和处理器模式。

通过这种清晰的分离,您的应用程序将能够更有效地管理邮件发送,提升用户体验并优化系统资源利用。

以上就是在 Symfony 5 中灵活实现同步与异步邮件发送的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1342130.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Laravel 8 路由中基于查询参数的条件控制器方法分发
上一篇 2025年12月13日 05:18:36
优化FacetWP:为“加载更多”按钮添加无限滚动机制
下一篇 2025年12月13日 05:18:46

相关推荐

  • x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法

    x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法

    1、打开x浏览器加载网页后,点击右上角三点菜单选择“查看源代码”即可显示HTML源码;2、长按页面链接可在快捷菜单中查找“查看源代码”选项快速访问;3、启用开发者工具模式后可通过“检查元素”功能进行更深入的页面结构分析。 如果您在浏览网页时需要查看页面的HTML源代码,以便分析结构或调试内容,可以通…

    2026年9月24日 • 用户投稿
    000
  • Java中实现州府问答系统:2D数组管理、排序与用户输入验证

    Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证

    本教程详细介绍了如何使用Java构建一个州府问答系统。内容涵盖了使用二维数组存储州名及其首都数据、实现冒泡排序对数据按首都名称进行排序、以及如何通过用户输入验证机制,处理大小写不敏感的答案,并最终统计正确率。文章提供了完整的代码示例和关键注意事项,帮助读者理解并实现类似的数据结构与算法应用。 1. …

    2026年9月24日 • 用户投稿
    100
  • sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置

    sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置

    首先安装Package Control,再通过命令面板安装EditorConfig插件,确保项目根目录有.editorconfig文件,重启后即可自动应用格式规则。 Sublime Text 本身不内置支持 EditorConfig,但可以通过安装插件来实现对 .editorconfig 文件的识别…

    2026年9月24日 • 用户投稿
    100
  • 《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!

    《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!

    今日,国产类魂游戏《明末:渊虚之羽》官方通过社交平台x宣布,1.5版本更新即将上线主机平台。 官方在推文中指出:“1.5版本补丁将于8月14日正式登陆Xbox Series X|S与PlayStation 5平台!更多详细信息将陆续公开,请持续关注。” 此前,该版本已率先在PC平台推出,主要内容更新…

    2026年9月24日 • 用户投稿
    000
  • 使用 Rest Assured 创建泛型 JSONPath 值提取函数

    使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数

    本文探讨如何在 Rest Assured 中设计一个泛型工具函数,以实现类型安全的 JSONPath 值提取。针对直接使用 T.class 导致的编译错误,文章提供了通过将 Class 作为参数传入的解决方案,有效规避了 Java 泛型擦除问题,从而实现灵活、可复用的 JSON 数据解析。 泛型 J…

    2026年9月24日 • 用户投稿
    000
  • x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法

    x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法

    首先通过X浏览器设置进入密码管理,再选择具体网站查看账号密码。操作路径为:打开X浏览器→点击菜单→进入设置→选择安全及隐私→点击站点密码管理→找到目标网站→点击编辑→查看明文账号密码,全过程需通过设备验证。 如果您在使用X浏览器时启用了密码保存功能,但需要查看已存储的账号信息,则可以通过浏览器内置的…

    2026年9月24日 • 用户投稿
    000
  • 怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    python内存泄漏可通过tracemalloc、objgraph及代码分析定位。1. 使用tracemalloc模块记录内存分配堆栈,生成快照并输出统计结果,交由豆包ai分析可疑内存泄漏点;2. 用objgraph查看常见对象类型及增长趋势,若发现异常增长对象可交由豆包判断是否合理;3. 将疑似泄…

    2026年9月24日 • 用户投稿
    000
  • 抖音双11好物节有哪些优惠活动?双11抖音有什么活动

    抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动

    一年一度的双11购物狂欢节即将来临,抖音平台也紧跟潮流,推出了抖音双11好物节活动。这次活动可谓是优惠满满,好物多多,让广大消费者在购物的同时,也能享受购物的乐趣。下面,就让我为大家详细介绍一下2025年抖音双11好物节的优惠活动吧! 一、抖音双11好物节活动时间 活动周期:2025年9月16日(中…

    2026年9月24日 • 用户投稿
    000
  • 如何验证厂商宣传的散热技术是否切实有效?

    如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?

    要验证散热技术是否有效,需结合产品规格、第三方评测、用户反馈及自行测试。首先查看热管数量与材质、均热板设计、风扇风量与静压等真实参数,警惕模糊宣传;其次参考专业媒体在标准环境下的烤机测试数据,如AIDA64或FurMark负载下的温度与频率表现;再通过电商平台或论坛收集长期使用反馈,关注共性问题如噪…

    2026年9月24日 • 用户投稿
    000
  • 抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!

    抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!

    一、抖音账号被封的常见原因 (一)是否因他人举报导致封号? 1. 一次举报会怎样?当一个抖音账号被用户举报时,平台通常不会立即采取严厉措施。首次举报多数情况下只会触发系统警告。例如,若发布的视频涉及轻微版权问题或存在争议性言论,虽未明显违规,但经他人举报后,可能会收到平台提醒。2. 多次举报的严重后…

    2026年9月24日 • 用户投稿
    200
  • 如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​

    如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​

    豆包 ai 大模型与 ai 聚会游戏设计工具结合,能有效提升聚会互动性和趣味性。1. 可用豆包 ai 生成个性化问题或话题,如搞笑类、回忆类等,帮助破冰交流;2. 结合聚会游戏工具,利用 ai 生成的关键词或背景设定定制专属小游戏,增强即兴互动;3. 借 ai 生成角色设定和剧情线索,营造角色扮演氛…

    2026年9月24日 • 用户投稿
    100
  • 夸克网盘怎么分享文件_文件分享链接创建与管理

    夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理

    夸克网盘支持通过生成链接或二维码分享文件。首先打开夸克App进入网盘页面,长按选中文件后点击“分享”,可选择公开或私密模式并设置有效期(1天、7天或永久),生成链接后系统自动复制到剪贴板。已生成的链接可在“我的分享”页面管理,支持修改有效期、更改密码或停止分享。此外,还可通过“二维码分享”功能生成二…

    2026年9月24日 • 用户投稿
    100
  • mysql数据库中的自增列如何使用

    自增列是MySQL中用于自动产生唯一数值的整数列,通常作为主键使用。通过AUTO_INCREMENT属性,插入数据时若未指定值,系统会自动分配比当前最大值大1的数值,确保每条记录拥有唯一标识,简化插入操作。创建表时可定义自增列,如:CREATE TABLE users (id INT AUTO_IN…

    2026年9月24日
    100
  • 如何高效管理Debian文件系统

    高效管理debian文件系统可以通过以下几个步骤来实现: 了解文件系统结构: Debian文件系统遵循标准的Linux文件系统层次结构,例如/bin, /etc, /home, /usr, /var等。熟悉这些目录的作用,有助于更好地组织和管理文件。 磁盘空间管理: 使用df -h命令查看磁盘空间使…

    2026年9月24日
    000
  • 高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略

    高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略

    本教程旨在指导开发者如何在Spring Boot项目中将WSDL(Web Services Description Language)文件转换为Java类,并成功消费SOAP(Simple Object Access Protocol)Web服务。文章将探讨常见的转换挑战,如wsimport兼容性问…

    2026年9月24日 • 用户投稿
    100
  • 怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​

    怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​怎样让 AI 家居设计工具与豆包配合打造理想家居?实用教程​

    使用ai家居设计工具与豆包配合能提升家装效率,具体步骤如下:1. 利用ai工具生成设计方案,上传户型图并设定风格偏好,快速获取多个装修效果图;2. 将ai输出结果整理至豆包,为每个房间建立页面,添加说明、表格及标签以便查阅;3. 结合豆包优化预算和采购计划,记录材料价格并比对市场价,设置提醒避免遗漏…

    2026年9月24日 • 用户投稿
    100
  • Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践Java中自定义与内置类同名冲突的解决方案:精确导入的实践

    本文探讨了Java中自定义类与内置类(如LinkedList)同名时引发的编译错误。当项目中同时存在自定义LinkedList和java.util.LinkedList时,程序可能错误地引用自定义实现,导致方法找不到。教程指出,通过精确导入java.util.LinkedList而非通配符java.…

    2026年9月24日 • 用户投稿
    200
  • 主板的供电相数是不是越多越好?

    主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?主板的供电相数是不是越多越好?

    供电相数并非越多越好,需结合CPU需求和整体设计选择。多相供电可提升稳定性与散热,尤其适合高负载或超频场景,如i7、i9或Ryzen 7/9处理器;但实际效果取决于用料质量,包括MOSFET、电感、电容等级,PWM控制器性能及散热设计。部分主板通过倍相器虚标相数,实际供电能力不足。普通用户搭配i5或…

    2026年9月24日 • 用户投稿
    200
  • fmhy官网安全访问_fmhy中文版官网入口

    fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口fmhy官网安全访问_fmhy中文版官网入口

    Fmhy中文版官网入口为https://fmhy.net/,平台提供影视、动漫、音乐、游戏、软件及教育等资源分类,支持多语言浏览并推荐使用FMHY SafeGuard插件保障安全,所有内容由全球志愿者通过GitHub协作维护,用户可通过Discord参与更新与反馈,确保资源链接的有效性与访问安全性。…

    2026年9月24日 • 用户投稿
    200
  • AI聊天助手有哪些_好用的AI聊天助手工具大全

    AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全AI聊天助手有哪些_好用的AI聊天助手工具大全

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆包:字节跳动推出的免费AI智能助手 问小白:免费AI智能助手,支持DeepSeek满血版 讯飞星火:AI智能助手,支持PPT生成、深度推理 逗逗:AI游戏陪玩,支持原神、黑神话、LOL! 立即…

    2026年9月24日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信