Изображение в письме (MFMailComposeViewController)


#1

Всем доброго утра! Настроил отправку email, но не могу разобраться, как вложить в письмо изображение. В идеале даже нужно не вложением сделать, а что-бы изображение отображалось в теле письма с помощью HTML. Что есть:
Есть imageView который получает в качестве фона rgb код.

colorImage.backgroundColor = UIColor(red: CGFloat(r!) / 255, green: CGFloat(g!) / 255, blue: CGFloat(b!) / 255, alpha: 1.0)

Через extension преобразую rgb код в изображение

extension UIImage {
    static func createImage(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context!.setFillColor(color.cgColor)
        context!.fill(rect)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
}

Далее пытаюсь вставить его в письмо, но тут ступор. Как собственно вставить изображение в письмо с помощью HTML?

@IBAction func shareButton(_ sender: UIButton) {
        
        // подключаем обработчик email
        if !MFMailComposeViewController.canSendMail() {
            self.showSendMailErrorAlert()
        } else {
            let composeVC = MFMailComposeViewController()
            composeVC.mailComposeDelegate = self
            
            // image for email
            let emailImage = UIImage.createImage(color: UIColor(red: CGFloat(r!) / 255, green: CGFloat(g!) / 255, blue: CGFloat(b!) / 255, alpha: 1.0))
            if let data = UIImagePNGRepresentation(emailImage) {
                let filename = getDocumentsDirectory().appendingPathComponent("ralImage.png")
                try? data.write(to: filename)
            }
            
            // Configure the fields of the interface.
            composeVC.setToRecipients(["address@example.com"])
            composeVC.setSubject(ralName!)
            composeVC.setMessageBody(ralName!, isHTML: true)
            
            // Present the view controller modally.
            self.present(composeVC, animated: true, completion: nil)
        }
    }

#2

Погуглить что такое html :slight_smile:

Непонятно зачем вам картинка, когда можно использовать просто цвет, но если сильно хочется то так:

let mailController = MFMailComposeViewController()
mailController.setToRecipients(["address@example.com"])
mailController.setSubject("Hello")
let imageData = UIImagePNGRepresentation(UIImage.createImage(color: .red))!
let html = [
    "<html>",
        "<body>",
            "<div style=\"background-image:url(data:image/png;base64,\((imageData.base64EncodedString())))\">Hello</div>",
        "</body>",
    "</html>"
]
mailController.setMessageBody(html.joined(), isHTML: true)
present(mailController, animated: true)

#3

Супер! Спасибо! Картинку потом можно использовать в качестве текстуры в проф. программах.


#4

Потестил на реальной почте. В окне отправки сообщения изображение отображается, а до адресата доходит письмо только с текстом ( Пока оформил как вложение к письму. В принципе такой вариант тоже устраивает
composeVC.addAttachmentData(imageData, mimeType: "image/png", fileName: "/(ralName).png")


#5

Гуглите html, можно например так:

let html = [
    "<html>",
        "<head>",
            "<style>",
                "#title {",
                    "background-image:url(data:image/png;base64,\((imageData.base64EncodedString())));",
                "{",
            "</style>",
        "</head>",
        "<body>",
            "<div id=\"title\">Hello</div>",
        "</body>",
    "</html>"
]

Если что то сложно отправляете, создайте шаблон index.html и с ним работайте.