如何在MFMailComposeViewController的MailComposer表中添加UIImage

我想在MFMailComposerViewController的组合表单中插入一个UIImage

请注意,我不想附加它们,但是我想将它们放在一个使用HTML代码的表格中,该代码将成为电子邮件正文的一部分。

再回来一个新的答案。 尽pipe如此,我还是离开了以前的代码,因为我还不相信没有办法去利用它。 我会自己保留的 下面的代码可以工作。 穆斯塔法build议base64编码的图像,并表示,他们只苹果苹果,但事实并非如此。 Base64编码现在可以用于大多数邮件客户端(以前IE不支持,但是现在它支持图像达到一定的大小,虽然我不确定大小是什么)。 问题是像Gmail这样的邮件客户端会去掉你的图片数据,但是有一个简单的解决方法…只需在你的<img ...>标签上放置<b> and </b>标签就可以了要保持它不被剥离。 为了在你的电子邮件中得到一个图像,你需要在你的项目中获得一个base64编码器。 在那里有几个(主要是C虽然),但我发现最简单的ObjC之一被称为NSData + Base64由马特加拉格尔 (复制它后,我把名字“+”,因为它给了我的问题)。 将.h和.m文件复制到您的项目中,并确保#导入您计划使用的.h文件。 然后像这样的代码将获得一个图像到您的电子邮件正文…

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

我已经在iPhone上进行了testing,并在雅虎,我的个人网站和我的MobileMe上发送了可爱的图像embedded式电子邮件。 我没有Gmail帐户,但雅虎工作完美,我发现的每一个来源说,粗体标签是所有你需要的工作。 希望这有助于所有!

有两种方法可以执行此操作,具体取决于图像的存储位置:

如果图像出现在服务器上,则只需包含源URL设置为远程图像的HTML <img>标签即可。 预览邮件消息的用户在合成过程中显示图像,接收者在打开邮件时看到它(除非他们禁用了默认的图像加载)。

如果图像在手机上,您可以将它们包含为“内嵌”图像。 这有两个步骤。 首先,您必须附加您想要用作多部分MIME附件的所有图像,并且需要分配“内容ID”(aka cid ),文件名和Content-Disposition设置为inline 。 在你的HTML邮件正文中,你可以像这样引用它们:

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

坏消息是,标准的iPhone邮件编辑器机制不允许将附加数据添加到附件中。 第二件事是将电子邮件标记为具有“替代”MIME内容types。 再一次,邮件composer php不会让你这样做。

解决方法是自己编写邮件,然后直接通过SMTP将邮件发送到邮件服务器,或者通过SMTP中继让服务器代理为您完成。 如果您决定采取这种方式,您可能需要在Google代码或AuthSMTP等服务上查看skpsmtpmessage 。

一旦用户收到这条消息,他们就会看到一个包含所有内嵌图像的独立HTML消息。 但是build立起来很麻烦。 第一种方法(将图像放在服务器上)是更简单的方法。

对于iOS 3.0及更高版本,请参阅以下内容: 将图像附加到电子邮件中?

例:

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

也许这会为你工作:

如何将UIImageembedded到Mail Composer邮件正文中

这就是它说的:

基本上,你将图像转换为base64(下面附加的base64必须缩短消息长度限制的原因,所以它不是一个有效的图像)string,并embedded图像标记。 我记得我已经停止了这个工作,因为embedded的图像只能从iPhone到另一个iPhone,我记得使用Gmail进行testing,我们的工作Outlook客户端没有运气显示图像,当我查看源数据在那儿。 所以我不认为这是一个垃圾邮件filter问题,但电子邮件客户端只是更聪明。 当我正在研究这个时,我实际上发现,这是多less垃圾邮件发送者只用图像发送邮件,所以它通过垃圾邮件filter。 该死的垃圾邮件发送者,我打算把它用于好的原因,但是因为当我发现大多数邮件客户端不会显示图像时,它几乎是无用的。 为了什么是值得的,这里是代码。

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

