स्विफ्ट से मेल ऐप कैसे खोलें


119

Im एक सरल स्विफ्ट ऐप पर काम कर रहा है, जहाँ उपयोगकर्ता एक ईमेल पते को इनपुट करता है और एक बटन दबाता है जो मेल बार को खोलता है, एड्रेस बार में दर्ज पते के साथ। मुझे पता है कि ऑब्जेक्टिव-सी में यह कैसे करना है, लेकिन मुझे स्विफ्ट में काम करने में परेशानी हो रही है।

जवाबों:


240

आप मेल ऐप खोलने के लिए साधारण मेल्टो: आईओएस में लिंक का उपयोग कर सकते हैं।

let email = "foo@bar.com"
if let url = URL(string: "mailto:\(email)") {
  if #available(iOS 10.0, *) {
    UIApplication.shared.open(url)
  } else {
    UIApplication.shared.openURL(url)
  }    
}

77
शायद यह जोड़ने के लिए कि यह सिम्युलेटर में काम नहीं करता है, केवल डिवाइस पर देखने के लिए योग्य है ... देखें stackoverflow.com/questions/26052815/…
Pieter

4
अब आपको "जोड़ना होगा!" NSURL NSURL के लिए दूसरी पंक्ति में (string: "mailto: (email)")!
एंथोनीकज 19

4
यह क्यों कहता है कि यह केवल ios 10 या नए पर उपलब्ध है जब उत्तर स्पष्ट रूप से 3 वर्ष पुराना है
पीट

1
स्विफ्ट 4 / iOS 10+ उदाहरण: UIApplication.sared.open (यूआरएल, विकल्प: [:], पूर्णहैंडलर: nil) विकल्पों के लिए एक खाली शब्दकोश पास करना उसी तरह का परिणाम उत्पन्न करता है जैसा कि OpenURL ने कॉल किया था।
लुका वेंचुरा

धन्यवाद ... यह बहुत मदद करता है :) :)
अंजलि जरीवाला

61

जबकि अन्य उत्तर सभी सही हैं, आप कभी भी यह नहीं जान सकते हैं कि आपके एप्लिकेशन को चलाने वाले iPhone / iPad में Apple का मेल एप्लिकेशन इंस्टॉल है या नहीं क्योंकि यह उपयोगकर्ता द्वारा हटाया जा सकता है।

कई ईमेल क्लाइंट का समर्थन करना बेहतर है। निम्नलिखित कोड अधिक सुंदर तरीके से भेजने वाले ईमेल को संभालता है। कोड का प्रवाह है:

  • यदि मेल एप्लिकेशन इंस्टॉल हो गया है, तो मेल के कंपोजर को उपलब्ध डेटा से पहले खोलें
  • अन्यथा, इस क्रम में जीमेल ऐप, फिर आउटलुक, फिर याहू मेल, फिर स्पार्क खोलने का प्रयास करें
  • यदि उन क्लाइंट्स में से कोई भी स्थापित नहीं है, तो डिफ़ॉल्ट रूप से कमबैक mailto:..करता है जो उपयोगकर्ता को ऐप्पल के मेल ऐप को स्थापित करने के लिए प्रेरित करता है।

