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.61k stars 627 forks source link

Email Sending failed with OAuth2 + Gmail #298

Closed abhinavguptas closed 11 years ago

abhinavguptas commented 11 years ago

This error comes randomly when sending email, I am using Gmail + XOauth2.

With connection logger, this line seems to be culprit : 503 5.5.1 RCPT first. om2sm26921682pbc.30 - gsmtp

Here are full logs for further reference

22:47:01.230  [-1] 
22:47:01.230  [0] 220 mx.google.com ESMTP om2sm26921682pbc.30 - gsmtp
22:47:01.230  [-1] 
22:47:01.231  [-1] 
22:47:01.232  [-1] 
22:47:01.233  [1] EHLO Abhinavs-MacBook-Pro.local
22:47:01.233  [-1] 
22:47:01.233  [-1] 
22:47:01.652  [-1] 
22:47:01.652  [0] 250-mx.google.com at your service, [122.161.15.197]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250 ENHANCEDSTATUSCODES
22:47:01.653  [-1] 
22:47:01.653  [-1] 
22:47:01.654  [-1] 
22:47:01.654  [1] AUTH XOAUTH2 dXNlcj10eWxybW9iYWJAZ21haWwuY29tAWF1dGg9QmVhcmVyIHlhMjkuQUhFUzZaUkRMS1ZTNE5ORk1Hck5zendKWnlqZkhkUFk4QVZROWMzczRWWS1RTlUBAQ==
22:47:01.654  [-1] 
22:47:01.656  [-1] 
22:47:02.280  [-1] 
22:47:02.280  [0] 235 2.7.0 Accepted
22:47:02.281  [-1] 
22:47:02.281  [-1] 
22:47:02.282  [-1] 
22:47:02.282  [1] MAIL FROM:<tylrmobab@gmail.com> SIZE=52873
22:47:02.282  [-1] 
22:47:02.283  [-1] 
22:47:02.566  [-1] 
22:47:02.566  [0] 250 2.1.0 OK om2sm26921682pbc.30 - gsmtp
22:47:02.567  [-1] 
22:47:02.567  [-1] 
22:47:02.568  [-1] 
22:47:02.569  [1] DATA
22:47:02.569  [-1] 
22:47:02.570  [-1] 

22:47:02.979  [-1] 
22:47:02.979  [0] 503 5.5.1 RCPT first. om2sm26921682pbc.30 - gsmtp
22:47:02.980  [-1] 
22:47:02.981  [-1] 
dinhvh commented 11 years ago

Could you show the code you use to reproduce it?

Hoa V. Dinh

On Saturday, August 10, 2013 at 10:26 AM, Abhinav Gupta wrote:

This error comes randomly when sending email, I am using Gmail + XOauth2. With connection logger, this line seems to be culprit : 503 5.5.1 RCPT first. om2sm26921682pbc.30 -
gsmtp
Here are full logs for further reference 2013-08-10 22:47:01.230 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.230 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [0] 220 mx.google.com ESMTP om2sm26921682pbc.30 - gsmtp 2013-08-10 22:47:01.230 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.231 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.232 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.233 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [1] EHLO Abhinavs-MacBook-Pro.local 2013-08-10 22:47:01.233 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.233 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.652 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.652 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [0] 250-mx.google.com at your service, [122.161.15.197] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN 250 ENHANCEDSTATUSCODES 2013-08-10 22:47:01.653 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.653 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.654 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.654 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [1] AUTH XOAUTH2 dXNlcj10eWxybW9iYWJAZ21haWwuY29tAWF1dGg9QmVhcmVyIHlhMjkuQUhFUzZaUkRMS1ZTNE5ORk1Hck5zendKWnlqZkhkUFk4QVZROWMzczRWWS1RTlUBAQ== 2013-08-10 22:47:01.654 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:01.656 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.280 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.280 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [0] 235 2.7.0 Accepted 2013-08-10 22:47:02.281 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.281 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.282 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.282 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [1] MAIL FROM:tylrmobab@gmail.com SIZE=52873 2013-08-10 22:47:02.282 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.283 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.566 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.566 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [0] 250 2.1.0 OK om2sm26921682pbc.30 - gsmtp 2013-08-10 22:47:02.567 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.567 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.568 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.569 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [1] DATA 2013-08-10 22:47:02.569 TylrApp[32042:1403] -TAMailFetcher _syncFlags:vanishedMessages:error: Deleting 'INBOX' : Mail : Re: RE: Image Attach 2013-08-10 22:47:02.569 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.570 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.571 TylrApp[32042:1403] -TAMailFetcher _syncFlags:vanishedMessages:error: Deleting 'INBOX' : Mail : Re: RE: Image Attach 2013-08-10 22:47:02.979 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.979 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [0] 503 5.5.1 RCPT first. om2sm26921682pbc.30 - gsmtp 2013-08-10 22:47:02.980 TylrApp[32042:7607] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.981 TylrApp[32042:7607] __43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke(0xc6f6e0) [-1] 2013-08-10 22:47:02.984 TylrApp[32042:a0b] 43+[TAOutboxItemManager _sendEmail:withData:]_block_invoke146(0xc6f6e0) IMAPOperation Thread: <NSThread: 0xd923110>{name = (null), num = 1} (lldb)

