2009-07-16 16 views
6

मैं ओएस एक्स कोको एप्लिकेशन से एक HTML स्वरूपित ईमेल बनाने का एक तरीका ढूंढ रहा हूं।मैं कोको से एक HTML ईमेल कैसे भेज सकता हूं?

मेरा पसंदीदा वर्कफ़्लो होगा: उपयोगकर्ता मेनू आइटम का चयन करता है और डिफ़ॉल्ट मेल एप्लिकेशन अग्रभूमि में प्री-भरे नए ईमेल के साथ खुलता है।

मैं सादा पाठ ईमेल के लिए मेलto और - [NSWorkspace openURL] के साथ ऐसा करने में सक्षम हूं, लेकिन यह HTML ईमेल के लिए काम नहीं करता है।

+0

कुछ संसाधन: http://cocoaheads.byu.edu/resources/email –

+0

इस मुद्दे पर कोई समाचार? –

उत्तर

10

मुझे इसमें भी रूचि थी, इसलिए दो दिनों के रिवर्स इंजीनियरिंग सफारीस 'इस पृष्ठ की मेल सामग्री' सुविधा और मुझे यह काम मिल गया।

अद्यतन: मैं कोड सुधार हुआ है और 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); 
} 
} 

इस कोड पर डाल दिया है, तो मेल चल रहा है की जाँच नहीं करता, तो यह केवल जब वर्किंग मेल पहले से ही शुरू कर दिया गया है है।

इस दृष्टिकोण का समर्थक पक्ष यह मेलबॉक्स द्वारा समर्थित सभी मेल क्लाइंट्स के साथ काम करता है जो समर्थित और मेलपेज समर्थित है। QA1722 देखें।

नकारात्मकता यह है कि आप प्राप्तकर्ताओं को mailto के साथ सेट नहीं कर सकते हैं। इसके लिए स्क्रिप्टिंग ब्रिज एकमात्र समाधान लगता है। यह संशोधित SBSendEmail sample देखें।

+0

धन्यवाद क्रिस। ATMailHelper विधि में baseURL में क्या जाता है? – lostInTransit

+0

एक फ़ाइल जो दस्तावेज़ के भीतर संबंधित यूआरएल को हल करने के लिए प्रयोग की जाती है। यदि आपको एचटीएमएल मेल उन छवियों के रूप में है जो वेब से डाउनलोड नहीं होते हैं तो आपको इसकी आवश्यकता है। – catlan

+0

मेरे पास कोई छवि नहीं है। तब मैं क्या रखूं? ध्यान दिया गया है कि baseURL के बिना, WebResource नहीं बनाया गया है – lostInTransit

3

मनमानी ईमेल क्लाइंट के साथ जटिल इंटरैक्शन करने का कोई मानक तरीका नहीं है। आपको प्रत्येक एप्लिकेशन को अलग से समर्थन करना होगा, और देखें कि क्या इसका ईमेल प्रारूप सेट करने का कोई तरीका है - अधिकांशतः एप्पलस्क्रिप्ट के माध्यम से - और तब पता लगाएं कि डिफ़ॉल्ट मेलटो हैंडलर क्या है और उचित कोड चलाता है। कुछ ईमेल क्लाइंट्स के लिए, यह संभव नहीं हो सकता है (जैसे कुछ क्लाइंट के पास अटैचमेंट के साथ एक नया ईमेल खोलने का कोई समर्थित तरीका नहीं है)।

+0

इंटरनेट पर व्यापक खोज करने के बाद मैं काफी निष्कर्ष पर आया था। मैं वर्तमान में स्क्रिप्टिंग ब्रिज के माध्यम से केवल Mail.app को हल करने का प्रयास कर रहा हूं, लेकिन अब तक मैं मेल सामग्री के रूप में एक समृद्ध टेक्स्ट/एचटीएमएल सेट करने में असफल रहा हूं। अगर मुझे कोई समाधान मिल जाए तो मैं इसे इस प्रश्न में जोड़ दूंगा। –

0

डस्टिन Bachrach एक सुंदर (लेकिन अधूरा) समाधान तैनात here

यह सेब स्क्रिप्ट का एक सा की जरूरत है, तो आप आप का समर्थन करना चाहते प्रत्येक मेल अनुप्रयोग के लिए एक अलग स्क्रिप्ट बनाने के लिए होता है, लेकिन यह एक तरह लगता है करने के लिए आसान बात है।

आपको उपयोगकर्ताओं को डिफ़ॉल्ट मेल ऐप भी ढूंढना होगा जो mailto: यूआरएल का निर्माण करके किया जा सकता है, फिर डिफ़ॉल्ट ईमेल क्लाइंट को वापस करने के लिए लॉन्च सर्विसेज LSGetApplicationForURL(): का उपयोग करें।

संबंधित मुद्दे

 संबंधित मुद्दे