使用 MFMailComposeViewController 类从 iPhone 应用程序发送带有 IMG 标记的 HTML 电子邮件
Posted
技术标签:
【中文标题】使用 MFMailComposeViewController 类从 iPhone 应用程序发送带有 IMG 标记的 HTML 电子邮件【英文标题】:Sending out HTML email with IMG tag from an iPhone App using MFMailComposeViewController class 【发布时间】:2010-07-20 10:51:29 【问题描述】:我正在使用 MFMailComposeViewController 类从我的 iPhone 应用程序发送格式化的 html 电子邮件。我需要在电子邮件中包含一张图片,并将我的 IMG 标签添加到我的电子邮件正文中
- (IBAction)shareWithOther
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker setSubject:@"My Message Subject"];
NSString *emailBody = @"<h3>Some and follow by an image</h3><img src=\"SG10002_1.jpg\"/>and then more text.";
[picker setMessageBody:emailBody isHTML:YES];
[self presentModalViewController:picker animated:YES];
[picker release];
图像文件“SG10002_1.jpg”已添加到我的资源文件夹,但图像未显示在邮件正文中(仅显示为 [?])。 有人可以告诉我我做错了什么,例如图像的路径错误还是有更好的方法来做到这一点?
非常感谢。
【问题讨论】:
【参考方案1】:我坚信(根据您的问题)您的图片 SG10002_1.jpg
位于主包中。
如果是这样,那么下面的代码应该适合你。这是来自this question 的完整破解。
- (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];
【讨论】:
我发现粗体 标签不是必需的。也许他们曾经是,但除非我错过了什么,否则我的图像在预览和实际发送的电子邮件中都没有显示。 我尝试过使用和不使用 标签,但是,对我来说,电子邮件的预览显示图像很好。单击发送并在 iPad 的邮件客户端中打开电子邮件后,图像不存在。如果我在 gmail 中打开它,它也不会显示。任何帮助将不胜感激。可能值得一提的是,我没有找到 base64EncodedString 函数,所以我使用的是 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength。 我让它工作了。我在另一个线程中发现我应该使用 [imageData base64EncodedStringWithOptions:0]。也不需要 选项卡。【参考方案2】:您不能在邮件中使用具有相对路径的图像,因为这会尝试从收件人邮件客户端查找文件。
您可以使用 base64 编码对象(google html base64 图像)嵌入图像,也可以将图像上传到可公开访问的网络服务器,并从您的邮件中引用图像的绝对 URL,这样收件人的邮件客户端就可以始终访问它。
【讨论】:
如果您的意思是“data:image/jpeg,....” URI,许多邮件客户端不支持它们。健全的邮件客户端也不打开外部图像。 上述方法的替代方法是将图像添加为附件,但形成的代码看起来不像这是 OP 想要实现的。看起来该图像被用作 HTML 格式消息的一部分,因此添加附件并不好【参考方案3】:将其添加为图像/jpeg 附件。它将出现在您的消息底部但在签名上方。
还有很多其他可能的方法,但它们都有点垃圾。
【讨论】:
【参考方案4】:这是对我有用的代码,
类 mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil)
// We must always check whether the current device is configured for sending emails
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
MFMailComposeViewController *composeVC = [[MFMailComposeViewController alloc] init];
composeVC.mailComposeDelegate = self;
[composeVC setSubject:@"test"];
NSString *messageBody = @"";
[composeVC setMessageBody:messageBody isHTML:NO];
UIImage *artworkImage = viewImage;
NSData *artworkJPEGRepresentation = nil;
if (artworkImage)
artworkJPEGRepresentation = UIImageJPEGRepresentation(artworkImage, 0.7);
if (artworkJPEGRepresentation)
[composeVC addAttachmentData:artworkJPEGRepresentation mimeType:@"image/jpeg" fileName:@"Quote.jpg"];
NSString *emailBody = @"Find out more App at <a href='http://itunes.apple.com/us/artist/test/id319692005' target='_self'>Test</a>";//add code
const char *urtfstring = [emailBody UTF8String];
NSData *HtmlData = [NSData dataWithBytes:urtfstring length:strlen(urtfstring)];
[composeVC addAttachmentData:HtmlData mimeType:@"text/html" fileName:@""];
//Add code
[self presentModalViewController:composeVC animated:YES];
[composeVC release];
[self dismissModalViewControllerAnimated:YES];
UIGraphicsEndImageContext();
【讨论】:
我按照上面的代码,邮件正文显示为一个带有[HTML]的小图标,不知道我做错了什么。 是的,但是当我们收到邮件时,它显示正常。让我知道它是否有效。以上是关于使用 MFMailComposeViewController 类从 iPhone 应用程序发送带有 IMG 标记的 HTML 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)