2009-07-16 19 views
6

Szukam sposobu na utworzenie wiadomości e-mail w formacie HTML z aplikacji OS X Cocoa.Jak mogę wysłać wiadomość HTML z Cocoa?

Mój preferowany przepływ pracy to: Użytkownik wybiera pozycję menu i otwiera domyślną aplikację pocztową z wstępnie wypełnioną nową wiadomością e-mail na pierwszym planie.

Jestem w stanie to zrobić z mailto i - [NSWorkspace openURL] dla zwykłych wiadomości tekstowych, ale to nie działa dla wiadomości e-mail w formacie HTML.

+0

Kilka źródeł: http://cocoaheads.byu.edu/resources/email –

+0

Jakieś wiadomości na ten temat? –

Odpowiedz

10

Ja też się tym interesowałem, więc przez dwa dni pracowałem nad wersją wsteczną funkcji "Zawartość e-mailowa tej strony" w programie Safari, a ja działałem.

UPDATE: poprawiłem kod i umieścić go na 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); 
} 
} 

Ten kod nie sprawdza, czy Poczta działa, więc to tylko działać, gdy poczta jest już uruchomiona.

Pro strona tego podejścia, która działa ze wszystkimi klientami poczty e-mail, które implementują MailLinkSupported i MailPageSupported. Zobacz QA1722.

Wadą jest to, że nie można ustawić odbiorców tak jak z mailto. W tym celu jedynym rozwiązaniem jest Mostek Skryptów. Zobacz zmodyfikowane SBSendEmail sample.

+0

Dzięki Chris. Co znajduje się w BaseURL w metodzie ATMailHelper? – lostInTransit

+0

Plik używany do rozstrzygania względnych adresów URL w dokumencie. Potrzebujesz tego na wypadek, gdyby Twoja poczta html była przesyłana jako obrazy, które nie są pobierane z internetu. – catlan

+0

Nie mam żadnych zdjęć. Co wtedy wkładam? Zauważono, że bez podstawowego adresu podstawowego, WebResource nie zostanie utworzone – lostInTransit

3

Nie ma standardowego sposobu wykonywania skomplikowanych interakcji z arbitralnymi klientami poczty e-mail. Będziesz musiał osobno zająć się każdą aplikacją, którą chcesz wspierać, i sprawdzić, czy ma sposób na ustawienie formatu wiadomości e-mail - najprawdopodobniej za pośrednictwem Applescript - i następnie wykryć domyślną funkcję obsługi mailto i uruchomić odpowiedni kod. W przypadku niektórych klientów poczty e-mail może nie być to możliwe (tak jak niektórzy klienci nie mają obsługiwanego sposobu otwierania nowego e-maila z załącznikiem).

+0

Doszedłem do tego samego wniosku po przeprowadzeniu rozległych wyszukiwań w Internecie. Obecnie próbuję rozwiązania Mail.app za pośrednictwem mostu Scripting Bridge, ale do tej pory nie udało mi się ustawić tekstu/html jako treści wiadomości. Jeśli kiedykolwiek znajdę rozwiązanie, dodam go do tego pytania. –

0

Dustin Bachrach pisał eleganckie (choć niekompletne) rozwiązanie here

To wymaga trochę APPLESCRIPT, więc trzeba by utworzyć inny skrypt dla każdej aplikacji poczty chcesz wspierać, ale to wydaje się być łatwe do zrobienia.

Należy również znaleźć domyślną aplikację pocztową użytkowników, którą można wykonać, tworząc adres URL mailto:, a następnie użyć LaunchServices LSGetApplicationForURL():, aby zwrócić domyślnego klienta poczty e-mail.

Powiązane problemy