问题 Base64 HTML嵌入图像在邮寄时不显示


我正在嵌入已经在HTML中编码base64的图像,如下所示:

[html appendFormat:@"<html><body><p><b><img src=\"data:image/png;base64,%@\"></b></p></body><html>", base64ImageString];

然后我创建一个新的电子邮件如下:

MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
mailVC.mailComposeDelegate = self;
[mailVC setMessageBody:html isHTML:YES];
[self presentModalViewController:mailVC animated:YES];

嵌入的图像会在发送之前显示在新电子邮件中,但不会显示在邮件传递到的任何电子邮件客户端中。我认为草图中正确显示的图像显示嵌入过程是成功的,但我不明白为什么它在交付时不显示。查看已发送邮件中的原始HTML显示:src =“cid:(null)”任何帮助将不胜感激!


12387
2018-01-12 14:28


起源

这个答案代码提到它对雅虎邮件有效。 stackoverflow.com/questions/1527351/... - Nik Burns
我得到了相同的结果。那是5.0.1,也许之前有用。 - dwery
@dwery我也在运行5.0.1。另外,遗憾的是,将HTML粘贴到电子邮件中也会在5.0.1下破坏 - RunLoop
会喜欢这个问题的任何更新。甚至非嵌入的图像,例如<img src =“http:// image”width =“410”height =“300”/>,转换为cid,然后对于收件人变为null - SG1
没有运气但我很害怕。然而,我确实成功地嵌入了链接的图像 - RunLoop


答案:


我偶然发现了同样的问题,解决方案相当复杂。可以在电子邮件中嵌入图像。问题是,由于一些奇怪的原因,base64编码的图像不能包含新行(超奇怪!我知道)。我猜你正在使用Matt Gallagher的NSData + Base64?我也是!此类别创建多行base64字符串。该类别中的代码是

- (NSString *)base64EncodedString
{
    size_t outputLength;
    char *outputBuffer =
        NewBase64Encode([self bytes], [self length], true, &outputLength);

    NSString *result =
        [[NSString alloc]
            initWithBytes:outputBuffer
            length:outputLength
            encoding:NSASCIIStringEncoding];
    free(outputBuffer);
    return result;
}

通过将NewBase64Encode的第三个参数替换为false,您将获得单行base64字符串,这对我有用。我最终在类别中创建了一个新功能(只是为了不打破其他任何东西!)。

- (NSString *)base64EncodedStringSingleLine
{
    size_t outputLength;
    char *outputBuffer =
    NewBase64Encode([self bytes], [self length], false, &outputLength);

    NSString *result =
    [[NSString alloc]
     initWithBytes:outputBuffer
     length:outputLength
     encoding:NSASCIIStringEncoding];
    free(outputBuffer);
    return result;
}

使用此函数对UIImage的NSData进行编码工作正常。我到目前为止测试的电子邮件客户端都显示了嵌入的图像。希望对你有帮助!

编辑:正如评论中所指出的,这个解决方案只是部分的。该图像将作为数据URI附加到电子邮件中。但是,并非所有电子邮件客户端都会显示嵌入的图像。


14
2018-05-07 11:10



我非常希望得到您的回复,但我刚刚在Gmail上进行了测试,但它无效。 - jcrowson
是的!图像就在那里。但是,似乎Gmail不支持数据URI。 - fsaint
我不得不将其取消标记,因为这样嵌入的图像不会显示在Outlook中,尽管它们确实显示在Mac上的Mail中。 - RunLoop
哎哟!!。使用数据URI与某些电子邮件客户端存在兼容性问题。然而,这是嵌入图像的技术的问题而不是我的答案中的问题。所使用的技术被定义为问题的一部分,我的答案是对我所说的正确答案。 - fsaint
精彩!适合我。 BTW Felz,你在返回结果时忘了自动释放。 - Ricardo