如何在 MFMailComposeViewController 的 MailComposer 表中添加 UIImage

发布于 2024-08-06 08:22:40 字数 142 浏览 14 评论 0原文

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

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

I want to insert a UIImages inside the compose sheet of an MFMailComposerViewController.

Please note I don't want to attach them, but I want to place them in a table using HTML code which will be the part of the email body.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

脱离于你 2024-08-13 08:22:41

带着新的答案再次回来。不过,我仍然保留以前的代码,因为我仍然不相信没有办法利用它。我自己也会坚持下去。以下代码确实有效。 Mustafa 建议对图像进行 base64 编码,并表示它们只适用于 Apple 到 Apple,但事实并非如此。 Base64 编码现在确实适用于大多数邮件客户端(IE 以前不支持它,但现在它支持特定大小的图像,尽管我不确定该大小到底是多少)。问题是 Gmail 等邮件客户端会删除您的图像数据,但有一个简单的解决方法......只需将 标签周围的 标签就是您需要做的,以防止它被删除。为了将图像添加到您的电子邮件中,您需要在您的项目中添加一个 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 上对此进行了测试,并在雅虎、我的个人网站和我的 MobileMe 上向自​​己发送了可爱的嵌入图像的电子邮件。我没有 Gmail 帐户,但 Yahoo 运行得很好,而且我找到的每个消息来源都说粗体标签就是让它运行所需的全部。希望这对大家有帮助!

Back again with a new answer. I'm still leaving my previous code up though, because I'm still not convinced that there's not a way to make use of it. I'll keep at it myself. The following code DOES work. Mustafa suggests base64 encoding the images, and says that they only work Apple to Apple, but that's not actually true. Base64 encoding does work with most mail clients now (IE previously didn't support it, but now it is supported for images up to a certain size, though I'm not sure exactly what the size is). The problem is that mail clients like Gmail would strip out your image data, but there's a simple workaround for that... just putting <b> and </b> tags around your <img ...> tag is all you need to do to keep it from getting stripped out. In order to get an image into your email, you need to get a base64 encoder into your project. There are several out there (mostly C though), but the simplest ObjC one I found was called NSData+Base64 by Matt Gallagher (I took the "+" out of the name after copying it in because it gave me problems). Copy the .h and .m files into your project and be sure to #import the .h file where you plan on using it. Then code like this will get an image into your email body...

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

I've tested this on the iPhone and sent lovely image embedded emails to myself on Yahoo, my personal website, and my MobileMe. I don't have a Gmail account, but the Yahoo worked perfectly, and every source I've found says that the bold-tags are all you need to make it work. Hope this helps all!

不及他 2024-08-13 08:22:41

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

如果图像位于服务器上,则只需包含 HTML 标记,并将源 URL 设置为远程图像。预览邮件消息的用户会在撰写过程中看到图像,而收件人在打开邮件时会看到该图像(除非他们禁用了默认图像加载)。

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

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

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

解决此问题的方法是您自己撰写邮件,然后直接通过 SMTP 将其发送到邮件服务器,或者让服务器代理通过 SMTP 中继为您完成此操作。如果您决定这样做,您可能需要查看 Google 代码或服务上的 skpsmtpmessage例如 AuthSMTP

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

There are two ways to do this, depending on where the images are stored:

If the images are out on a server, then just include HTML <img> tags with the source URL set to the remote image. The user previewing the mail message is shown the image during composition and the receiver sees it when they open the message (unless they've disabled default image loading).

If the images are on the phone you could include them as 'inline' images. There are two steps to this. First you have to attach all the images you want to use as multi-part MIME attachments and they will need to be assigned a 'content ID' (aka cid), a filename, and Content-Disposition set to inline. Inside your HTML message body you can reference them like so:

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

The bad news is, the standard iPhone mail composer mechanism doesn't allow adding this additional data to attachments. The second thing is to mark the email as having an "alternative" MIME content-type. Again, the mail composer doesn't let you do that.

The way around this is to either compose the message yourself then send it off to the mail server directly via SMTP, or have a server proxy do it for you via an SMTP relay. If you decide to go this way you might want to check out skpsmtpmessage on Google code or a service like AuthSMTP.

Once the user receives this message, however, they see a self-contained HTML message with all the inline images right there. But it's a lot of hassle to set up. The first method (putting images on server) is by far the easier way to go.

不气馁 2024-08-13 08:22:41

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

示例:

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

For iOS 3.0 and later, please see this: Attaching an image to an email?

Example:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
依 靠 2024-08-13 08:22:41

也许这对你有用:

如何将 UIImage 嵌入邮件编辑器邮件正文

内容如下:

基本上,您将图像转换为 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:[email protected]?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

Maybe this'll work for you:

How to Embedd UIImage into a Mail Composer message body

Here's what it says:

Basically, you convert your image to base64 (the base64 attached below have to be shorten cause of the message length limit, so it's not a valid image) string and embed in the image tag. I remember I've stop working on this is because the embedded image(s) are only viewable from iPhone to another iPhone, I remember testing it with Gmail, our work Outlook client with no luck display the image, when I view source the data is there. So I don't think is the so much of a spam filter issue but email clients are just smarter. While I was research this, I actually found that this is how many spammers to blast out emails with image only info so it by passes the spam filter. Damn spammers, I was going to use it for good cause but since it was pretty much useless when I found out that most mail client won't display the image. For what it's worth, here is the code.

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];
初与友歌 2024-08-13 08:22:41

(不幸的是,以下方法不起作用,但我要离开这篇文章,因为图像 URL 路径转换字符串示例对于您在代码中需要 HTML 文件路径的其他情况确实很有帮助。请参阅我关于 Base64Encoding 的文章一种有效的方法。)

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

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

您需要将此字符串设置为

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 编码的电子邮件正文中使用此文字 URL,例如 img src=\"",pathToMyImage,"\"

该示例看起来需要大量工作,但实际上一旦您完成设置,这根本不难,而且它就像一个魅力:-) 祝你好运!

