Question

When sending an email with receipts as following to: personA cc: personB bcc :personC

All the three person will get the email. And all the received emails will display personC in the receipts field. As we know the bcc contacts personC should not be displayed. Why could this happen? I correctly set the CTCoreMessage with to, cc and bcc. Is this a bug of MailCore Framework? Or is there something i missed?

Thanks in advance!

The following is the related code for your reference

- (IBAction)buttonSendPressed:(id)sender
{
[self dismissViewControllerAnimated:YES completion:^{
    CTCoreMessage *testMsg = [[CTCoreMessage alloc] init];
    NSMutableArray *mutArrTos = [NSMutableArray array]; // personA
    NSMutableArray *mutArrCcs = [NSMutableArray array];  // personB
    NSMutableArray *mutArrBccs = [NSMutableArray array];  // personC
    NSLog(@"toContactArr :%@",toContactArr);

    if (toContactArr.count>0) {
        for (NSDictionary *dict in toContactArr) {
            [mutArrTos addObject:[CTCoreAddress addressWithName:[dict valueForKey:@"name"] email:[dict valueForKey:@"email"]]];
        }
        NSLog(@"mutArrRecipients : %@", mutArrTos);
        [testMsg setTo:[NSSet setWithArray:mutArrTos]];
    }

    if (ccContactArr.count>0) {
        for (NSDictionary *dict in ccContactArr) {
            [mutArrCcs addObject:[CTCoreAddress addressWithName:[dict valueForKey:@"name"] email:[dict valueForKey:@"email"]]];
        }
        NSLog(@"mutArrRecipients : %@", mutArrCcs);
        [testMsg setCc:[NSSet setWithArray:mutArrCcs]];
    }


    if (bccContactArr.count>0) {
        for (NSDictionary *dict in bccContactArr) {
            [mutArrBccs addObject:[CTCoreAddress addressWithName:[dict valueForKey:@"name"] email:[dict valueForKey:@"email"]]];
        }
        NSLog(@"mutArrRecipients : %@", mutArrBccs);
        [testMsg setBcc:[NSSet setWithArray:mutArrBccs]];
    }

    [testMsg setFrom:[NSSet setWithObject:[CTCoreAddress addressWithName:@"222222" email:@"letibe.xx@gmail.com"]]];
    [testMsg setBody:self.textView.text];
    [testMsg setSubject:self.textField.text];

    DbManager *dbManager = [[DbManager sharedManager] switchDBWithFileName:DBNAME];
    User *user = [dbManager getAccount];
    NSString *account = user.account;
    NSString *pwd = user.password;
    NSString *emailType = user.email_type;
    NSLog(@"user: %@", user);

    NSLog(@"account: %@", account);
    NSLog(@"pwd: %@", pwd);
    NSLog(@"emailType: %@", emailType);


    NSError *error;
    BOOL success = [CTSMTPConnection sendMessage:testMsg server:@"smtp.gmail.com" username:@"letibe.xx@gmail.com" password:@"222222" port:25 useTLS:YES useAuth:YES error:&error];
    if (!success) {
        // Present the error
        NSLog(@"error: %@", error);
    }else{
        NSLog(@"CTSMTPConnection success");
    }

}];
}
Was it helpful?

Solution

After reading the SMTP protocol. I have modified the CTCoreMessage.m to remove the bcc address in the header as following. Then the bcc address won't print in the receiver.

CTCoreMessage.m

- (NSString *)render {
CTMIME *msgPart = myParsedMIME;

if ([myParsedMIME isKindOfClass:[CTMIME_MessagePart class]]) {
    /* It's a message part, so let's set it's fields */
    struct mailimf_fields *fields;
    struct mailimf_mailbox *sender = (myFields->fld_sender != NULL) ? (myFields->fld_sender->snd_mb) : NULL;
    struct mailimf_mailbox_list *from = (myFields->fld_from != NULL) ? (myFields->fld_from->frm_mb_list) : NULL;
    struct mailimf_address_list *replyTo = (myFields->fld_reply_to != NULL) ? (myFields->fld_reply_to->rt_addr_list) : NULL;
    struct mailimf_address_list *to = (myFields->fld_to != NULL) ? (myFields->fld_to->to_addr_list) : NULL;
    struct mailimf_address_list *cc = (myFields->fld_cc != NULL) ? (myFields->fld_cc->cc_addr_list) : NULL;
//  struct mailimf_address_list *bcc = (myFields->fld_bcc != NULL) ? (myFields->fld_bcc->bcc_addr_list) : NULL;
    clist *inReplyTo = (myFields->fld_in_reply_to != NULL) ? (myFields->fld_in_reply_to->mid_list) : NULL;
    clist *references = (myFields->fld_references != NULL) ? (myFields->fld_references->mid_list) : NULL;
    char *subject = (myFields->fld_subject != NULL) ? (myFields->fld_subject->sbj_value) : NULL;

    //TODO uh oh, when this get freed it frees stuff in the CTCoreMessage
    //TODO Need to make sure that fields gets freed somewhere
//  fields = mailimf_fields_new_with_data(from, sender, replyTo, to, cc, bcc, inReplyTo, references, subject);
    fields = mailimf_fields_new_with_data(from, sender, replyTo, to, cc, NULL, inReplyTo, references, subject);


    [(CTMIME_MessagePart *)msgPart setIMFFields:fields];
}
return [myParsedMIME render];
}

OTHER TIPS

enter image description here

Looks like the bug is with the framework itself, as the framework doesn't show anything that says the Bcc Address will be hidden

It is just showing that messages can be setted to bcc, cc and to.

I have digged the framework for 2 feet, but found nothing regarding the Bcc showing that it will be hidden at the receiving end...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top