Попытка отправить электронное письмо из приложения не работает — Swift (iOS)

Я попробовал 2 кода с разных сайтов, чтобы отправить электронное письмо из приложения для iOS. Когда я нажимаю кнопку Отправить, он вызывает метод mailComposeController и всегда возвращает мне журнал "Почта отправлена", так как параметр result всегда MFMailComposeResultSent.value, даже если мой iPhone 5S находится в режиме полета.

Кроме того, даже когда у меня есть подключение к Интернету, я никогда не получаю электронное письмо. Уже проверил СПАМ и другие папки и ждал целый день, если он задерживался, но так и не получил, даже пытаясь несколько раз.

Я программирую на Swift и использую XCode 6.4 на сетчатке Macbook Pro с середины 2014 года с Yosemite 10.10.5.

Здесь код Swift:

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        if (MFMailComposeViewController.canSendMail()) {

            var emailTitle = "Vea Software Feedback"

            var messageBody = "Vea Software! :)"

            var toRecipents = ["[email protected]"]

            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)

        }else {

            println("No email account found")

        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // Email Delegate
    func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {

        switch result.value {
        case MFMailComposeResultCancelled.value:
            println("Mail cancelled")
        case MFMailComposeResultSaved.value:
            println("Mail saved")
        case MFMailComposeResultSent.value:
            println("Mail sent")
        case MFMailComposeResultFailed.value:
            println("Mail sent failure: \(error.localizedDescription)")
        default:
            break
        }
        self.dismissViewControllerAnimated(false, completion: nil)

    }
}

Большое спасибо за вашу помощь заранее.


person oscar    schedule 05.11.2015    source источник


Ответы (3)


для меня отлично работает следующий код:

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()

    if MFMailComposeViewController.canSendMail() {
      let toRecipents = ["[email protected]"]
      let emailTitle = "Vea Software Feedback"
      let messageBody = "Vea Software! :)"

      let mc: MFMailComposeViewController = MFMailComposeViewController()
      mc.mailComposeDelegate = self
      mc.setToRecipients(toRecipents)
      mc.setSubject(emailTitle)
      mc.setMessageBody(messageBody, isHTML: false)

      presentViewController(mc, animated: true, completion: nil)
    } else {
      print("cannot send mails")
    }
  }

  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
    }

    dismissViewControllerAnimated(true, completion: nil)
  }
}
person André Slotta    schedule 05.11.2015
comment
кстати: вы тестируете в симуляторе или на реальном устройстве? - person André Slotta; 05.11.2015
comment
Тестирую на своем реальном устройстве iPhone 5S. - person oscar; 05.11.2015
comment
Вы получили в свой почтовый ящик отправленное сообщение? (в коде, который вы вставляете, есть мой адрес электронной почты). - person oscar; 05.11.2015
comment
конечно, я помещаю СВОЮ электронную почту в это. :) и я получил почту, да. ты пробовал мой код? особенно я изменил некоторые вещи в методе делегата mailcomposecontroller... - person André Slotta; 05.11.2015
comment
вы используете let, а оператор использует var - person Daij-Djan; 05.11.2015
comment
Да. я изменил это, так как mailcomposecontroller не меняется. нет необходимости в var. - person André Slotta; 05.11.2015
comment
Андре Слотта, я попробовал ваш код, но он выдает ошибки в 4 строках каждого случая в переключателе в методе mailComposeController(). Ошибка: бинарный оператор '~=' не может быть применен к двум операндам MFMailComposeResult. - person oscar; 05.11.2015
comment
Я также попытался изменить var на let в своем коде и отправить сообщение, но все равно ничего не получил в свой почтовый ящик :( - person oscar; 05.11.2015
comment
хорошо, похоже, вы не работаете со swift 2. можете ли вы добавить [email protected] в список получателей и попробовать отправить еще раз со своим старым кодом? просто чтобы убедиться, что ваша электронная почта не проблема... - person André Slotta; 05.11.2015
comment
Хорошо, я отправил вам письмо по адресу: [email protected] Вы его получили? Я использую Свифт. Как я могу использовать Swift2? Спасибо. - person oscar; 05.11.2015
comment
ок, ничего не получил. а вообще можно отправлять почту с айфона? - person André Slotta; 05.11.2015
comment
Да, я отправляю электронные письма каждый день из приложения Gmail на своем iPhone. - person oscar; 05.11.2015
comment
gmail не означает, что у вас есть почтовая учетная запись, которую может использовать ваш mailcomposecontroller! когда вы открываете обычное почтовое приложение на своем iphone. у вас есть почтовая учетная запись, чтобы отправлять туда письма? - person André Slotta; 05.11.2015
comment
Вау!! Задача решена! Вот в чем проблема! Я не связывал свою учетную запись электронной почты с собственным почтовым приложением iOS для целей Почты, а только для контактов, календарей и заметок. Большое спасибо Adre Slotta!!! :) П.С. Это работало также с моим исходным кодом и var вместо let. - person oscar; 05.11.2015
comment
Да. я знаю, что var не вызывал ошибку. но поскольку вы не меняете контроллер впоследствии, вы можете и должны использовать let, я думаю. пожалуйста. Рад, что смог помочь. :) - person André Slotta; 05.11.2015
comment
Я ответил себе, сказав, в чем проблема, но я не знаю, как закрыть эту проблему в Stackoverflow. Могу ли я или админ это сделать? Спасибо еще раз. - person oscar; 05.11.2015

Благодаря Андре Слотте я решил свою проблему.

Проблема заключалась в том, что я не включил переключатель «Почта» в «Настройки»> «Почта, контакты, календарь»> «myemailaccount».

Это позволяет отправлять и получать электронные письма из собственного приложения iOS. Вместо этого я просто включил это для «Контактов», «Календарей» и «Заметок» и использовал приложение Gmail iOS для электронной почты на своем iPhone.

Это работало и с моим исходным кодом, так что это вообще не было проблемой кода, и каждый может попробовать мой исходный код в Swift (не Swift2).

Еще раз спасибо Андре Слотта за вашу помощь!!!

person oscar    schedule 05.11.2015

Пожалуйста, добавьте учетную запись электронной почты в настройки мобильного телефона!

person Shakeel Ahmed    schedule 18.12.2017