使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份