mfmailcomposeviewcontrollerdelegate iphone ios attachment mfmailcomposeviewcontroller

iphone - mfmailcomposeviewcontrollerdelegate - Cómo agregar un UIImage en MailComposer Sheet de MFMailComposeViewController



send email swift 4 (8)

Quiero insertar un UIImage dentro de la hoja de composición de un MFMailComposerViewController .

Tenga en cuenta que no quiero adjuntarlos, pero quiero colocarlos en una tabla con el código HTML que formará parte del cuerpo del correo electrónico.


  1. eliminar la etiqueta de la imagen
  2. solo tome la etiqueta de imagen eliminada y visualícela con la vista de uimage

Probé los ejemplos anteriores, pero no están funcionando. A continuación encontrará un código de muestra que funciona al 100%. Pero debe verificar la url de la etiqueta de imagen.

//remove the img tag NSScanner *theScanner; NSString *gt =nil; theScanner = [NSScanner scannerWithString:emailBody]; while ([theScanner isAtEnd] == NO) { // find start of tag [theScanner scanUpToString:@"<img" intoString:NULL] ; // find end of tag [theScanner scanUpToString:@">" intoString:&gt] ; emailBody = [emailBody stringByReplacingOccurrencesOfString:[ NSString stringWithFormat:@"%@>", gt] withString:@""]; NSString *tt=[ NSString stringWithFormat:@"%@>", gt]; NSLog(@"*********************%@",tt); st=tt; NSLog(@"*********************%@",st); } st =[st stringByReplacingOccurrencesOfString:@"<img src=/"" withString:@""]; st =[st stringByReplacingOccurrencesOfString:@"/"/>" withString:@""]; st =[st stringByReplacingOccurrencesOfString:@".png" withString:@""]; st =[st stringByReplacingOccurrencesOfString:@"/"align=/"left" withString:@""]; //"align="left NSLog(@"*********************%@",st); NSString *path1 = [[NSBundle mainBundle] pathForResource:[ NSString stringWithFormat:@"%@", st] ofType:@"png"]; NSData *myData1 = [NSData dataWithContentsOfFile:path1]; [picker addAttachmentData:myData1 mimeType:@"image/png" fileName:[ NSString stringWithFormat:@"%@", st]];


De vuelta con una nueva respuesta. Todavía estoy dejando mi código anterior, porque aún no estoy convencido de que no haya una forma de usarlo. Lo mantendré yo mismo. El siguiente código SÍ funciona. Mustafa sugiere que base64 codifique las imágenes, y dice que solo funcionan con Apple para Apple, pero eso no es cierto en realidad. La codificación Base64 sí funciona con la mayoría de los clientes de correo ahora (IE anteriormente no la soportaba, pero ahora es compatible con imágenes de hasta cierto tamaño, aunque no estoy seguro de cuál es el tamaño). El problema es que los clientes de correo como Gmail quitarían los datos de su imagen, pero hay una solución simple para eso ... solo poner etiquetas <b> and </b> alrededor de su etiqueta <img ...> es todo lo que necesita para hacer para evitar que se elimine. Para obtener una imagen en su correo electrónico, necesita obtener un codificador base64 en su proyecto. Hay varios por ahí (principalmente C), pero el ObjC más simple que encontré se llamaba NSData + Base64 por Matt Gallagher (saqué el "+" del nombre después de copiarlo porque me daba problemas). Copie los archivos .h y .m en su proyecto y asegúrese de importar el archivo .h donde planea usarlo. Luego, un código como este obtendrá una imagen en su cuerpo de correo electrónico ...

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

Probé esto en el iPhone y envié encantados correos electrónicos con imágenes embebidas a mí mismo en Yahoo, mi sitio web personal y mi MobileMe. No tengo una cuenta de Gmail, pero Yahoo funcionó a la perfección, y cada fuente que encontré dice que las etiquetas en negrita son todo lo que necesita para que funcione. Espero que esto ayude a todos!


EDITAR: Lo que estás a punto de leer ¡NO funciona (todavía)! Verifique mi otra publicación en Base64 Codificando su imagen que SI FUNCIONA.

