6
votes

Comment puis-je envoyer un email HTML de Cocoa?

Je recherche un moyen de créer un courrier électronique formaté HTML à partir d'une application OS X COCOA.

Mon flux de travail préféré serait: l'utilisateur sélectionne un élément de menu et l'application de courrier par défaut s'ouvre avec un nouveau courrier électronique pré-rempli au premier plan.

Je suis capable de le faire avec Mailto et - [Nsworkspace Openurl] pour les courriels en texte brut, mais cela ne fonctionne pas pour les courriels HTML.


2 commentaires

Quelques ressources: cocoahads.byeu.edu/resources/email


Toute nouvelle sur cette question?


3 Réponses :


3
votes

Il n'y a pas de moyen standard de faire des interactions complexes avec les clients de messagerie arbitraires. Vous devriez vous attaquer à chaque application que vous souhaitez prendre en charge séparément et voir s'il a un moyen de définir le format de courrier électronique - probablement via Appscript - puis détectez le gestionnaire de courrier par défaut et exécutez le code approprié. Pour certains clients de messagerie, il peut ne pas être possible (tout comme certains clients n'ont aucune manière prise en charge d'ouvrir un nouvel email avec une pièce jointe).


1 commentaires

J'ai à peu près la même conclusion après avoir fait des recherches approfondies sur Internet. Je suis actuellement en train d'essayer une solution mail.app seule solution via le pont de script, mais jusqu'à présent, je suis infructueux définissant un texte riche / html comme contenu de courrier. Si je trouve une solution, je l'ajouterai à cette question.



10
votes

J'étais intéressé par cela aussi, deux jours d'ingénierie inverse Safaris "Contenu de la messagerie de cette page" et je l'ai eu fonctionner.

Mise à jour: strong> J'ai amélioré le code et mettez-le-le sur GITUB P>

- (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);
}
}


6 commentaires

Merci Chris. Qu'est-ce qui se passe dans la baseurl dans la méthode AtmAilhelper?


Un fichier utilisé pour résoudre les URL relatives dans le document. Vous avez besoin de cela au cas où votre courrier html en tant qu'images qui ne sont pas téléchargés à partir du Web.


Je n'ai pas d'images. Qu'est-ce que je mets alors? Remarqué que sans la baseurl, la webresource n'est pas créée


Le chemin du traité sur le dictionnaire où le HTML est sorti, si vous générez le code HTML à la volée, essayez simplement le chemin Valide (ressource de paquet ou).


Hi.Comment définir les destinataires dans ce cas? Merci


Utilisez NSURL * Mailurl = [NSURL FILLWITHPATH: chemin]; au lieu de nsurl * mailurl = [NSURL URLWITHIPS: chemin]; Comme l'URL n'a pas de schéma n'est la 2e cas qui rend l'événement Apple à échouer.



0
votes

Dustin Bachach a posté une solution élégante (mais incomplète) ici

Il a besoin d'un peu de script Apple. Vous devez donc créer un script différent pour chaque application de messagerie que vous souhaitez prendre en charge, mais cela semble être une chose facile à faire.

Vous auriez également besoin de trouver l'application de messagerie par défaut des utilisateurs qui peut être effectuée en construisant un mailto: URL utilise launchServices lsgetaplicationforurl (): pour renvoyer l'email par défaut client.


0 commentaires