You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用集成:将Swiftmailer Swift_Message转换为\MailSo\Mime\Message

嘿,我完全懂你现在的困惑——要从SwiftMailer的Swift_Message里抠出关键信息转成MailSo\Mime\Message,不用全盘转换,只抓主题、正文这些核心部分,确实容易被各个模块的逻辑绕晕。我帮你拆解成一个个小步骤,每个部分都给你具体的代码片段,跟着来就好啦~

分步提取关键信息并构建MailSo消息

1. 基础信息:主题与正文

首先是最直观的主题和正文,Swift_Message提供了直接的方法获取,不过正文要注意区分纯文本和HTML两种格式:

  • 主题:直接调用getSubject()就能拿到,然后传给MailSo消息的SetSubject()方法。
  • 正文:Swift的消息正文可能是纯文本,也可能包含HTML替代部分。我们可以先拿主内容作为纯文本,再遍历子部分找到HTML内容:
// 初始化MailSo消息
$mailSoMessage = new \MailSo\Mime\Message();

// 设置主题
$mailSoMessage->SetSubject($swiftMessage->getSubject());

// 提取纯文本正文
$plainTextBody = $swiftMessage->getBody();
$mailSoMessage->SetBody($plainTextBody);

// 提取HTML正文(如果存在)
$htmlBody = null;
foreach ($swiftMessage->getChildren() as $mimePart) {
    if ($mimePart instanceof Swift_MimePart && $mimePart->getContentType() === 'text/html') {
        $htmlBody = $mimePart->getBody();
        break;
    }
}

if ($htmlBody) {
    $mailSoMessage->SetHtml($htmlBody);
}

2. 收件人、抄送、密送

这三类收件人的处理逻辑几乎一致,Swift_Message的getTo()、getCc()、getBcc()都会返回邮箱地址为键、显示名称为值的关联数组,我们只需要遍历数组,创建MailSo的EmailAddress实例并添加到消息里:

// 封装一个复用的添加收件人函数,避免重复代码
$addRecipients = function ($recipientList, $addMethod) use ($mailSoMessage) {
    if (empty($recipientList)) return;
    foreach ($recipientList as $email => $displayName) {
        $mailSoMessage->$addMethod(new \MailSo\Mime\EmailAddress($email, $displayName));
    }
};

// 分别添加收件人、抄送、密送
$addRecipients($swiftMessage->getTo(), 'AddTo');
$addRecipients($swiftMessage->getCc(), 'AddCc');
$addRecipients($swiftMessage->getBcc(), 'AddBcc');

3. 附件处理

Swift的附件都存放在消息的子部分里,我们只需要遍历getChildren()结果,筛选出Swift_Attachment类型的实例,然后转成MailSo的Attachment对象:

foreach ($swiftMessage->getChildren() as $mimePart) {
    if ($mimePart instanceof Swift_Attachment) {
        $mailSoAttachment = new \MailSo\Mime\Attachment();
        
        // 设置附件文件名、内容和MIME类型
        $mailSoAttachment->SetFileName($mimePart->getFilename());
        $mailSoAttachment->SetContent($mimePart->getBody());
        $mailSoAttachment->SetContentType($mimePart->getContentType());
        
        // 添加到MailSo消息中
        $mailSoMessage->AddAttachment($mailSoAttachment);
    }
}

额外提示

如果你的Swift消息里有内嵌图片(比如带CID引用的图片),它们属于Swift_Image类型,如果不需要处理这类资源,可以直接忽略;如果需要的话,只需要把上面的Swift_Attachment换成Swift_Image,然后用MailSo的AddEmbeddedAttachment()方法添加即可。


内容的提问来源于stack exchange,提问作者Rodrigo Santellan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:11