应用集成:将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
相关产品推荐
相关产品推荐

