Abishek Thangaraj
Abishek Thangaraj

Reputation: 923

I tried to connect and fetch mails using mailcore2 in iOS. But I got error

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 = my email // String
    imapsession.password = password // String
    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()
      
    }
    
  }
}

I using the mailcore2 framework. I got error description Unable to authenticate with the current session's credentials.

Upvotes: 0

Views: 439

Answers (1)

Łukasz Łabuński
Łukasz Łabuński

Reputation: 587

It can be related with 2nd factor authentication on your account. It was described on Apple forum.

Upvotes: 0

Related Questions