web-dev-qa-db-fra.com

Comment ajouter un UIImage dans la feuille MailComposer de MFMailComposeViewController

Je veux insérer un UIImages à l'intérieur de la feuille de composition d'un MFMailComposerViewController.

Veuillez noter que je ne veux pas les joindre, mais je veux les placer dans un tableau en utilisant du code HTML qui fera partie du corps de l'e-mail.

53
rkb

De retour avec une nouvelle réponse. Je laisse toujours mon code précédent, car je ne suis toujours pas convaincu qu'il n'y a pas de moyen de l'utiliser. Je continuerai moi-même. Le code suivant fonctionne. Mustafa suggère d'encoder les images en base64 et dit qu'elles ne fonctionnent que Apple pour Apple, mais ce n'est pas vrai. mais maintenant il est pris en charge pour les images jusqu'à une certaine taille, mais je ne suis pas sûr de la taille exacte.) Le problème est que les clients de messagerie comme Gmail supprimeraient vos données d'image, mais il existe une solution simple pour cela .. . mettre simplement <b> and </b> balises autour de votre <img ...> tag est tout ce que vous devez faire pour éviter qu'il ne soit supprimé. Afin d'obtenir une image dans votre e-mail, vous devez obtenir un encodeur base64 dans votre projet. Il y en a plusieurs (principalement C cependant), mais le plus simple ObjC que j'ai trouvé s'appelait NSData + Base64 par Matt Gallagher (J'ai retiré le "+" du nom après l'avoir copié car il m'a posé des problèmes). Copiez les fichiers .h et .m dans votre projet et assurez-vous # d'importer le fichier .h là où vous prévoyez de l'utiliser. Ensuite, un code comme celui-ci obtiendra une image dans votre corps de courrier électronique ...

- (void)createEmail {
//Create a string with HTML formatting for the email body
    NSMutableString *emailBody = [[[NSMutableString alloc] initWithString:@"<html><body>"] retain];
 //Add some text to it however you want
    [emailBody appendString:@"<p>Some email body text can go here</p>"];
 //Pick an image to insert
 //This example would come from the main bundle, but your source can be elsewhere
    UIImage *emailImage = [UIImage imageNamed:@"myImageName.png"];
 //Convert the image into data
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(emailImage)];
 //Create a base64 string representation of the data using NSData+Base64
    NSString *base64String = [imageData base64EncodedString];
 //Add the encoded string to the emailBody string
 //Don't forget the "<b>" tags are required, the "<p>" tags are optional
    [emailBody appendString:[NSString stringWithFormat:@"<p><b><img src='data:image/png;base64,%@'></b></p>",base64String]];
 //You could repeat here with more text or images, otherwise
 //close the HTML formatting
    [emailBody appendString:@"</body></html>"];
    NSLog(@"%@",emailBody);

 //Create the mail composer window
    MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];
    emailDialog.mailComposeDelegate = self;
    [emailDialog setSubject:@"My Inline Image Document"];
    [emailDialog setMessageBody:emailBody isHTML:YES];

    [self presentModalViewController:emailDialog animated:YES];
    [emailDialog release];
    [emailBody release];
}

J'ai testé cela sur l'iPhone et je me suis envoyé de beaux e-mails d'image intégrés sur Yahoo, mon site Web personnel et mon MobileMe. Je n'ai pas de compte Gmail, mais Yahoo a parfaitement fonctionné, et toutes les sources que j'ai trouvées disent que les balises en gras sont tout ce dont vous avez besoin pour le faire fonctionner. J'espère que cela aide tout le monde!

64
Mike

Il existe deux façons de procéder, selon l'endroit où les images sont stockées:

Si les images sont sur un serveur, alors incluez simplement HTML <img> balises avec l'URL source définie sur l'image distante. L'utilisateur prévisualisant le message électronique affiche l'image pendant la composition et le destinataire la voit lorsqu'il ouvre le message (sauf s'il a désactivé le chargement d'image par défaut).

Si les images sont sur le téléphone, vous pouvez les inclure comme images "en ligne". Il y a deux étapes à cela. Vous devez d'abord joindre toutes les images que vous souhaitez utiliser en tant que pièces jointes MIME en plusieurs parties et vous devrez leur attribuer un "ID de contenu" (alias cid), un nom de fichier et Content-Disposition défini sur inline. Dans votre corps de message HTML, vous pouvez les référencer comme suit:

<img src="cid:{messageid}/image.png" alt="My image" />

