53

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

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

4

8 回答 8

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 上对此进行了测试,并在雅虎、我的个人网站和我的 MobileMe 上向自​​己发送了可爱的图片嵌入电子邮件。我没有Gmail 帐户,但Yahoo 运行良好,而且我发现的每个来源都说粗体标签是让它运行所需的一切。希望这对大家有帮助!

于 2010-03-17T10:30:12.467 回答
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 消息。但是设置起来很麻烦。第一种方法(将图像放在服务器上)是迄今为止更简单的方法。

于 2009-10-06T20:09:34.523 回答
4

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

例子:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
于 2011-03-15T03:21:46.880 回答
1

也许这对你有用:

如何将 UIImage 嵌入到 Mail Composer 消息正文中

它是这样说的:

基本上,您将图像转换为 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];
于 2010-01-18T14:08:17.493 回答
1

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

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

您需要进行一些转换,但使用常规方法获取应用程序的目录(NSString *path = [[NSBundle mainBundle] resourcePath], etc...),然后将字符串转换为文字 URL。例如,上面返回的“路径”字符串将包含类似“/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 stringByReplacingOccurencesOfString:@" " withString:@"%20"]

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

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

于 2010-03-10T06:08:07.877 回答
0

我尝试了Mike 的答案在 内完美MFMailComposerViewController,但不幸的是,大多数电子邮件客户端都没有。因为我真的需要发送一些嵌入 UIImage 的电子邮件内容,所以我做了以下工作:

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

好吧,不要怪我,我知道这只是添加一些图像的大量转换和操作,但是您的 HTML 电子邮件结构与嵌入的图像保持一致,最终用户只会收到一个好看的附件
“脏”的部分是 PDF 内容实际上是 webview 的屏幕截图......不是真正可重用的。

于 2014-08-27T14:57:57.717 回答
-1

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

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

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

此代码是为您存储在“文档”目录中的图像文件编写的(因此您的应用程序必须创建存储在那里的图像,以及引用这些图像的 HTML 代码。对于您存储在应用程序中的图像bundle,使用 [[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];
}
于 2010-03-11T10:37:54.237 回答
-1
  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:&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]];
于 2011-03-15T09:39:24.077 回答