(不幸的是,下面的方法是行不通的,但是我离开了这篇文章,因为图像URLpath转换string示例对于其他需要在代码中使用HTML文件path的情况非常有用。请参阅Base64Encoding上的文章确实有效。)

我自己遇到了这个问题,我发现了一个可行的方法。 您可以使用完整的文件path将图像显示为内联。

它需要一点点转换你的部分,但使用正常的方法来获得您的应用程序的目录(NSString *path = [[NSBundle mainBundle] resourcePath], etc...) ,然后将string转换为文字的URL。 例如,上面返回的“path”string将包含“/ Users / Me / Library / Application Support / iPhone Simulator / 3.2 / Applications / 25ADA98D-8DF4-4344-8B78-C18BC757EBDC / MyEmailingApplication.app”之类的内容

你需要把这个string放入

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

然后你可以添加你的图像文件名到最后。 (这个例子指向应用程序资源,但同样适用于tmp和documents目录)。

您可以使用[NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

在使用[path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

去修正“path”上的前锋,

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

使空间HTML友好。 现在,您可以在HTML编码的电子邮件正文中使用此文字url,例如img src = \“”,pathToMyImage,“\”

这个例子看起来像很多工作,但实际上,一旦你安装了它,它并不难,它的作用就像一个魅力:-)祝你好运!

我试图迈克的答案完美的MFMailComposerViewController里面,但不幸的是不与大多数的电子邮件客户端。 因为我真的需要发送一些电子邮件内容与UIImageembedded式 ,这是我所做的:

  1. 我保留了Mike的答案代码,用UIImage生成我的HTML页面
  2. 我创build了一个UIWebView呈现这个页面,用[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. 重要提示:我把它作为用户的预览页面显示在一个UIViewController
  4. 然后,我从这个UIWebView生成一个PDF,感谢AnderCover的方法
  5. 最后,我添加创build的PDF作为附件的电子邮件与[mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

好吧,不要怪我,我知道这只是添加一些图像很多转换和行动,但你的HTML电子邮件结构保持与embedded图像相同最终用户将收到一个好看的附件
“脏”的部分是,PDF内容实际上是截图webview …不是真的可重用。

编辑:你要读什么不工作(还)! 检查我在Base64上的其他post编码你的图像哪些工作。

这个在电子邮件合成窗口看起来不错,但实际发送的电子邮件不包括图片(我只是在我的手机上testing)。 我错误地认为,邮件应用程序将base64编码图像本身(这是为附加的图像)。 而且,虽然这很痛苦,但您可以在iPhone上获得一封电子邮件,通过转到您的图像文件夹,将图像复制到剪贴板,转到您的电子邮件,并粘贴到您想要的位置,插入多个“stream动”的内嵌图像。 您可以编写更多文本,将电子邮件另存为草稿,然后将更多图像粘贴到同一封电子邮件中,重复此过程。 将电子邮件发送给自己,然后使用文本编辑在计算机上打开它。 您将能够看到电子邮件的格式(包括base64编码的图像)。

我的代码在下面发生了什么奇怪的事情,就是文本会把它们写入邮件中,但是这些图片完全消失了(甚至不是一个“破碎”的引用: – /)。 这让我怀疑链接到外部服务器上的图像将工作。 我将继续在这个工作…我想知道,如果我的电子邮件应用程序之外的邮件应用程序的行为将有所不同。 我会继续回来更新这个,因为我更多的了解…这似乎应该比苹果更容易:/

这段代码是为了存储在“文档”目录中的图像文件编写的(因此,您的应用程序必须创build存储在其中的图像以及引用这些图像的HTML代码。对于存储在应用程序中的图像请使用[[NSBundle mainBundle] resourcePath]作为映像的初始path)。

 - (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, eg //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]; } 
  1. 删除图片标签
  2. 只需要移除图像标签,并使用uimage视图显示

我尝试了上面的例子,但他们不工作。 下面你会find100%的示例代码。 但是你需要检查图片标签的url。

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