कोड स्विफ्ट 5 में लिखा है :

    import MessageUI
    import UIKit

    class SendEmailViewController: UIViewController, MFMailComposeViewControllerDelegate {

        @IBAction func sendEmail(_ sender: UIButton) {
            // Modify following variables with your text / recipient
            let recipientEmail = "test@email.com"
            let subject = "Multi client email support"
            let body = "This code supports sending email via multiple different email apps on iOS! :)"

            // Show default mail composer
            if MFMailComposeViewController.canSendMail() {
                let mail = MFMailComposeViewController()
                mail.mailComposeDelegate = self
                mail.setToRecipients([recipientEmail])
                mail.setSubject(subject)
                mail.setMessageBody(body, isHTML: false)

                present(mail, animated: true)

            // Show third party email composer if default Mail app is not present
            } else if let emailUrl = createEmailUrl(to: recipientEmail, subject: subject, body: body) {
                UIApplication.shared.open(emailUrl)
            }
        }

        private func createEmailUrl(to: String, subject: String, body: String) -> URL? {
            let subjectEncoded = subject.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
            let bodyEncoded = body.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

            let gmailUrl = URL(string: "googlegmail://co?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
            let outlookUrl = URL(string: "ms-outlook://compose?to=\(to)&subject=\(subjectEncoded)")
            let yahooMail = URL(string: "ymail://mail/compose?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
            let sparkUrl = URL(string: "readdle-spark://compose?recipient=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
            let defaultUrl = URL(string: "mailto:\(to)?subject=\(subjectEncoded)&body=\(bodyEncoded)")

            if let gmailUrl = gmailUrl, UIApplication.shared.canOpenURL(gmailUrl) {
                return gmailUrl
            } else if let outlookUrl = outlookUrl, UIApplication.shared.canOpenURL(outlookUrl) {
                return outlookUrl
            } else if let yahooMail = yahooMail, UIApplication.shared.canOpenURL(yahooMail) {
                return yahooMail
            } else if let sparkUrl = sparkUrl, UIApplication.shared.canOpenURL(sparkUrl) {
                return sparkUrl
            }

            return defaultUrl
        }

        func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
            controller.dismiss(animated: true)
        }
    }

कृपया ध्यान दें कि मैंने जानबूझकर आउटलुक ऐप के लिए बॉडी को छोड़ दिया है, क्योंकि यह इसे पार्स करने में सक्षम नहीं है।

आपको Info.plistउस कोड को फाइल करने के लिए निम्नलिखित कोड भी जोड़ना होगा जो यूआरएल क्वेरी योजनाओं का उपयोग करता है।

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlegmail</string>
    <string>ms-outlook</string>
    <string>readdle-spark</string>
    <string>ymail</string>
</array>

4
बहुत बढ़िया। यह सबसे पूर्ण उत्तर है और अन्य ईमेल क्लाइंट ऐप्स के लिए आसानी से एक्स्टेंसिबल है। IMHO, मुझे नहीं लगता कि 2019 के अंत में यह स्वीकार्य होगा कि वह व्यक्ति को "क्षमा करें, आप भाग्य से बाहर हैं" यदि वे डिफ़ॉल्ट ऐप्पल मेल ऐप का उपयोग नहीं करते हैं, जैसा कि अधिकांश अन्य समाधान बताते हैं। यह उस कमी को ठीक करता है।
वाइल्डकैट 12

क्या यह विधि HTML के साथ काम करती है? मैं इसे ठीक से प्रदर्शित नहीं कर सकता।
मैथ्यू ब्रेडशॉ

@MatthewBradshaw आप isHTMLउपरोक्त कोड को सही पर सेट करके डिफ़ॉल्ट मेल कंपोज़र के लिए HTML का समर्थन कर सकते हैं । अन्य ग्राहकों के लिए, यह संभव प्रतीत नहीं होता है, आगे पढ़ने के लिए stackoverflow.com/questions/5620324/mailto-link-with-html-body
WebMajstr

1
धन्यवाद, यह बहुत अच्छा है। मैंने इसे उपयोगकर्ता को अपनी पसंद के ग्राहक चुनने के लिए थोड़ा संशोधित किया (मैं उन्हें अग्रिम में canOpenUrl के साथ फ़िल्टर कर रहा हूं)। Microsoft आउटलुक के लिए Btw बॉडी ठीक काम कर रहा है :-)
फिलिप

ये जबरदस्त है! क्या किसी ने स्विफ्टयूआई के लिए ऐसा किया है?
एवरेट

55

मुझे यकीन नहीं है कि अगर आप मेल ऐप पर ही स्विच करना चाहते हैं या सिर्फ ओपन करना चाहते हैं और ईमेल भेजना चाहते हैं। एक बटन IBAction से जुड़े बाद वाले विकल्प के लिए:

    import UIKit
    import MessageUI

    class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

    @IBAction func launchEmail(sender: AnyObject) {

    var emailTitle = "Feedback"
    var messageBody = "Feature request or bug report?"
    var toRecipents = ["friend@stackoverflow.com"]
    var mc: MFMailComposeViewController = MFMailComposeViewController()
    mc.mailComposeDelegate = self
    mc.setSubject(emailTitle)
    mc.setMessageBody(messageBody, isHTML: false)
    mc.setToRecipients(toRecipents)

    self.presentViewController(mc, animated: true, completion: nil)
    }

    func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
        switch result {
        case MFMailComposeResultCancelled:
            print("Mail cancelled")
        case MFMailComposeResultSaved:
            print("Mail saved")
        case MFMailComposeResultSent:
            print("Mail sent")
        case MFMailComposeResultFailed:
            print("Mail sent failure: \(error?.localizedDescription)")
        default:
            break
        }
        self.dismissViewControllerAnimated(true, completion: nil)
    }

    }

1
मुझे ऐसे मुद्दे आ रहे हैं जहाँ mailComposeController प्रतिनिधि समारोह को नहीं बुलाया जा रहा है।
ऑस्टिन

