I was also interested in this, so two days of reverse engineering Safaris "Mail Contents of this Page", and I got it working.
UPDATE: I improved the code and put it on 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); } }
This code does not check if Mail works, so it only works when Mail starts.
The pro side of this approach is that it works with all email clients that implement MailLinkSupported and MailPageSupported. See QA1722 .
The disadvantage is that you cannot set recipients, for example, using mailto . For this, the Scripting Bridge seems to be the only solution. See This Modified SBSendEmail Sample .
catlan
source share