La mauvaise nouvelle est que le mécanisme standard de messagerie de l'iPhone composer ne permet pas d'ajouter ces données supplémentaires aux pièces jointes. La deuxième chose est de marquer l'e-mail comme ayant un type de contenu MIME "alternatif"). Encore une fois, le courrier composer ne vous permet pas de le faire.

La solution consiste à composer le message vous-même, puis à l'envoyer directement au serveur de messagerie via SMTP, ou à demander à un serveur proxy de le faire pour vous via un relais SMTP. Si vous décidez de suivre cette voie, vous voudrez peut-être consulter skpsmtpmessage sur le code Google ou un service comme AuthSMTP .

Cependant, une fois que l'utilisateur a reçu ce message, il voit un message HTML autonome contenant toutes les images en ligne. Mais c'est beaucoup de tracas à mettre en place. La première méthode (mettre des images sur le serveur) est de loin la solution la plus simple.

11
Ramin

Pour iOS 3.0 et versions ultérieures, veuillez consulter ceci: Joindre une image à un e-mail?

Exemple:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
4
Arie Litovsky

(Malheureusement, la méthode suivante ne fonctionne pas, mais je laisse ce message parce que l'exemple de chaîne de conversion de chemin d'URL d'image est vraiment utile pour d'autres cas où vous avez besoin de chemins de fichier HTML dans votre code. Veuillez voir mon article sur Base64Encoding pour une méthode qui fonctionne.)

J'ai rencontré ce problème moi-même et j'ai trouvé un moyen qui fonctionne. Vous POUVEZ faire apparaître les images en ligne en utilisant le chemin de fichier complet vers l'image.

Cela prend un peu de conversion de votre part, mais utilisez les méthodes normales pour obtenir les répertoires de votre application (NSString *path = [[NSBundle mainBundle] resourcePath], etc...), puis convertissez la chaîne en une URL littérale. Par exemple, la chaîne "chemin" renvoyée ci-dessus contiendra quelque chose comme "/ Users/Me/Library/Application Support/iPhone Simulator/3.2/Applications/25ADA98D-8DF4-4344-8B78-C18BC757EBDC/MyEmailingApplication.app".

Vous devrez transformer cette chaîne en

"fichier: /// Users // Me // Library // Application% 20Support // iPhone% 20 Simulator // 3.2 // Applications // 25ADA98D-8DF4-4344-8B78-C18BC757EBDC // MyEmailingApplication.app // "

