Как я могу отправить письмо по электронной почте из Какао? - PullRequest
6 голосов
/ 16 июля 2009

Я ищу способ создания электронной почты в формате HTML из приложения OS X Cocoa.

Мой предпочтительный рабочий процесс: пользователь выбирает пункт меню, и почтовое приложение по умолчанию открывается с предварительно заполненным новым письмом на переднем плане.

Я могу сделать это с mailto и - [NSWorkspace openURL] для простых текстовых писем, но это не работает для писем в формате HTML.

Ответы [ 3 ]

10 голосов
/ 24 декабря 2009

Меня это тоже заинтересовало, поэтому за два дня реверс-инжиниринга Safaris «Mail Content of This Page» я заработал.

ОБНОВЛЕНИЕ: Я улучшил код и поставил его на 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. Для этого скриптовый мост кажется единственным решением. Посмотрите этот модифицированный SBSendEmail пример .

3 голосов
/ 21 июля 2009

Не существует стандартного способа выполнять сложные взаимодействия с произвольными почтовыми клиентами. Вам нужно было бы заняться каждым приложением, которое вы хотите поддерживать отдельно, и посмотреть, есть ли у него способ установить формат электронной почты - скорее всего, через Applescript, - а затем определить, что является обработчиком mailto по умолчанию, и запустить соответствующий код. Для некоторых почтовых клиентов это может быть невозможно (так же, как у некоторых клиентов нет поддерживаемого способа открыть новое электронное письмо с вложением).

0 голосов
/ 30 января 2010

Дастин Бахрах опубликовал элегантное (но неполное) решение здесь

Для этого нужно немного сценария яблока, поэтому вам придется создавать разные сценарии для каждого почтового приложения, которое вы хотите поддерживать, но это кажется простым делом.

Вам также потребуется найти почтовое приложение по умолчанию для пользователей, что можно сделать, создав URL-адрес mailto:, а затем использовать LaunchServices LSGetApplicationForURL(): для возврата почтового клиента по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...