如何避免图像重定位使用带有HTML内容的NSSharingService发送电子邮件

时间:2014-07-18 08:34:29

标签: objective-c macos html-email

我正在尝试使用Mac应用程序中的NSSharingService发送电子邮件。我将HTML代码包含为电子邮件正文。出现“邮件”窗口时,将对内容进行格式化,但HTML结构中的图像将移至底部电子邮件中。此外,即使我将此图像定义为链接,也不会在电子邮件正文中执行链接。

这是我正在使用的代码:

NSString* htmlText = @"<html><body><p>Message body</p><br/><a href='http://www.google.com'><img border='0' src=http://blog.jimdo.com/wp-content/uploads/2014/01/tree-247122.jpg label='Video' width='512' height='512'></img></a><br/><p>Video: <a href='http://blog.jimdo.com/wp-content/uploads/2014/01/tree-247122.jpg'>http://blog.jimdo.com/wp-content/uploads/2014/01/tree-247122.jpg</a></p><br/><p>Another link to <a href='http://www.google.com' target='_blank'>google</a></p></body></html>";

NSData* textData = [NSData dataWithBytes:[htmlText UTF8String] length:[htmlText lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
NSAttributedString* textAttributedString = [[NSAttributedString alloc] initWithHTML:textData options:nil documentAttributes:nil];


NSSharingService *emailSharingService = [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeEmail];
[emailSharingService setSubject:@"Subject"];

emailSharingService.delegate = self;

NSArray* shareItems = [NSArray arrayWithObjects: textAttributedString, nil];

[emailSharingService performWithItems:shareItems];

图像应出现在“消息正文”文本行之后和“视频:...”之前,但在我的情况下它出现在底部。

HTML代码在Firefox和Safari上测试。此外,我可以使用Safari打开HTML文本,然后选择“文件 - >分享 - >通过电子邮件发送此页面”,它正是我正在尝试做的事情(但使用Safari,而不是我的应用程序)。

任何想法都很好。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

我使用NSSharingService进行了各种测试,包括连接nsattributedstrings和使用NSTextAttachment,但似乎NSSharingService(或NSAttributedString)总是将图像推送到最后。

尝试使用Apple Scripting网桥。

答案 1 :(得分:2)

这是一个非常古老的问题,但似乎没有找到答案,因为它被问及截至目前(xCode 7 OSX 10.11),问题仍然存在。

我找到的解决方案有点像黑客,但它保持简单和工作(使用mail.app)所以我认为它仍然可以帮助将来的人。

我没有使用NSAttributed字符串,而是在伪URL中编码包含HTML文本的变量。这使得mail.app将其视为附件,我发现它在html <a>标记中显示其内容,就像它是内部超链接一样。

这是我使用的代码(在Swift中):

 var eMailService:NSSharingService! = NSSharingService(named:NSSharingServiceNameComposeEmail)

 eMailService.subject = mySubject

 let message         = "<html><body>Message body ...</body></html>"     
 let embeddedMessage = "</a>" + message 
 if let encodedMessage  = embeddedMessage.stringByAddingPercentEncodingWithAllowedCharacters
                                        (NSCharacterSet.alphanumericCharacterSet()),
    let urlMessage = NSURL(string:encodedMessage)!
 { 
   eMailService.performWithItems([urlMessage])
 }  

注意1:我在嵌入式邮件开头插入的“/ a”标签是为了防止整个html内容突出显示为超链接(因为mail.app将我的URL放在“a”标签内,我只是关闭它。)

注意2:这会导致NSSharingService抱怨URL不是绝对的(在日志中),但它仍然在电子邮件中正确插入。我可以通过在插入的“/ a”标签之前添加“data:”来消除此错误,但随后“数据:”出现在电子邮件上(我不喜欢)。