— Reply to this email directly or view it on GitHub (https://github.com/MailCore/mailcore2/issues/298).

abhinavguptas commented 11 years ago

Here is minified code, I think it randomly fails when sending mails with attachments.

    NSDictionary *data; // its dictionary having required message details

    NSString *replyToMsgId = [data objectForKey:@"messageId"];
    NSDictionary *metadata = [data objectForKey:@"emailMetadata"];
    NSString *accountEmailAddress = [metadata objectForKey:@"accountEmailAddress"];

    // load the mail being replied from Core Data
    NSPredicate* predUidFolder = [NSPredicate predicateWithFormat:@"messageId == %@", replyToMsgId];
    NSPredicate* predAccount = [TAMailUtil predicateForEmailAccount:accountEmailAddress];
    NSManagedObjectContext *coreCtx = [TACoreUtil createCurrentThreadContext];
    Mail *replyToMail = (Mail*)[TACoreUtil fetchSingleObjectForName:@"Mail"
                                                      withPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:@[predAccount, predUidFolder]]
                                                          inContext:coreCtx];

    MCOMessageBuilder * builder = [[MCOMessageBuilder alloc] init];
    NSMutableArray *toAddresses = [NSMutableArray new];
    NSMutableArray *ccAddresses = [NSMutableArray new];

    if ([data objectForKey:@"reply"]) {
        for (NSDictionary *currentAddress in [data objectForKey:@"replyTo"]){
            MCOAddress *toAddress = [MCOAddress addressWithDisplayName:[currentAddress objectForKey:@"name"] mailbox:[currentAddress objectForKey:@"email"]];
            [toAddresses addObject:toAddress];
        }

        if ([[data objectForKey:@"reply"] isEqualToString:@"replyAll"]) {
            for (NSDictionary *currentAddress in [data objectForKey:@"cc"]){
                MCOAddress *ccAddress = [MCOAddress addressWithDisplayName:[currentAddress objectForKey:@"name"] mailbox:[currentAddress objectForKey:@"email"]];
                [ccAddresses addObject:ccAddress];
            }
            [[builder header] setCc:ccAddresses];
        }
    } else {
        for (NSDictionary *currentAddress in [data objectForKey:@"toAddresses"]){
            MCOAddress *toAddress = [MCOAddress addressWithDisplayName:[currentAddress objectForKey:@"name"] mailbox:[currentAddress objectForKey:@"email"]];
            [toAddresses addObject:toAddress];
        }
    }
    if (replyToMail) {
        NSMutableArray *references = [NSMutableArray arrayWithObject:replyToMail.messageId];
        if (replyToMail.references && replyToMail.references.length > 0) {
            // add previous messageId references if any
            NSArray* previousRefs = [replyToMail.references componentsSeparatedByString:TAMailReferencesSeperatorToken];
            [references addObjectsFromArray:previousRefs];
        }

        [builder.header setReferences:references];
        [builder.header setInReplyTo:@[replyToMsgId]];
    }

    [[builder header] setCc:toAddresses];

    if (replyToMail) {
        [builder.header setSubject:[NSString stringWithFormat:@"Re: %@", [data objectForKey:@"subject"]]];
    } else {
        [builder.header setSubject:[data objectForKey:@"subject"] ? [data objectForKey:@"subject"] : @""];
    }

    // Marlin: should use messageBody instead
    [builder setHTMLBody:[data objectForKey:@"body"]];
    // load atachments from core data
    for (Content *contnt in [[self class] _loadAttachments:data managedObjectContext:coreCtx]) {
        NSString *filePath = contnt.localFilePath;

        NSString *contentType = @"application/octet-stream";
        if (contnt.fileType) {
            if ([contnt.fileType rangeOfString:@"text/" options:NSCaseInsensitiveSearch].location != NSNotFound
                ||
                [contnt.fileType rangeOfString:@"application/json" options:NSCaseInsensitiveSearch].location != NSNotFound
                ) {
                contentType = contnt.fileType;
            }
        }

        NSString *fileName = contnt.title;
        NSString *fileExt = [TAContentUtil fileExtensionForContent:contnt];
        if (![fileName hasSuffix:fileExt]){
            fileName = [NSString stringWithFormat:@"%@.%@", fileName, fileExt];
        }
        NSData *data = [NSData dataWithContentsOfFile:filePath];

        MCOAttachment *attch = [MCOAttachment attachmentWithData:data filename:fileName];
        [attch setMimeType:contentType];
        [builder addAttachment:attch];
    }

    NSString *messageId = [TAMailUtil generateMessageIdForSender:accountEmailAddress messageBody:[data objectForKey:@"body"]];
    // add message ID, so that the same email could be fetched back from server as required
    [builder.header setMessageID:messageId];
    // added from address
    [[builder header] setFrom:[MCOAddress addressWithDisplayName:userDisplayName mailbox:emailAddress]];

    MCOSMTPSession *smtpSession = [[MCOSMTPSession alloc] init];
    smtpSession.hostname = acc.osAddress;
    smtpSession.port =  465 ;//acc.osPort;//change to 465 if doesn't works
    smtpSession.username = acc.osUserName;
    smtpSession.connectionType = MCOConnectionTypeTLS;//acc.osUseSSLToConnect ? MCOConnectionTypeTLS : MCOConnectionTypeClear;    
    if (mailAccType == TAMailAccountTypeGoogleOAuth) {
        smtpSession.OAuth2Token = password;
        smtpSession.authType = MCOAuthTypeXOAuth2;
    } else {
        smtpSession.password = password;
    }

    MCOSMTPSendOperation *sendOperation = [smtpSession sendOperationWithData:builder.data];
    [sendOperation start:^(NSError *error) {
dinhvh commented 11 years ago

Is your recipient list empty?

abhinavguptas commented 11 years ago

Thanks @dinhviethoa ! that was correct, sorry for trouble.