3
अपने आयातों में "आयात MessageUI" जोड़ें और अपने वर्ग घोषणा में "MFMailComposeViewControllerDelegate" विकल्प जोड़ना सुनिश्चित करें: class myClass: UIViewController, MFMailComposeViewControllerDelegate {
Jalakoo

MFMailComposeViewController () मेरे लिए नील वापस
ilan 20

2
इसके अलावा होने मुद्दों: 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target। ऐप कुछ डिवाइसों (iPhone 5, iPhone 6 और iPad Mini) में क्रैश हो जाता है
Spacemonkey

23

स्विफ्ट 3 में आप जोड़ना सुनिश्चित करते हैं import MessageUIऔर MFMailComposeViewControllerDelegateप्रोटोकॉल के अनुरूप होना चाहिए ।

func sendEmail() {
  if MFMailComposeViewController.canSendMail() {
    let mail = MFMailComposeViewController()
    mail.mailComposeDelegate = self
    mail.setToRecipients(["ved.ios@yopmail.com"])
    mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)

    present(mail, animated: true)
  } else {
    // show failure alert
  }
}

मसविदा बनाना:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
  controller.dismiss(animated: true)
}

17

स्विफ्ट 4.2+ और आईओएस 9+ के लिए

let appURL = URL(string: "mailto:TEST@EXAMPLE.COM")!

if #available(iOS 10.0, *) {
    UIApplication.shared.open(appURL, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(appURL)
}

TEST@EXAMPLE.COM को अपने इच्छित ईमेल पते से बदलें।


16

उपलब्धता जांच के साथ स्विफ्ट 2 :

import MessageUI

if MFMailComposeViewController.canSendMail() {
    let mail = MFMailComposeViewController()
    mail.mailComposeDelegate = self
    mail.setToRecipients(["test@test.test"])
    mail.setSubject("Bla")
    mail.setMessageBody("<b>Blabla</b>", isHTML: true)
    presentViewController(mail, animated: true, completion: nil)
} else {
    print("Cannot send mail")
    // give feedback to the user
}


// MARK: - MFMailComposeViewControllerDelegate

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
    switch result.rawValue {
    case MFMailComposeResultCancelled.rawValue:
        print("Cancelled")
    case MFMailComposeResultSaved.rawValue:
        print("Saved")
    case MFMailComposeResultSent.rawValue:
        print("Sent")
    case MFMailComposeResultFailed.rawValue:
        print("Error: \(error?.localizedDescription)")
    default:
        break
    }
    controller.dismissViewControllerAnimated(true, completion: nil)
}

15

यहाँ यह स्विफ्ट 4 के लिए कैसा दिखता है:

import MessageUI

if MFMailComposeViewController.canSendMail() {
    let mail = MFMailComposeViewController()
    mail.mailComposeDelegate = self
    mail.setToRecipients(["test@test.test"])
    mail.setSubject("Bla")
    mail.setMessageBody("<b>Blabla</b>", isHTML: true)
    present(mail, animated: true, completion: nil)
} else {
    print("Cannot send mail")
    // give feedback to the user
}

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        switch result.rawValue {
        case MFMailComposeResult.cancelled.rawValue:
            print("Cancelled")
        case MFMailComposeResult.saved.rawValue:
            print("Saved")
        case MFMailComposeResult.sent.rawValue:
            print("Sent")
        case MFMailComposeResult.failed.rawValue:
            print("Error: \(String(describing: error?.localizedDescription))")
        default:
            break
        }
        controller.dismiss(animated: true, completion: nil)
    }

12

स्विफ्ट 3 के लिए स्टीफन ग्रूम से अपडेट किया गया उत्तर

let email = "email@email.com"
let url = URL(string: "mailto:\(email)")
UIApplication.shared.openURL(url!)

10

यहाँ स्विफ्ट 4 के लिए एक अपडेट दिया गया है, यदि आप मेल क्लाइंट को खोलने की कोशिश कर रहे हैं URL:

let email = "foo@bar.com"
if let url = URL(string: "mailto:\(email)") {
   UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

यह मेरे लिए पूरी तरह से ठीक काम :)


9

यह स्विफ्ट में 3 चरणों का एक सीधा आगे का समाधान है।

import MessageUI

डेलिगेट के अनुरूप जोड़ें

MFMailComposeViewControllerDelegate

और बस अपनी विधि बनाएँ:

    func sendEmail() {
    if MFMailComposeViewController.canSendMail() {
        let mail = MFMailComposeViewController()
        mail.mailComposeDelegate = self
        mail.setToRecipients(["support@mail.com"])
        mail.setSubject("Support App")
        mail.setMessageBody("<p>Send us your issue!</p>", isHTML: true)
        presentViewController(mail, animated: true, completion: nil)
    } else {
        // show failure alert
    }
}

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}

4

आपको अंतर्निहित मेल संगीतकार के साथ भेजने का प्रयास करना चाहिए, और यदि वह विफल रहता है, तो शेयर के साथ प्रयास करें:

