我正在寻找一种从OS X Cocoa应用程序创建HTML格式的电子邮件的方法。
我首选的工作流程是:用户选择一个菜单项,打开默认邮件应用程序,并在前台打开预先填写的新电子邮件。
我可以使用mailto和 - [NSWorkspace openURL]来处理纯文本电子邮件,但这不适用于HTML电子邮件。
答案 0 :(得分:10)
我对此也很感兴趣,所以两天逆向工程Safaris的“本页邮件内容”功能,我开始工作。
更新:我改进了代码并将其置于GitHub
- (void)mailWebArchive:(WebArchive *)webArchive title:(NSString *)aTitle URL:(NSString *)aURL {
NSString *bundleID = @"com.apple.mail";
NSData* targetBundleID = [bundleID dataUsingEncoding:NSUTF8StringEncoding];
NSAppleEventDescriptor *targetDescriptor = nil;
NSAppleEventDescriptor *appleEvent = nil;
targetDescriptor = [NSAppleEventDescriptor descriptorWithDescriptorType:typeApplicationBundleID
data:targetBundleID];
appleEvent = [NSAppleEventDescriptor appleEventWithEventClass:'mail'
eventID:'mlpg'
targetDescriptor:targetDescriptor
returnID:kAutoGenerateReturnID
transactionID:kAnyTransactionID];
[appleEvent setParamDescriptor:[NSAppleEventDescriptor descriptorWithDescriptorType:'tdta'
data:[webArchive data]]
forKeyword:'----'];
[appleEvent setParamDescriptor:[NSAppleEventDescriptor descriptorWithString:aTitle]
forKeyword:'urln'];
[appleEvent setParamDescriptor:[NSAppleEventDescriptor descriptorWithString:aURL]
forKeyword:'url '];
NSAppleEventDescriptor *replyDescriptor = nil;
NSAppleEventDescriptor *errorDescriptor = nil;
AEDesc reply = { typeNull, NULL };
// Send the AppleEvent
OSStatus status = AESendMessage([appleEvent aeDesc],
&reply,
kAEWaitReply,
kAEDefaultTimeout);
if(status == noErr)
{
replyDescriptor = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
errorDescriptor = [replyDescriptor paramDescriptorForKeyword:keyErrorNumber];
if(errorDescriptor != nil)
status = [errorDescriptor int32Value];
if(status != noErr)
NSLog(@"%s error %d", _cmd, status);
}
}
此代码不会检查Mail是否正在运行,因此它仅在Mail已启动时才有效。
这种方法的专业方面,它适用于实现MailLinkSupported和MailPageSupported的所有电子邮件客户端。请参阅QA1722。
缺点是您无法使用mailto
设置收件人。为此,Scripting Bridge似乎是唯一的解决方案。请参阅此修改后的SBSendEmail sample。
答案 1 :(得分:3)
没有标准的方法可以与任意电子邮件客户端进行复杂的交互。您必须单独处理要支持的每个应用程序,并查看它是否有办法设置电子邮件格式 - 最有可能通过Applescript - 然后检测默认的mailto处理程序是什么并运行相应的代码。对于某些电子邮件客户端,可能无法实现(就像某些客户端没有受支持的方式来打开带附件的新电子邮件一样)。
答案 2 :(得分:0)
Dustin Bachrach发布了一个优雅(但不完整)的解决方案here
它需要一些苹果脚本,因此您必须为要支持的每个邮件应用程序创建不同的脚本,但这似乎很容易。
您还需要找到用户默认邮件应用,可以通过构建mailto:
网址然后使用LaunchServices LSGetApplicationForURL():
返回默认电子邮件客户端来完成。