puis vous pouvez ajouter vos noms de fichiers image à la fin. (cet exemple pointe vers les ressources de l'application, mais il en va de même pour les répertoires tmp et documents).

Vous pouvez effectuer cette conversion de chaîne avec une combinaison de [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

après avoir utilisé [path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

pour corriger les barres obliques dans "chemin", et

[path stringByReplacingOccurencesOfString:@" " withString:@"%20"]

pour rendre les espaces HTML conviviaux. Vous pouvez maintenant utiliser cette URL littérale dans votre corps de courrier électronique codé HTML, comme img src =\"", pathToMyImage, "\"

L'exemple ressemble à beaucoup de travail, mais en fait une fois que vous l'avez configuré, ce n'est pas difficile du tout, et cela fonctionne comme un charme :-) Bonne chance!

1
Mike

Peut-être que cela fonctionnera pour vous:

Comment intégrer UIImage dans un courrier Composer corps du message

Voici ce qu'il dit:

Fondamentalement, vous convertissez votre image en base64 (la base64 ci-dessous doit être raccourcie en raison de la limite de longueur de message, donc ce n'est pas une image valide) et incorporez-la dans la balise image. Je me souviens que j'ai cessé de travailler parce que les images incorporées ne sont visibles que de l'iPhone vers un autre iPhone, je me souviens l'avoir testé avec Gmail, notre client Outlook de travail sans chance afficher l'image, lorsque je regarde la source des données y a-t-il. Je ne pense donc pas que ce soit un problème de filtre anti-spam, mais les clients de messagerie sont simplement plus intelligents. Pendant que je faisais des recherches, j'ai trouvé que c'était le nombre de spammeurs qui diffusaient les e-mails avec des informations d'image uniquement afin de passer le filtre anti-spam. Putain de spammeurs, j'allais l'utiliser pour la bonne cause mais comme c'était à peu près inutile quand j'ai découvert que la plupart des clients de messagerie n'afficheraient pas l'image. Pour ce que ça vaut, voici le code.

NSString *eMailBody = @"<html>Just convert your image file to base64 to embed into the email<img src="data:image/gif;base64,R0lGODlhFAFuAPcAAPf39//7/+fn59bT1u/r787Lzq0UAN7b3hhFrRhJtRA0hBA8lMYYALWytffz94wQAMa+vb26vRhNxufj5+/v78bDxvfz772+vcbHxghRCM7PzggkYyFZ1tYkCNbX1hhRzpyenO+6AN7f3gBlANauAGOW7zFl1kp95wg8pbW2tZyanHOi797f5zlx3msMAAB9CP/PAL22va2mraWipedJMSlRtf91Y72WAFqK76WmpRBFta2qrcaeAK2urfdpUuc8If39/e9ZQmPTY94wGFrLWrUkEISq9/n5+ZR5ABCWGLWOAIRpAGNRAClJlK2GAL0sGGssITG2OaWCAK3H9848KaW+762qpcbX/73jvWN5pGvTc/eGc//vCFppfIwgEJRBMYSGlPeWhJSSjHN5jMaSjKWmrb3P787V1ilBa4R9c9nXy+rq6ntNQu/y95Su3svO1kphlISa1t7b1vf7/3uGraWGexdAmoySlDm6QrWyraWqrRiiIWtpa0LDStrl/1JtrcbHzpxlWntlUklVcztZk3vbhISStfffWufr786upVmB1ta2taW21tLS0ve6rd7j5zlhtfemnJSetefn78LCw7W2vdnZ2bVFMf/3//f3/8Z1a9bb59bb3eHh4a2WjM7HxoR1OSGqKbW6xvT09JyGQrXD3v/r5+fk3s7rzufb3q2ytffXKbWiY6inp1p1WrWmjP/LxnOOzsC/v+/n56qSMffXzr2eEP/3hPHx8f//987T57m4ubVZShk5f97LjO/HKQ03ks7DpdZlWv/vMd7LxqWuvefr/86uKd66QgwyhcnJyf/ztbKxsrWqpe/37//z7///75zTpf/397Szsvfn1ozLjO/jlN7v3qWko62OEO/r5//73tbX3vf37wotd1qqYxlNvYyujN7X1qKgoHuWe5KUmkKOQhZKvildMRh5IZqZmcXEwZ2amaajoNfU0QMaTAsiV5STlSo+bZibpSti2puZl5u28pGs5pqbn9Hd8/fr94WFi7i1sBguYfP09v///ywAAAAAFAFuAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iDYinEtJAWLUSIfJv6DVFShnOMXTEzpYrXKlPMXDGW6apZhli0CHmqtk+oJC9ejDDH6azBTGaMKDLBQUKCvzoC/5XAwcSJElV0UbB71lk0PFH6CGmqxS3cuZgyAwhw1tiUEiY+CEZBunTpwR9SfyisiNGmzYyNYqlWLZrtak6JRLmcoQKBCQQswEZ6ZcUJDn0RoFiwoAkhOH/+wCHURDkKHRIII0e+uoWbSbGRYv/SFy0qnj1yM6ArUEDDAQEOOBu9UqIF3xrMCWWRBGiAnP8eqKEBBpVIkgUhyg22nWocxKJLeEMBYIEAqVSD"></html>";

NSString *encodedBody = [eMailBody stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = [NSString stringWithFormat:@"mailto:[email protected]?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
1
Mustafa

J'ai essayé le réponse de Mike fonctionne parfaitement dans le MFMailComposerViewController, mais malheureusement pas avec la plupart des clients de messagerie. Puisque j'ai vraiment besoin d'envoyer du contenu de courrier électronique avec UIImage intégré , voici ce que j'ai fait:

  1. J'ai gardé le code réponse de Mike pour générer ma page HTML avec UIImage
  2. J'ai créé un UIWebView présentant cette page, avec [yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. IMPORTANT: je l'affiche dans une UIViewController en tant que page d'aperçu pour l'utilisateur
  4. Ensuite, je génère un PDF à partir de ce UIWebView, grâce à méthode d'AnderCover
  5. Enfin, j'ajoute le PDF en pièce jointe à l'e-mail avec [mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

Ok, ne me blâmez pas, je sais que c'est beaucoup de conversions et d'actions pour simplement ajouter quelques images, mais votre structure de messagerie HTML reste la même avec des images intégrées , et l'utilisateur final ne recevra qu'une seule pièce jointe attrayante .
La partie "sale" est que le contenu PDF est en fait des captures d'écran de la vue Web ... Pas vraiment réutilisable.

0
Tib