func contactUs() {

    let email = "info@example.com" // insert your email here
    let subject = "your subject goes here"
    let bodyText = "your body text goes here"

    // https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller
    if MFMailComposeViewController.canSendMail() {

        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self as? MFMailComposeViewControllerDelegate

        mailComposerVC.setToRecipients([email])
        mailComposerVC.setSubject(subject)
        mailComposerVC.setMessageBody(bodyText, isHTML: false)

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

    } else {
        print("Device not configured to send emails, trying with share ...")

        let coded = "mailto:\(email)?subject=\(subject)&body=\(bodyText)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        if let emailURL = URL(string: coded!) {
            if #available(iOS 10.0, *) {
                if UIApplication.shared.canOpenURL(emailURL) {
                    UIApplication.shared.open(emailURL, options: [:], completionHandler: { (result) in
                        if !result {
                            print("Unable to send email.")
                        }
                    })
                }
            }
            else {
                UIApplication.shared.openURL(emailURL as URL)
            }
        }
    }
}

त्रुटि: "इस ऐप को स्कीम मेल्टो के लिए क्वेरी करने की अनुमति नहीं है"
खुशहाल iOS

3
@IBAction func launchEmail(sender: AnyObject) {
 if if MFMailComposeViewController.canSendMail() {
   var emailTitle = "Feedback"
   var messageBody = "Feature request or bug report?"
   var toRecipents = ["friend@stackoverflow.com"]
   var mc: MFMailComposeViewController = MFMailComposeViewController()
   mc.mailComposeDelegate = self
   mc.setSubject(emailTitle)
   mc.setMessageBody(messageBody, isHTML: false)
   mc.setToRecipients(toRecipents)

   self.present(mc, animated: true, completion: nil)
 } else {
   // show failure alert
 }
}

func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
    switch result {
    case .cancelled:
        print("Mail cancelled")
    case .saved:
        print("Mail saved")
    case .sent:
        print("Mail sent")
    case .failed:
        print("Mail sent failure: \(error?.localizedDescription)")
    default:
        break
    }
    self.dismiss(animated: true, completion: nil)
}

ध्यान दें कि सभी उपयोगकर्ताओं के पास ईमेल भेजने के लिए उनका डिवाइस कॉन्फ़िगर नहीं है, यही कारण है कि हमें भेजने की कोशिश करने से पहले canSendMail () के परिणाम की जांच करनी होगी। यह भी ध्यान दें कि मेल विंडो को खारिज करने के लिए आपको didFinishWith कॉलबैक को पकड़ना होगा।


1

व्यू कंट्रोलर में जहां से आप अपने मेल-ऐप को टैप पर खोलना चाहते हैं।

  • फ़ाइल के शीर्ष पर, MessageUI आयात करें
  • इस कार्य को अपने नियंत्रक के अंदर रखें।

    func showMailComposer(){
    
      guard MFMailComposeViewController.canSendMail() else {
           return
      }
      let composer = MFMailComposeViewController()
      composer.mailComposeDelegate = self
      composer.setToRecipients(["abc@gmail.com"]) // email id of the recipient
      composer.setSubject("testing!!!")
      composer.setMessageBody("this is a test mail.", isHTML: false)
      present(composer, animated: true, completion: nil)
     }
  • अपने दृश्य नियंत्रक का विस्तार करें और MFMailComposeViewControllerDelegate के अनुरूप हों ।

  • इस विधि को रखो और विफलता को संभालना, अपने मेल भेजना।

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
      if let _ = error {
          controller.dismiss(animated: true, completion: nil)
          return
      }
      controller.dismiss(animated: true, completion: nil)
    }

0

हम में से उन लोगों के लिए जो अभी भी स्विफ्ट 2.3 पर पिछड़ रहे हैं, यहाँ हमारे सिंटैक्स में गॉर्डन का जवाब है:

let email = "foo@bar.com"
if let url = NSURL(string: "mailto:\(email)") {
   UIApplication.sharedApplication().openURL(url)
}

0

स्विफ्ट 4.2 और इसके बाद के संस्करण के लिए

let supportEmail = "abc@xyz.com"
if let emailURL = URL(string: "mailto:\(supportEmail)"), UIApplication.shared.canOpenURL(emailURL)
{
    UIApplication.shared.open(emailURL, options: [:], completionHandler: nil)
}

ईमेल भेजने के लिए उपयोगकर्ता को कई मेल विकल्प (जैसे iCloud, google, yahoo, Outlook.com - यदि कोई मेल उसके फोन में पूर्व-कॉन्फ़िगर नहीं किया गया है) चुनने के लिए दें।


1
मेरे मामले में, iOS 13 के साथ, UIApplication.sared.open को कॉल करने पर, OS हमेशा Mail.app (ओह, और "mailto" के लिए canOpenURL स्थापित करने के लिए एक संवाद की पेशकश करेगा, यह हमेशा सही है, भले ही अन्य हों मेल ऐप्स। तो यह निश्चित रूप से काम नहीं कर रहा है।
नेवरवर्टनमून
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.