如何在MFMailComposeViewController的MailComposer Sheet中添加UIImage

时间:2009-10-06 18:44:46

标签: iphone ios attachment mfmailcomposeviewcontroller

我想在UIImage的撰写表格中插入MFMailComposerViewController

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

8 个答案:

答案 0 :(得分:64)

再回来一个新答案。我仍然留下我以前的代码,因为我仍然不相信没有办法利用它。我会自己坚持下去。以下代码可行。 Mustafa建议对图像进行base64编码,并表示他们只将Apple用于Apple,但事实并非如此。 Base64编码现在可以与大多数邮件客户端一起使用(IE以前不支持它,但现在它支持最大到一定大小的图像,但我不确定大小是多少)。问题是像Gmail这样的邮件客户端会删除你的图像数据,但是有一个简单的解决方法......只需在你的<b> and </b>标记周围添加<img ...>标记就可以保留它从被剥夺。为了将图像添加到您的电子邮件中,您需要在项目中使用base64编码器。有几个(虽然大多数是C),但我找到的最简单的ObjC被Matt Gallagher称为 NSData + Base64 (我把它复制后用名字中的“+”因为它给了我问题)。将.h和.m文件复制到项目中,并确保#import .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上进行了测试,并在Yahoo,我的个人网站和MobileMe上向我自己发送了可爱的图像嵌入式电子邮件。我没有Gmail帐户,但雅虎工作得很好,而且我发现的每一个来源都说大胆的标签就是你需要的才能让它发挥作用。希望这对所有人都有帮助!

答案 1 :(得分:11)

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

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

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

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

坏消息是,标准的iPhone邮件编辑器机制不允许将这些额外的数据添加到附件中。第二件事是将电子邮件标记为具有“替代”MIME内容类型。同样,邮件编辑也不允许你这样做。

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

然而,一旦用户收到此消息,他们就会看到包含所有内嵌图像的自包含HTML消息。但是设置起来很麻烦。第一种方法(将图像放在服务器上)是迄今为止最简单的方法。

答案 2 :(得分:4)

对于iOS 3.0及更高版本,请参阅:Attaching an image to an email?

示例:

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

答案 3 :(得分:1)

也许这对你有用:

How to Embedd UIImage into a Mail Composer message body

以下是它的说法:

基本上,您将图像转换为base64(下面附带的base64必须缩短消息长度限制的原因,因此它不是有效图像)字符串并嵌入图像标记中。我记得我已经停止工作了,因为嵌入式图像只能从iPhone查看到另一部iPhone,我记得用Gmail测试它,我们的工作Outlook客户端没有运气显示图像,当我查看源数据时在那儿。因此,我认为垃圾邮件过滤器问题不是很多,但电子邮件客户端只是更聪明。当我研究这个时,我实际上发现这是有多少垃圾邮件发送者使用仅图像信息来发送电子邮件,因此通过垃圾邮件过滤器。该死的垃圾邮件发送者,我打算将它用于正当理由但是因为当我发现大多数邮件客户端不会显示图像时它几乎没用。对于它的价值,这是代码。

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

答案 4 :(得分:1)

(不幸的是,以下方法不起作用,但我要离开这篇文章,因为图片网址路径转换字符串示例对于您的代码中需要HTML文件路径的其他情况非常有用。请参阅我的帖子在Base64Encoding上找到有效的方法。)

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

您需要进行一些转换,但使用常规方法获取应用的目录(NSString *path = [[NSBundle mainBundle] resourcePath], etc...),然后将字符串转换为文字网址。例如,上面返回的“path”字符串将包含类似“/ Users / Me / Library / Application Support / iPhone Simulator / 3.2 / Applications / 25ADA98D-8DF4-4344-8B78-C18BC757EBDC / MyEmailingApplication.app”< / strong>即可。

您需要将此字符串设为

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

然后您可以将图像文件名添加到最后。 (此示例指向应用程序资源,但同样适用于tmp和文档目录)。

您可以使用组合进行此字符串转换 [NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

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

修复“path”中的正斜杠和

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

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

这个例子看起来很多,但实际上一旦你设置它,它就不难了,它就像一个魅力:-)祝你好运!

答案 5 :(得分:0)

我在MFMailComposerViewController内尝试了Mike's answer完美的作品,但遗憾的是大多数电子邮件客户端都没有。 由于我真的需要发送一些嵌入了UIImage的电子邮件内容,这就是我所做的:

  1. 我保留了Mike's answer代码,用UIImage
  2. 生成我的HTML页面
  3. 我使用UIWebView
  4. 创建了一个显示此页面的[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  5. 重要提示:我在UIViewController中以预览页面显示在用户
  6. 然后我通过此UIWebView生成PDF,感谢AnderCover's method
  7. 最后,我使用[mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]
  8. 将创建的PDF作为附件添加到电子邮件中

    好的,不要怪我,我知道这只是添加一些图片的很多转换和操作,但你的HTML电子邮件结构仍然是嵌入图片,最终用户将获得只有一个好看的附件 “脏”部分是PDF内容实际上是webview的截图...不是真的可重用。

答案 6 :(得分:-1)

编辑:你将要阅读的内容(尚未开始)!检查我在Base64上的其他帖子编码您的图像哪个有效。

这个在电子邮件撰写窗口中看起来很好,但实际发送的电子邮件不包括图片(我刚在手机上测试过)。我错误地认为邮件应用程序会对图像本身进行base64编码(对附加图像也是如此)。而且,虽然这很麻烦,但您可以在iPhone上收到一封电子邮件,通过转到图像文件夹,将图像复制到剪贴板,转到您的电子邮件,然后将其粘贴到您想要的位置,插入多个“流动的”内嵌图像。您可以编写更多文本,将电子邮件另存为草稿,并使用粘贴到同一电子邮件中的更多图像重复此过程。将电子邮件发送给自己,然后使用文本编辑在计算机上打开它。您将能够确切地看到电子邮件所采用的格式(包括base64编码的图像)。

我的代码下面发生的奇怪之处在于文本会将其发送到电子邮件中,但图像完全消失(甚至不是对它们的“破坏”引用: - /)。这让我怀疑链接到外部服务器上的图像是否有效。我将继续努力...我想知道如果我在我的程序之外的邮件应用程序中启动电子邮件,它的行为是否会有所不同。我会继续回来更新这个,因为我想出更多......看起来这应该比Apple更容易: - /

此代码是为您存储在“Documents”目录中的图像文件编写的(因此您的应用必须创建存储在那里的图像,以及引用这些图像的HTML代码。对于您存储的图像在应用程序包中,使用[[NSBundle mainBundle] resourcePath]作为图像的初始路径。)

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

答案 7 :(得分:-1)

  1. 删除图片标记
  2. 只需删除已删除的图片代码并使用uimage视图显示
  3. 我尝试了上面的例子,但它们没有用。您将在下面找到100%工作的示例代码。但是你需要查看图片标签网址。

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