如何将Apple MailKit扩展中的邮件正文转换为可读格式?
解决Apple MailKit扩展中Quoted-Printable编码文本解析问题
你不需要自己实现复杂的编码解析逻辑,Foundation框架提供了内置方法可以处理完整的Quoted-Printable编码文本,以下是两种可行方案:
方案一:直接解码Quoted-Printable字符串
使用NSString的stringByDecodingQuotedPrintable方法,它能自动处理跨换行的编码片段(比如你例子中的=C3=\n=9F),支持完整文本解析:
func allowMessageSendForSession(_ session: MEComposeSession, completion: @escaping (Error?) -> Void) { let mailMessage = session.mailMessage let subject = mailMessage.subject let sender = mailMessage.fromAddress.addressString ?? "undefined" if let rawData = mailMessage.rawData, let encodedText = String(data: rawData, encoding: .utf8) { // 解码Quoted-Printable编码文本 let decodedText = (encodedText as NSString).stringByDecodingQuotedPrintable print(decodedText) // 输出可读的邮件内容 } completion(nil) }
方案二:直接解析完整MIME邮件数据
如果邮件包含多种编码格式(比如同时存在Quoted-Printable和Base64),可以用NSAttributedString直接解析MIME格式的原始数据,自动处理所有编码并提取纯文本:
func allowMessageSendForSession(_ session: MEComposeSession, completion: @escaping (Error?) -> Void) { let mailMessage = session.mailMessage let subject = mailMessage.subject let sender = mailMessage.fromAddress.addressString ?? "undefined" if let rawData = mailMessage.rawData { do { let parseOptions: [NSAttributedString.DocumentReadingOptionKey: Any] = [ .documentType: NSAttributedString.DocumentType.mime, .characterEncoding: String.Encoding.utf8.rawValue ] // 解析MIME数据为富文本 let attributedContent = try NSAttributedString(data: rawData, options: parseOptions, documentAttributes: nil) // 提取纯文本内容 let plainTextContent = attributedContent.string print(plainTextContent) } catch { print("邮件内容解析失败:\(error.localizedDescription)") } } completion(nil) }
方案二的优势在于无需单独处理编码类型,框架会自动识别并解析邮件中的各种MIME编码格式,更适合处理完整的邮件内容。
内容的提问来源于stack exchange,提问作者Michael Malura
相关产品推荐
相关产品推荐

