如何使用 MFMailComposeViewController 在电子邮件正文中添加图像

Posted

技术标签:

【中文标题】如何使用 MFMailComposeViewController 在电子邮件正文中添加图像【英文标题】:How to add a image in email body using MFMailComposeViewController 【发布时间】:2012-08-31 07:16:43 【问题描述】:

我正在尝试找出在电子邮件正文中添加图像而不是在 ios 中作为附件添加的最佳方法。

1) Apple 提供了一个功能“addAttachment”,文档说,要在内容中添加任何图像,我们应该使用此功能,但我尝试了该功能,并发送了一封邮件,我检查了我的浏览器,它是作为附件接收的。

2) 其次,许多博客都说要使用 base64 编码, 但那也行不通,图像被作为损坏的图像发送。

所以朋友们,请帮助我找到最好的解决方案。

问候 兰吉特

【问题讨论】:

Detailed answer is here 【参考方案1】:

将电子邮件格式设置为 html。此代码在我的应用程序中运行良好。

MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];

NSString *htmlMsg = @"<html><body><p>This is your message</p></body></html>";

NSData *jpegData = UIImageJPEGRepresentation(emailImage, 1.0);

NSString *fileName = @"test";
fileName = [fileName stringByAppendingPathExtension:@"jpeg"];
[emailDialog addAttachmentData:jpegData mimeType:@"image/jpeg" fileName:fileName];

emailDialog setSubject:@"email subject"];
[emailDialog setMessageBody:htmlMsg isHTML:YES];


[self presentModalViewController:emailDialog animated:YES];
[emailDialog release];

斯威夫特 5

import MessageUI

    func composeMail() 

        let mailComposeVC = MFMailComposeViewController()

        mailComposeVC.addAttachmentData(UIImage(named: "emailImage")!.jpegData(compressionQuality: CGFloat(1.0))!, mimeType: "image/jpeg", fileName:  "test.jpeg")

        mailComposeVC.setSubject("Email Subject")

        mailComposeVC.setMessageBody("<html><body><p>This is your message</p></body></html>", isHTML: true)

        self.present(mailComposeVC, animated: true, completion: nil)
    

【讨论】:

嗨@MSK,感谢您的回复,您是否在浏览器中检查了收到的邮件,例如gmail、yahoo,它是如何出现在电子邮件正文中或作为附件的? 嗨@MSK,我有一个疑问,这里只有你使用HTML而不是Image创建了字符串,那么它是如何进入正文的,假设我不使用HTML创建字符串然后图片作为附件,我不太清楚,你能解释一下吗 嗨@MSK,你能看看我的疑问 @Ranjit 我不确定,但如果邮件格式是 HTML(和内容),很可能是 MFMailComposeViewController 内联发送它们。 我是这么想的,但那很奇怪,文件名起什么作用?【参考方案2】:

我最近刚刚为 Swift 完成了这个。

在 Swift 中添加照片到电子邮件的功能:

func postEmail() 
    var mail:MFMailComposeViewController = MFMailComposeViewController()
    mail.mailComposeDelegate = self
    mail.setSubject("your subject here")

    var image = // your image here
    var imageString = returnEmailStringBase64EncodedImage(image)
    var emailBody = "<img src='data:image/png;base64,\(imageString)' width='\(image.size.width)' height='\(image.size.height)'>"

    mail.setMessageBody(emailBody, isHTML:true)

    self.presentViewController(mail, animated: true, completion:nil)

返回格式化图像的函数:

func returnEmailStringBase64EncodedImage(image:UIImage) -> String 
    let imgData:NSData = UIImagePNGRepresentation(image)!;
    let dataString = imgData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
    return dataString

【讨论】:

这些图片在 Gmail、Hotmail 等中是否正确显示?它们不适合我.. @Richard,极好的解决方案:-D. 这适用于 iOS,但要注意 - 在 hotmail、gmail 或 egfconnor 提到的大多数其他客户端中仍然不起作用。 @Richard 这实际上不起作用。如果他们使用 GMail 的 Web 客户端(或 egfconnor 指出的其他客户端),图片会被大量放大,并且接收者会获取图像的编码而不是图片本身。【参考方案3】:

我发现(至少在我的情况下)PNG 将在消息编辑器中工作,但在用户打开/接收消息时不起作用。

作曲家Dandily showing logo PNG image!

查看者Not so much logo images over here.

(偶尔会在图片应该出现的地方出现浅蓝色的轮廓。)

使用下面的 HTML 正文字符串和下面的转换似乎可以解决问题。


使用 JPEG 的消息正文 HTML 字符串

NSString *body = [NSString stringWithFormat:
                  @"\
                  <html>\
                    <body>\
                        Check out the App!\
                        <br>\
                        Isn't this a terriffic logo?!.\
                        <br>\
                        <img src = \"data:image/jpeg;base64,%@\" width = 100 height= 100>\
                        <br>\
                        <a href = \"%@\" > CLICK ITTTTTTT! </a>\
                    </body>\
                  </html>",
                  imageString, @"http://www.LOLamazingappLOL.com"];

使用 JPEG 数据将图像转换为字符串

+ (NSString *)dataStringFromImage:(UIImage *)image

    NSData *imgData = UIImageJPEGRepresentation(image, 1);
    return [imgData base64EncodedStringWithOptions:kNilOptions];

附加信息:

iOS 目标 = 8.0 iOS 设备 = 9.1 HTML 很糟糕!

感谢@Richard 对此问题的正确答案。

【讨论】:

不,这不起作用,图像不显示在收到的电子邮件中。【参考方案4】:

需要注意的几点: - 使用 addAttachmentData - 使用 setMessageBody 并设置 isHTML:true

您不必在电子邮件正文中手动添加。 api 会处理这个问题。

func postEmail() 
var mail:MFMailComposeViewController = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setSubject("your subject here")
var image = // your image here
var imageData = UIImageJPEGRepresentation(image, 1)
mail.addAttachmentData(imageData, mimeType:"image/jpeg", fileName:"Your Filename"
var emailBody = "<html><body><p>This is your message</p></body></html>"
mail.setMessageBody(emailBody, isHTML:true)

self.presentViewController(mail, animated: true, completion:nil)

【讨论】:

以上是关于如何使用 MFMailComposeViewController 在电子邮件正文中添加图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?