Este se ve muy bien en la ventana de composición del correo electrónico, pero el correo electrónico real no incluye las fotos (acabo de probarlo en mi teléfono). Pensé erróneamente que la aplicación de correo codificaba64 las imágenes en sí misma (lo hace para las imágenes adjuntas). Y, aunque es un problema, puede obtener un correo electrónico en el iPhone para insertar múltiples imágenes en línea "fluidas" yendo a su carpeta de imágenes, copiando una imagen en el portapapeles, yendo a su correo electrónico y pegándolo donde desee. Puede escribir más texto, guardar el correo electrónico como borrador y repetir el proceso con más imágenes pegadas en el mismo correo electrónico. Envíe el correo electrónico a usted mismo, luego ábralo en su computadora con Text Edit. Podrá ver exactamente el formato que toma el correo electrónico (incluidas las imágenes codificadas en base64).

Lo que extrañamente sucede con mi código a continuación es que el texto lo convierte en el correo electrónico, pero las imágenes simplemente desaparecen por completo (ni siquiera una referencia "quebrada" colgante para ellas: - /). Esto me hace dudar de que la vinculación a las imágenes en un servidor externo funcionaría. Voy a seguir trabajando en esto ... Me pregunto si se comportará de manera diferente si el correo electrónico se inicia en la aplicación de correo fuera de mi programa. Seguiré volviendo a actualizar esto a medida que descubro más cosas ... parece que esto debería ser más fácil que lo que hace Apple: - /

Este código está escrito para los archivos de imagen que almacenaría en su directorio "Documentos" (por lo que su aplicación debería crear imágenes que estén almacenadas allí, y un código HTML que haga referencia a esas imágenes. Para las imágenes que haya almacenado en la aplicación paquete, use [[NSBundle mainBundle] resourcePath] para la ruta inicial a las imágenes).

