iOS Geliştirici — E-posta Gönder

Nov 26 2022
E-posta, 21. yüzyılın en iyi iletişim kanallarından biridir. Bilgi birkaç saniye içinde bir grup alıcıya iletilebilir.

E-posta, 21. yüzyılın en iyi iletişim kanallarından biridir. Bilgi birkaç saniye içinde bir grup alıcıya iletilebilir. E-posta işlevini uygulamanıza entegre etmeyi hiç düşündünüz mü?

Apple, geliştiriciler için kullanımı kolay bir çerçeve MessageUIsağladı. Aşağıdaki özellikleri yapılandırabiliriz:

  1. alıcı listesi
  2. Ders
  3. Mesaj gövdesi
  4. Ekler

Adım Adım Prosedür

1. Adım) Cihazın e-posta gönderip gönderemediğini kontrol edin

import MessageUI

// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }

1. Uygulama kullanıcısı, sistem posta uygulamasında e-posta hesabını henüz kurmadı

2. iOS MDM profili, bu StackOverflow yanıtına atıfta bulunarak posta işlevini devre dışı bıraktı.

Adım 2) MFMailComposeViewController örneğini yapılandırın

// Construct the `MFMailComposeViewController` instance
let mfMailComposeViewController = MFMailComposeViewController()

// To set the recipients list, including the to, cc and bcc fields
mfMailComposeViewController.setToRecipients(["[email protected]"])
mfMailComposeViewController.setCcRecipients(["[email protected]"])
mfMailComposeViewController.setBccRecipients(["[email protected]"])

// To set the email subject
mfMailComposeViewController.setSubject("Example - Subject Text")

// To set the email message body; It can be either plain text or HTML message
mfMailComposeViewController.setMessageBody("<h1>Example - HTML message body </h1>", isHTML: true)

// Presenet the `MFMailComposeViewController` to the app user
present(mfMailComposeViewController, animated: true)

  1. to, cc& dahil olmak üzere alıcıların listesibcc
  2. konu alanı
  3. Düz metin veya HTML mesajındaki mesaj gövdesi

Adım 3) MFMailComposeViewController'ı manuel olarak kapatın

// We must implement the `MFMailComposeViewControllerDelegate` in order to handle the user's action on the mail compo
mfMailComposeViewController.mailComposeDelegate = self

extension DemoViewController: MFMailComposeViewControllerDelegate {
    
  // This is the only callback from the Mail composer to notify the app that the user has carried out certain action
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        switch result {
        case .cancelled:
            print("The user has dismissed the mail composer and deleted the email draft.")
            
        case .saved:
            print("The user has dismissed the mail composer and saved the email draft.")
            
        case .sent:
            // The email request is queued in the user's mail app
            // There is no guarantee that the email is actually sent out!!!
            print("The user has \"sent\" the email out.")
            
        case .failed:
            print("The user cannot send out the email")
            print("Error of sending out the email: \(error.debugDescription)")
            
        }
        controller.dismiss(animated: true)
    }
}

resultKullanıcının eylemini gösteren bir özellik de vardır , örneğin:

  1. cancelled— Kullanıcı "İptal" düğmesini tıkladı ve ardından e-posta taslağını sildi
  2. saved— Kullanıcı "İptal" düğmesini tıkladı ve ardından e-posta taslağını kaydetti
  3. sent— Kullanıcı e-postayı *gönderdi*
  4. fail— E-postayı posta uygulamasında sıraya almada bir hata oluştu

Hile — "Gönderildi" sonucu döndürüldüğünde e-posta GERÇEKTEN gönderildi mi?

E-postayı ağ bağlantısı yokken, örneğin uçak modunda göndermeyi denediniz mi? Ah HAYIR ! didFinishWithgeri araması aslında MFMailComposeViewControllerDelegatebir sentsonuç döndürür!!!

Bu ne anlama gelir?

Aşağıdaki Apple belgelerine göre, MFMailComposeViewControlleryalnızca e-postayı göndermek yerine sıraya koymak için sistem posta programına bir istek gönderin !!!

Apple Resmi Belgeleri — mailComposeController(_:didFinishWith:error:):

Kullanıcı bu arabirim tarafından oluşturulan e-postayı göndermeyi seçtiyse, bu yöntem çağrıldığında o e-posta kullanıcının Posta programında kuyruğa alınmalıdır . E-posta iletisi kuyruğa alınırken bir hata oluşursa, errorparametre oluşan hatanın türünü gösteren bir hata nesnesi içerir.

Başka bir deyişle, uygulama , e-postanın alıcılara başarılı bir şekilde gönderilip gönderilmediğini ASLA bilemez.

Gelişmiş Özellik - E-postaya ek ekleme

Ek gönderme, kullanım durumlarının çoğunda nadir görülen bir işlevdir. Ancak, MFMailComposeViewControlleroluşturulan e-postaya herhangi bir dosya biçimindeki eklerin bir listesini eklememize izin verir.

// Attach an image to the composed email
let attachmentImageData = UIImage(named: "example_image_name")!.pngData()!
mfMailComposeViewController.addAttachmentData(attachmentImageData, mimeType: "image/png", fileName: "example_file_name")

Daha fazla bilgi edin

E-posta göndermenin daha birçok yolu vardır. Firebase Extension Trigger Email, geliştiricilerin belirli önceden tanımlanmış alanlarla bir Firestore belgesi oluşturarak e-posta göndermelerine yardımcı olan kullanımı kolay bir araç sağlar. Aşağıda, Trigger E-posta Uzantısı ile ilgili diğer blogum var. Hakkında daha fazla bilgi edinmek istiyorsanız, okuyabilirsiniz.

Firebase Uzantısı — Tetikleyici E-posta

Çözüm

MessageUIApple , işi sistem posta uygulamasına devrederek uygulamaların e-posta göndermesine yardımcı olmak için kullanımı kolay bir çerçeve sağlar. Uygulama, alıcı listesini, konuyu, mesaj gövdesini ve ek listesini ayarlayabilir. Kullanıcı herhangi bir eylemde bulunduğunda MFMailComposeViewControllerDelegate, sonucu geri tetikler ve uygulamanın MFMailComposeViewControllermanuel olarak kapatması gerekir.

sentSonucun MFMailComposeViewControllerDelegategerçekten e-postanın gönderildiği anlamına gelmediğini unutmayın . E-posta isteği yalnızca sistem posta uygulamasında sıraya alınır!

Umarım bu blogu beğenirsiniz ve iyi bir gün geçirirsiniz!