MailCore / mailcore2

MailCore 2 provide a simple and asynchronous API to work with e-mail protocols IMAP, POP and SMTP. The API has been redesigned from ground up.
Other
2.6k stars 623 forks source link

[Bug] - when I try to connect and fetch all mail I got error. #1896

Open Anilkumar18 opened 3 years ago

Anilkumar18 commented 3 years ago

like this: Error Domain=MCOErrorDomain Code=5 "Unable to authenticate with the current session's credentials." UserInfo={NSLocalizedDescription=Unable to authenticate with the current session's credentials.}

I put this code in my project.

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    prepareImapSession()
  }

  var imapsession:MCOIMAPSession = MCOIMAPSession()
  var error : Error? = nil

  func prepareImapSession()
  {
    // CONFIGURE THAT DEPENDING OF YOUR NEEDS
    imapsession.hostname = "imap.gmail.com" // String
    imapsession.username = "12345@gmail.com" // String for sample
    imapsession.password = "12345678" // String for sample
    imapsession.port = 993 // UInt32 number
    imapsession.authType = MCOAuthType.saslLogin
    imapsession.connectionType = MCOConnectionType.TLS
    DispatchQueue.main.asyncAfter(deadline: .now() + 8) { [self] in
      self.useImapWithUIDS()
    }
    imapsession.connectOperation()
  }

  func useImapWithUIDS() {
    // There is more than one option here, explore depending of your needs
//    let kind = MCOIMAPMessagesRequestKind()
//    let headers = kind.union(MCOIMAPMessagesRequestKind.headers)
//    let request = headers.union(MCOIMAPMessagesRequestKind.flags)

    let requestKind: MCOIMAPMessagesRequestKind = [.headers, .flags]
    let folder : String = "INBOX"

    // HERE ALSO EXPLORE DEPENDING OF YOUR NEEDS, RANGE IT IS THE RANGE OF THE UIDS THAT YOU WANT TO FETCH, I SUGGEST TO YOU TO CHANGE THE  // NUMBER ONE IF YOU HAVE A LOWER BOUND TO FETCH EMAIL
    let uids : MCOIndexSet = MCOIndexSet(range: MCORangeMake(1, UINT64_MAX))

    let fetchOperation  = imapsession.fetchMessagesOperation(withFolder: folder, requestKind: requestKind, uids: uids)

    fetchOperation?.start
    { [self] (err, msg, vanished) -> Void in

      if (err != nil)
      {
        self.error = err
        NSLog((err?.localizedDescription)!)
      }
      else
      {

        guard let msgs = msg as? [MCOIMAPMessage]
        else
        {
          print("ERROR GETTING THE MAILS")
          return
        }

        for i in 0..<msgs.count
        {
          // THE SUBJECT
          let subject = msgs[i].header.subject

          // THE uid for this email. The uid is unique for one email
          let uid = msgs[i].uid

          self.useImapFetchContent(uidToFetch: uid)
          // The sequenceNumber like the nomber say it is the sequence for the emails in the INBOX from the first one                                     // (sequenceNumber = 1) to the last one , it not represent always the same email. Because if you delete one email then                              //next one will get the sequence number of that email that was deleted
          let sequenceNumber = msgs[i].sequenceNumber

        }
      }
    }
  }

  // MARK: - EXTRACT THE CONTENT OF ONE EMAIL, IN THIS FUNCTION YOU NEED THE uid, THE UNIQUE NUMBER FOR ONE EMAIL
  func useImapFetchContent(uidToFetch uid: UInt32) {

    let operation: MCOIMAPFetchContentOperation = imapsession.fetchMessageOperation(withFolder: "INBOX", uid: uid)
    operation.start { (Error, data) in
      if (Error != nil)
      {
        NSLog("ERROR")
        return
      }

      let messageParser: MCOMessageParser = MCOMessageParser(data: data)

      // IF YOU HAVE ATTACHMENTS USE THIS
      let attachments = messageParser.attachments() as? [MCOAttachment]

      // THEN YOU NEED THIS PROPERTIE, IN THIS EXAMPLE I TAKE THI FIRST, USE WHAT EVER YOU WANT
      let attachData = attachments?.first?.data

      // FOR THE MESSAGEPARSER YOU CAN EPLORE MORE THAN ONE OPTION TO OBTAIN THE TEXT
      let msgPlainBody = messageParser.plainTextBodyRendering()

    }

  }
}
haithngn commented 3 years ago

@Anilkumar18 In case you are using Gmail account with the password in plaintext please make sure you turned on Less secure access apps in Gmail account setting.

Have you authenticated success with these credentials via loginOperation from MCOSMTPSession instance?