53 votes

Comment ajouter une UIImage dans la feuille MailComposer de MFMailComposeViewController ?

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

Veuillez noter que je ne veux pas les joindre, mais les placer dans un tableau en utilisant un code HTML qui fera partie du corps du courriel.

64voto

Mike Points 590

De retour avec une nouvelle réponse. Je laisse cependant mon code précédent en place, car je ne suis toujours pas convaincu qu'il n'y a pas moyen de l'utiliser. Je vais continuer à le faire moi-même. Le code suivant FONCTIONNE. Mustafa suggère de coder les images en base64, et dit qu'elles ne fonctionnent que d'Apple à Apple, mais ce n'est pas vrai. L'encodage base64 fonctionne avec la plupart des clients de messagerie (IE ne le supportait pas auparavant, mais il est maintenant supporté pour les images jusqu'à une certaine taille, bien que je ne sache pas exactement quelle est cette taille). Le problème est que les clients de messagerie comme Gmail suppriment les données de l'image, mais il existe une solution de contournement simple... il suffit de mettre <b> and </b> autour de votre <img ...> L'étiquette est tout ce que vous devez faire pour éviter qu'elle ne soit dépouillée. Afin d'obtenir une image dans votre email, vous devez avoir un encodeur base64 dans votre projet. Il en existe plusieurs (surtout en C), mais le plus simple que j'ai trouvé en ObjC s'appelle NSData+Base64 par Matt Gallagher (J'ai enlevé le "+" du nom après l'avoir copié car il me posait 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 fera apparaître une image dans le corps de votre courriel...

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

Je l'ai testé sur l'iPhone et je me suis envoyé de jolis courriels contenant des images 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 indiquent que les balises en gras suffisent pour que cela fonctionne. J'espère que cela vous aidera !

11voto

Ramin Points 10412

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

Si les images sont sur un serveur, il suffit d'inclure le HTML. <img> dont l'URL source correspond à l'image distante. L'image est montrée à l'utilisateur qui prévisualise le message pendant sa composition et le destinataire la voit lorsqu'il ouvre le message (à moins qu'il n'ait désactivé le chargement des images par défaut).

Si les images sont sur le téléphone, vous pouvez les inclure en tant qu'images "en ligne". Cela se fait en deux étapes. Tout d'abord, vous devez joindre toutes les images que vous souhaitez utiliser sous forme de pièces jointes MIME à plusieurs parties et leur attribuer un "ID de contenu" (alias cid ), un nom de fichier, et Content-Disposition réglé sur inline . Dans le corps de votre 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 composition du courrier de l'iPhone ne permet pas d'ajouter ces données supplémentaires aux pièces jointes. La deuxième chose à faire est de marquer l'e-mail comme ayant un type de contenu MIME "alternatif". Là encore, le compositeur de courrier ne vous permet pas de le faire.

Pour contourner ce problème, vous pouvez soit composer vous-même le message et l'envoyer au serveur de messagerie directement via SMTP, soit demander à un serveur proxy de le faire pour vous via un relais SMTP. Si vous optez pour cette solution, vous pouvez consulter les sites suivants skpsmtpmessage sur le code Google ou un service comme AuthSMTP .

Cependant, lorsque l'utilisateur reçoit ce message, il voit un message HTML autonome avec toutes les images en ligne. Mais c'est très compliqué à mettre en place. La première méthode (placer les images sur le serveur) est de loin la plus simple à mettre en œuvre.

4voto

Arie Litovsky Points 2092

Pour iOS 3.0 et les versions ultérieures, voir ceci : Joindre une image à un courriel ?

Exemple :

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

1voto

Mustafa Points 8387

Peut-être que ça va marcher pour toi :

Comment intégrer un UIImage dans le corps d'un message de Mail Composer ?

Voilà ce que ça dit :

En gros, vous convertissez votre image en chaîne base64 (la base64 jointe ci-dessous doit être raccourcie à cause de la limite de longueur du message, donc ce n'est pas une image valide) et l'intégrez dans la balise image. Je me souviens que j'ai arrêté de travailler sur ce sujet parce que les images intégrées ne sont visibles que d'un iPhone à un autre, je me souviens l'avoir testé avec Gmail, notre client Outlook au travail, sans pouvoir afficher l'image, mais quand je regarde la source, les données sont là. Je ne pense donc pas qu'il s'agisse d'un problème de filtre anti-spam, mais que les clients de messagerie sont simplement plus intelligents. Pendant que je faisais mes recherches, j'ai découvert que c'est de cette façon que de nombreux spammeurs envoient des courriels avec des informations uniquement sous forme d'images afin de passer le filtre anti-spam. Maudits spammeurs, j'allais l'utiliser pour la bonne cause mais comme c'était plutôt inutile quand j'ai découvert que la plupart des clients de messagerie n'affichent 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:someone@someplace.com?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

1voto

Mike Points 590

(Malheureusement, la méthode suivante ne fonctionne pas, mais je laisse ce post parce que l'exemple de la chaîne de conversion du chemin d'accès à l'image est vraiment utile pour d'autres cas où vous avez besoin de chemins de fichiers HTML dans votre code. Veuillez consulter mon post 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 d'accès complet de l'image.

Cela demande 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 convertir la chaîne en une URL littérale. Par exemple, la chaîne "path" retourné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

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

et ensuite vous pouvez ajouter vos noms de fichiers d'images à la fin. (cet exemple pointe vers les ressources de l'application, mais la même chose s'applique aux répertoires tmp et documents).

Vous pouvez effectuer cette conversion de chaîne de caractères en combinant les éléments suivants [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

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

pour corriger les tirets avant dans "path", et

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

pour rendre les espaces compatibles avec le HTML. Vous pouvez maintenant utiliser cette URL littérale dans le corps de votre courriel codé en HTML, comme img. src=\"",pathToMyImage,"\"

L'exemple semble demander 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 !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X