(Unfortunately the following method doesn't work, but I'm leaving this post because the image URL path conversion string example is really helpful for other cases where you need HTML filepaths in your code. Please see my post on Base64Encoding for a way that does work.)

I ran into this issue myself, and I found a way that works. You CAN get the images to appear inline by using the full filepath to the image.

It takes a little conversion on your part, but use the normal methods for obtaining your app's directories (NSString *path = [[NSBundle mainBundle] resourcePath], etc...), then convert the string to a literal URL. For example, the "path" string returned above will contain something like "/Users/Me/Library/Application Support/iPhone Simulator/3.2/Applications/25ADA98D-8DF4-4344-8B78-C18BC757EBDC/MyEmailingApplication.app".

You'll need to make this string into

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

and then you can add your image filenames to the end. (this example points into the app resources, but the same applies for the tmp and documents directories).

You can do this string conversion with a combination of
[NSString stringWithFormat:@"file:///%@//%@",path,myImageName]

after using
[path stringByReplacingOccurencesOfString:@"/" withString:@"//"]

to fix the forward-slashes in "path", and

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

to make the spaces HTML friendly. Now you can use this literal URL in your HTML encoded email body, like img src=\"",pathToMyImage,"\"

The example looks like a lot of work, but actually once you get it setup, it's not hard at all, and it works like a charm :-) Good luck!

自由如风 2024-08-13 08:22:41

我尝试了 Mike 的答案MFMailComposerViewController 中完美运行,但不幸的是大多数电子邮件都不起作用客户。
由于我确实需要发送一些嵌入 UIImage 的电子邮件内容,因此我所做的如下:

  1. 我保留了 迈克的答案代码使用UIImage生成我的HTML页面
  2. 我创建了一个UIWebView来展示此页面,使用[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. 重要提示:我在 UIViewController 中将其显示为用户的预览页面
  4. 然后我从此 UIWebView 生成 PDF code>,感谢 AnderCover 的方法
  5. 最后,我使用 [mailComposerController 将创建的 PDF 作为附件添加到电子邮件中addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

好吧,别怪我,我知道只是添加一些图像就需要很多转换和操作,但是您的HTML 电子邮件结构保持不变嵌入图像,最终用户将仅收到一个美观的附件
“肮脏”的部分是 PDF 内容实际上是 webview 的屏幕截图......并不是真正可重用的。

I tried the Mike's answer works perfect inside the MFMailComposerViewController, but unfortunately not with most of the emails clients.
Since I really need to send some email content with UIImage embedded, here's what I've done:

  1. I kept the Mike's answer code to generate my HTML page with UIImage
  2. I've created an UIWebView presenting this page, with [yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
  3. IMPORTANT: I display this in an UIViewController as a Preview page for the user
  4. Then I generate a PDF from this UIWebView, thanks to AnderCover's method
  5. Finally, I add the created PDF as an attachement to the email with [mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

Ok, don't blame me, I know this is a lot of conversions and actions for just adding some images, but your HTML email structure remains the same with images embedded, and the final user will receive only one good-looking attachement.
The "dirty" part is that the PDF content is actually screenshots of the webview...Not really reusable.

若有似无的小暗淡 2024-08-13 08:22:41

编辑:您将要阅读的内容还不起作用!查看我的另一篇关于 Base64 Encoding your image 的文章,它确实有效。

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

我下面的代码发生的奇怪情况是,文本进入了电子邮件,但图像完全消失了(甚至没有对它们的悬挂“损坏”引用:-/)。这让我怀疑链接到外部服务器上的图像是否有效。我将继续致力于此...我想知道如果我在程序之外的邮件应用程序中启动电子邮件,它的行为是否会有所不同。当我了解更多信息时,我会继续回来更新这个......看起来这应该比苹果做的更容易:-/

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

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

EDIT: What you're about to read DOESN'T work (yet)! Check my other post on Base64 Encoding your image which DOES work.

This one looks just fine in the email composition window, but the actual sent email doesn't include the pics (I just tested it on my phone). I mistakenly thought that the mail app would base64 encode the images itself (It does so for attached images). And, although it's a pain, you can get an email on the iPhone to insert multiple "flowed" inline images by going to your image folder, copying an image to the clipboard, going to your email, and pasting it where you want. You can write more text, save the email as a draft, and repeat the process with more images pasted into the same email. Send the email to yourself, then open it on your computer with Text Edit. You'll be able to see exactly the formatting that the email takes (including the base64 encoded images).

What strangely happens with my code below is that the text makes it into the email, but the images just disappear entirely (not even a dangling "broken" reference to them :-/ ). This makes me doubt that linking to the images on an external server would work. I'm going to continue working on this... I'm wondering if it will behave differently if I have the email launch in the mail app outside of my program. I'll keep coming back to update this as I figure more out... it just seems like this should be easier than Apple makes it :-/

This code is written for image files that you'd store in your "Documents" directory (so your app would have to be creating images that are stored there, and HTML code that references those images. For images that you have stored in the app bundle, use [[NSBundle mainBundle] resourcePath] for the initial path to the images).

- (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];
}
贪恋 2024-08-13 08:22:41
  1. 删除图像标签
  2. 只需获取删除的图像标签并使用 uimage 视图显示

我尝试了上面的示例,但它们不起作用。下面您将找到 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:>] ;


    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]];
  1. remove the image tag
  2. just take the removed image tag and display using uimage view

I tried the above examples, but they are not working. Below you will find sample code that works 100%. But you need to check the image tag 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:>] ;


    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]];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文