2012-01-12 60 views
11
imágenes

estoy empotrable que han sido base 64 codificados en HTML de la siguiente manera:Base64 HTML imágenes incrustadas no se muestra cuando enviado por correo

[html appendFormat:@"<html><body><p><b><img src=\"data:image/png;base64,%@\"></b></p></body><html>", base64ImageString]; 

entonces crear un nuevo correo electrónico de la siguiente manera:

MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init]; 
mailVC.mailComposeDelegate = self; 
[mailVC setMessageBody:html isHTML:YES]; 
[self presentModalViewController:mailVC animated:YES]; 

La incrustado la imagen aparece en el nuevo correo electrónico antes de enviarla, pero no se muestra en ningún cliente de correo electrónico al que se envía el correo. Creo que el hecho de que la imagen se muestre correctamente en el borrador muestra que el proceso de inserción es exitoso, pero no entiendo por qué no se muestra cuando se entrega. Mirando el HTML sin procesar en el correo entregado se muestra: src = "cid: (null)" ¡Cualquier ayuda sería apreciada por favor!

+0

este código de respuestas menciona que funcionó Apple al correo yahoo. http://stackoverflow.com/questions/1527351/how-to-add-an-uiimage-in-mailcomposer-sheet-of-mfmailcomposeviewcontroller-in-ip –

+0

Estoy obteniendo los mismos resultados. Eso es con 5.0.1, tal vez funcionó antes. – dwery

+0

@dwery También estoy ejecutando 5.0.1. Por otro lado, pegar HTML en un correo electrónico lamentablemente también está roto en 5.0.1 – RunLoop

Respuesta

14

Me encontré con este mismo problema y la solución fue bastante intrincada. Es posible insertar una imagen en un correo electrónico. El problema es que, por alguna razón extraña, la imagen codificada en base64 no debe contener nuevas líneas (¡muy extraño! Lo sé). Supongo que estás usando NSData + Base64 por Matt Gallagher. ¡Yo tambien! Esta categoría crea una cadena base64 de varias líneas. El código en la categoría es

- (NSString *)base64EncodedString 
{ 
    size_t outputLength; 
    char *outputBuffer = 
     NewBase64Encode([self bytes], [self length], true, &outputLength); 

    NSString *result = 
     [[NSString alloc] 
      initWithBytes:outputBuffer 
      length:outputLength 
      encoding:NSASCIIStringEncoding]; 
    free(outputBuffer); 
    return result; 
} 

Al reemplazar el tercer parámetro de NewBase64Encode en false obtendrá una única cadena de línea de base 64 y que trabajó para mí. Terminé creando una nueva función (¡solo para no romper nada más!) Dentro de la categoría.

- (NSString *)base64EncodedStringSingleLine 
{ 
    size_t outputLength; 
    char *outputBuffer = 
    NewBase64Encode([self bytes], [self length], false, &outputLength); 

    NSString *result = 
    [[NSString alloc] 
    initWithBytes:outputBuffer 
    length:outputLength 
    encoding:NSASCIIStringEncoding]; 
    free(outputBuffer); 
    return result; 
} 

El uso de esta función para codificar el NSData del UIImage funcionó bien. Los clientes de correo electrónico que he probado hasta ahora muestran la imagen incrustada. ¡Espero que funcione para ti!

Editar: Como se señala en los comentarios, esta solución es solo parcial. La imagen se adjuntará como un URI de datos en el correo electrónico. Sin embargo, no todos los clientes de correo electrónico mostrarán la imagen incrustada.

+0

Estaba muy contento con su respuesta, sin embargo, acabo de probar en Gmail y no funciona ... – jcrowson

+0

¡Sí! La imagen está ahí. Sin embargo, parece que Gmail no admite URI de datos. – fsaint

+0

Tuve que desmarcar esto como respondido porque las imágenes incrustadas como esta no se muestran en Outlook, aunque se muestran en Correo en una Mac. – RunLoop

Cuestiones relacionadas