2009-10-06 8 views
52

Desidero inserire uno UIImage s nel foglio di composizione di un MFMailComposerViewController.Come aggiungere un UIImage nel foglio MailComposer di MFMailComposeViewController

Nota. Non desidero allegarli, ma desidero inserirli in una tabella utilizzando il codice HTML che farà parte del corpo dell'email.

+0

Avete avuto fortuna con questo più recentemente per caso? Sto lavorando allo stesso problema e anch'io sto affrontando lo stesso problema. – jcrowson

+0

vedere http://stackoverflow.com/questions/12210571/how-to-add-a-image-in-email-body-using-mfmailcomposeviewcontroller/12210684#12210684 – msk

risposta

62

Indietro di nuovo con una nuova risposta. Comunque, sto ancora lasciando il mio precedente codice, perché non sono ancora convinto che non ci sia un modo per farne uso. Continuerò a farlo da solo. Il seguente codice funziona. Mustafa suggerisce base64 che codifica le immagini e dice che funzionano solo da Apple ad Apple, ma in realtà non è vero. La codifica Base64 ora funziona con la maggior parte dei client di posta (in precedenza IE non lo supportava, ma ora è supportato per immagini fino a una certa dimensione, anche se non sono sicuro di quale sia esattamente la dimensione). Il problema è che i client di posta come Gmail eliminerebbero i tuoi dati di immagine, ma c'è una soluzione semplice per questo ... è sufficiente mettere i tag <b> and </b> attorno al tag <img ...> per evitare che vengano eliminati. Per ottenere un'immagine nella tua email, devi ottenere un codificatore base64 nel tuo progetto. Ce ne sono molti là fuori (principalmente C sebbene), ma il più semplice ObjC che ho trovato è stato chiamato NSData + Base64 di Matt Gallagher (ho tolto il "+" dal nome dopo averlo copiato perché mi dava problemi). Copia i file .h e .m nel tuo progetto e assicurati di #importare il file .h in cui prevedi di usarlo. Poi il codice come questo otterrà un'immagine nel vostro corpo e-mail ...

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

Ho provato questo su iPhone e inviato immagine bella e-mail incorporate a me stesso su Yahoo, il mio sito personale, e il mio MobileMe. Non ho un account Gmail, ma Yahoo ha funzionato perfettamente, e ogni fonte che ho trovato dice che i grassetti sono tutto ciò che serve per farlo funzionare. Spero che questo aiuti tutti!

+0

Lo hai provato di recente con gmail? Mi sembra di avere solo un po 'di testo al posto dell'immagine. –

+6

Il trucco non funziona più. Non importa cosa faccio Gmail non mostrerà l'immagine. Il client desktop funziona correttamente. –

+6

Sì, sicuramente non funziona con Gmail. – pop850

11

Ci sono due modi per fare questo, a seconda di dove sono memorizzate le immagini:

Se le immagini sono fuori su un server, poi basta includere HTML <img> tag con l'URL di origine impostata l'immagine remota. L'utente che visualizza l'anteprima del messaggio di posta elettronica viene mostrato durante la composizione e il destinatario lo vede quando apre il messaggio (a meno che non abbia disabilitato il caricamento predefinito delle immagini).

Se le immagini sono sul telefono, è possibile includerle come immagini "in linea". Ci sono due passaggi per questo. Innanzitutto è necessario allegare tutte le immagini che si desidera utilizzare come allegati MIME in più parti e sarà necessario assegnare un 'ID contenuto' (ovvero cid), un nome file e Content-Disposition impostato su inline. All'interno del vostro corpo del messaggio HTML si possono fare riferimento in questo modo:

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

La cattiva notizia è, il meccanismo di posta compositore standard di iPhone non permette l'aggiunta di questi dati aggiuntivi per gli allegati. La seconda cosa è contrassegnare l'e-mail come avente un tipo di contenuto MIME "alternativo". Ancora una volta, il compositore di posta non ti consente di farlo.

Il modo per aggirare il problema è comporre il messaggio da solo, quindi inviarlo al server di posta direttamente via SMTP oppure fare in modo che un server proxy lo faccia per mezzo di un relay SMTP. Se decidi di andare in questo modo, potresti voler controllare skpsmtpmessage sul codice Google o un servizio come AuthSMTP.