- (void)createEmailWithInlineImages { //get app Documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; //make spaces HTML friendly documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; //make forward-slash into double-forward-slash for HTML file-URL comapatibility documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@"/" withString:@"//"]; //get the name for your image into the string however your app works //create a string formatted like a literal HTML URL to the image, e.g. //file:///myiPhoneFileSystemPath//MyApplication//MyApplicationDirectories//Documents//imageName.jpg NSString *myHTMLImageName = @"myHTMLImage.jpg"; NSString *imagePath = [NSString stringWithFormat:@"file:///%@//%@",documentsPath,myHTMLImageName]; //this string is an example of your email body text with HTML formatting NSString *emailText = [NSString stringWithFormat:@"%@%@%@",@"<html><head><title>My Inline Image Example Email</title></head><body><p>Here''s some text before the inline image</p><p><img src = /"",imagePath,@"/"></p><p>Here''s some text for after the inline image. You could add more inline images and text after this with the same kind of formatting.</p></body></html>"]; //create email MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init]; emailDialog.mailComposeDelegate = self; [emailDialog setSubject:@"My Inline Image Email Document"]; [emailDialog setMessageBody:emailText isHTML:YES]; [self presentModalViewController:emailDialog animated:YES]; [emailDialog release]; }


Hay dos formas de hacerlo, dependiendo de dónde estén almacenadas las imágenes:

Si las imágenes están en un servidor, simplemente incluya las etiquetas HTML <img> con la URL de origen configurada en la imagen remota. El usuario que obtiene una vista previa del mensaje de correo muestra la imagen durante la composición y el receptor la ve cuando abre el mensaje (a menos que haya desactivado la carga de imagen predeterminada).

Si las imágenes están en el teléfono, puede incluirlas como imágenes ''en línea''. Hay dos pasos para esto. En primer lugar, debe adjuntar todas las imágenes que desee utilizar como archivos adjuntos MIME de varias partes y se les deberá asignar un ''ID de contenido'' (también conocido como cid ), un nombre de archivo y Content-Disposition establecida en inline . Dentro del cuerpo de su mensaje HTML puede hacer referencia a ellos de la siguiente manera:

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

La mala noticia es que el mecanismo estándar de composición de correo de iPhone no permite agregar esta información adicional a los archivos adjuntos. Lo segundo es marcar el correo electrónico como que tiene un tipo de contenido MIME "alternativo". Una vez más, el compositor de correo no te deja hacer eso.

La solución a esto es redactar el mensaje usted mismo y luego enviarlo directamente al servidor de correo a través de SMTP, o hacer que un servidor proxy lo haga por usted a través de un retransmisor SMTP. Si decides ir por este camino, es posible que desees consultar skpsmtpmessage en el código de Google o en un servicio como AuthSMTP .

Una vez que el usuario recibe este mensaje, sin embargo, ve un mensaje HTML autónomo con todas las imágenes en línea allí. Pero es muy complicado configurarlo. El primer método (poner imágenes en el servidor) es, de lejos, el camino más fácil de seguir.


Intenté que la respuesta de Mike funcionara perfectamente dentro de MFMailComposerViewController , pero desafortunadamente no con la mayoría de los clientes de correos electrónicos. Como realmente necesito enviar contenido de correo electrónico con UIImage incrustado , esto es lo que hice:

  1. Guardé el código de respuesta de Mike para generar mi página HTML con UIImage
  2. He creado un UIWebView presenta esta página, con [yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. IMPORTANTE: lo visualizo en un UIViewController como una página de vista previa para el usuario
  4. Luego genero un PDF desde este UIWebView , gracias al método de AnderCover
  5. Finalmente, agrego el PDF creado como un adjunto al correo electrónico con [mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

Ok, no me culpen, sé que esto es un montón de conversiones y acciones solo por agregar algunas imágenes, pero su estructura de correo electrónico HTML sigue siendo la misma con las imágenes incrustadas , y el usuario final recibirá solo un adjunto atractivo .
La parte "sucia" es que el contenido PDF es en realidad capturas de pantalla de la vista web ... No es realmente reutilizable.


Para iOS 3.0 y versiones posteriores, consulte esto: ¿ Adjuntar una imagen a un correo electrónico?

Ejemplo:

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


Quizás esto funcione para ti:

Cómo incrustar UIImage en un cuerpo de mensaje de Mail Composer

Esto es lo que dice:

Básicamente, convierte su imagen en base64 (la base64 adjunta a continuación tiene que acortarse debido al límite de longitud del mensaje, por lo que no es una imagen válida) cadena e incruste en la etiqueta de la imagen. Recuerdo que dejé de trabajar en esto porque las imágenes incrustadas solo se pueden ver desde el iPhone a otro iPhone, recuerdo haber probado con Gmail, nuestro cliente Outlook de trabajo no mostró suerte cuando visualicé la fuente los datos. esta ahí. Así que no creo que sea tanto un problema de filtro de spam, pero los clientes de correo electrónico son más inteligentes. Mientras investigaba esto, en realidad descubrí que esta es la cantidad de spammers que lanzan correos electrónicos con información de solo imagen para que pase el filtro de spam. Malditos spammers, iba a usarlo por una buena causa, pero ya que era bastante inútil cuando descubrí que la mayoría de los clientes de correo no mostrarán la imagen. Por lo que vale, aquí está el código.

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


(Lamentablemente, el siguiente método no funciona, pero dejo esta publicación porque el ejemplo de la cadena de conversión de la ruta URL de la imagen es realmente útil para otros casos en los que se necesitan rutas de archivo HTML. Consulte mi publicación en Base64Encoding para ver una forma funciona.)

Me encontré con este problema yo mismo, y encontré una manera que funciona. PUEDE hacer que las imágenes aparezcan en línea utilizando la ruta de archivo completa a la imagen.

Se necesita una pequeña conversión por su parte, pero use los métodos normales para obtener los directorios de su aplicación (NSString *path = [[NSBundle mainBundle] resourcePath], etc...) , luego convierta la cadena a una URL literal. Por ejemplo, la cadena de "ruta" devuelta anteriormente contendrá algo como "/ Usuarios / Me / Biblioteca / Soporte de aplicaciones / iPhone Simulator / 3.2 / Applications / 25ADA98D-8DF4-4344-8B78-C18BC757EBDC / MyEmailingApplication.app" .

Tendrás que hacer esta cadena en

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

y luego puedes agregar los nombres de tus archivos de imágenes al final. (este ejemplo apunta a los recursos de la aplicación, pero lo mismo aplica para los directorios tmp y documents).

Puede hacer esta conversión de cadena con una combinación de [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

después de usar [path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

arreglar las barras diagonales en "ruta", y

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

para hacer que los espacios sean amigables con HTML Ahora puede usar esta URL literal en su cuerpo de correo electrónico codificado en HTML, como img src = / "", pathToMyImage, "/"

El ejemplo parece mucho trabajo, pero una vez que lo configuras, no es difícil en absoluto, y funciona como un encanto :-) ¡Buena suerte!