Una volta che l'utente riceve questo messaggio, tuttavia, vede un messaggio HTML autonomo con tutte le immagini in linea proprio lì. Ma è un sacco di problemi da impostare. Il primo metodo (mettere le immagini sul server) è di gran lunga la strada più facile da percorrere.

+0

Quindi è possibile inserire direttamente gli UIImages memorizzati nel database iPhone . È necessario memorizzarli sul server o creare il messaggio per proprio conto e inviarlo. – rkb

1

Forse questo sarà il lavoro per voi:

How to Embedd UIImage into a Mail Composer message body

Qui è quello che dice:

In sostanza, si convertire l'immagine in base64 (i base64 allegate di seguito devono essere ridurre causa del stringa di lunghezza del messaggio, quindi non è una immagine valida) e incorporare il tag immagine. Mi ricordo che ho smesso di lavorare su questo perché le immagini incorporate sono visibili solo da iPhone a un altro iPhone, ricordo che l'ho provato con Gmail, il nostro client Outlook di lavoro senza fortuna mostra l'immagine, quando visualizzo la fonte i dati è lì. Quindi non penso sia il problema di un filtro spam, ma i client di posta sono semplicemente più intelligenti. Mentre stavo facendo ricerche su questo, ho effettivamente scoperto che questo è il numero di spammer che spara via e-mail con informazioni solo sull'immagine, così passa il filtro spam. Maledetti spammer, stavo per usarlo per una buona causa, ma poiché era praticamente inutile quando ho scoperto che la maggior parte dei client di posta non visualizza l'immagine. Per quello che vale, ecco il codice.

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

funziona con alcuni client di posta, ma non funziona con gmail. –

1

(Purtroppo il seguente metodo non funziona, ma me ne vado questo post perché la conversione percorso di esempio stringa URL immagine è veramente utile per gli altri casi in cui è necessario filepaths HTML nel codice. Si prega di vedere il mio post su Base64Encoding per un modo che funziona.)

Mi sono imbattuto in questo problema me stesso, e ho trovato un modo che funziona. È possibile ottenere le immagini per apparire in linea utilizzando il percorso file completo per l'immagine.

È necessaria una piccola conversione da parte dell'utente, ma utilizzare i metodi normali per ottenere le directory dell'app (NSString *path = [[NSBundle mainBundle] resourcePath], etc...), quindi convertire la stringa in un URL letterale. Ad esempio, la stringa "percorso" restituita sopra conterrà qualcosa come "/ Utenti/Me/Libreria/Supporto applicazioni/iPhone Simulator/3.2/Applicazioni/25ADA98D-8DF4-4344-8B78-C18BC757EBDC/MyEmailingApplication.app".

Avrai bisogno di fare questa stringa in

"file di : /// Users // Me // // Biblioteca Applicazione% 20Support // iPhone Simulator% 20 // 3.2 // // Applicazioni 25ADA98D-8DF4-4344-8B78-C18BC757EBDC // MyEmailingApplication.app // "

e quindi è possibile aggiungere i nomi dei file immagine fino alla fine. (questo esempio indica le risorse dell'app, ma lo stesso vale per le directory tmp e document).

Si può fare questa conversione stringa con una combinazione di [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

dopo aver usato [path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

per fissare i forward-slash in "cammino", e

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

a rendere gli spazi HTML friendly. Ora è possibile utilizzare questo URL letterale nel vostro corpo e-mail HTML codificata, come img src = \ "", pathToMyImage, "\"

L'esempio si presenta come un sacco di lavoro, ma in realtà una volta che si ottiene l'installazione, non è affatto difficile e funziona come un fascino :-) Buona fortuna!

+0

Merda! Controlla il codice completo che ho postato qui sotto. Non funziona quando effettivamente inviato dal dispositivo. Sembra perfetto nella finestra di composizione (immagini che mostrano in linea e tutto), ma l'e-mail inviata non include le immagini o il codice che le incorpora :-(La lascerò postata nel frattempo mentre la controllo nel caso ci mette sulla strada giusta – Mike

+0

Funziona nella finestra di composizione perché ti stai riferendo direttamente al percorso del file locale, quindi quando lo mandi, il riferimento è sempre lo stesso (al tuo percorso di file locale). Ecco perché non funziona più perché il file non esiste più. – jyap

-1

EDIT: Quello che stai per leggere NON funziona (ancora)! Controlla il mio altro post su Base64 Codifica la tua immagine che funziona.

Questo si vede bene nella finestra di composizione della posta elettronica, ma l'email inviata non include le immagini (l'ho appena testata sul mio telefono). Ho erroneamente pensato che l'applicazione di posta avrebbe codificato in base64 le immagini stesse (lo fa per le immagini allegate). E, anche se è un problema, è possibile ottenere una e-mail sull'iPhone per inserire più immagini in linea "fluide" andando nella cartella delle immagini, copiando un'immagine negli appunti, andando alla tua e-mail e incollandola dove vuoi. Puoi scrivere altro testo, salvare l'e-mail come bozza e ripetere la procedura con più immagini incollate nella stessa e-mail. Invia l'e-mail a te stesso, quindi aprilo sul tuo computer con Modifica testo. Sarai in grado di vedere esattamente la formattazione che l'e-mail impiega (incluse le immagini codificate Base64).

Ciò che stranamente accade con il mio codice qui sotto è che il testo entra nell'e-mail, ma le immagini scompaiono del tutto (nemmeno un riferimento "rotto" penzolante a loro: - /). Questo mi fa dubitare che il collegamento alle immagini su un server esterno possa funzionare. Continuerò a lavorare su questo ... Mi chiedo se si comporterà diversamente se avrò l'e-mail di avvio nell'app di posta esterna al mio programma. Continuerò a tornare ad aggiornare questo dato che trovo di più ...sembra proprio che questo dovrebbe essere più facile di quello che rende Apple: -/

Questo codice è scritto per i file di immagine che dovresti memorizzare nella tua cartella "Documenti" (quindi la tua app dovrebbe creare le immagini che sono memorizzate lì, e il codice HTML che fa riferimento a quelle immagini. Per le immagini che hai memorizzato nel pacchetto app, usa [[NSBundle mainBundle] resourcePath] per il percorso iniziale delle immagini).

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

BTW, grazie a Ramin per aver inizialmente detto che le immagini memorizzate su un server avrebbero funzionato. Questo mi ha dato l'idea di provare per gli URL letterali all'interno del file system iPhone :-) – Mike

+0

Se non hai visto la mia nota sopra, controlla il mio nuovo post RE: Base64Encoding dell'immagine. Funziona molto bene per la maggior parte dei casi. – Mike

4

Per iOS 3.0 e versioni successive, vedi prego questo: Attaching an image to an email?

Esempio:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath]; 
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"]; 
-1
  1. rimuovere il tag di immagine
  2. basta prendere il tag di immagine rimosso e la visualizzazione utilizzando la visualizzazione uImage

Ho provato gli esempi precedenti, ma non funzionano. Di seguito troverai un codice di esempio che funziona al 100%. Ma devi controllare l'URL del tag immagine.

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

Ho provato il Mike's answer opere perfette all'interno del MFMailComposerViewController, ma purtroppo non con la maggior parte dei client email. Da quando ho davvero bisogno di inviare alcuni contenuti e-mail con UIImage incorporato, ecco cosa ho fatto:

  1. ho mantenuto il codice Mike's answer per generare la mia pagina HTML con UIImage
  2. Ho creato un UIWebView presentando questa pagina, con [yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. IMPORTANTE: visualizzo questo in un UIViewController come Anteprima pagina per l'utente
  4. Poi ho generare un PDF da questo UIWebView, grazie alla AnderCover's method
  5. Infine, aggiungere il PDF creato come un attachement all'e-mail con [mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

Ok, non prendetevela con me, so che questo è un sacco di conversioni e azioni per aggiungere solo alcune immagini, ma la struttura dell'email HTML rimane la stessa con immagini incorporate e l'utente finale riceverà solo un bell'aspetto.
La parte "sporca" è che il contenuto PDF è in realtà schermate della visualizzazione Web ... Non è davvero riutilizzabile.

Problemi correlati