Eメールクライアントアプリの送受信機能については、今から作る人はたぶんMailCore2を使った方が楽です。
https://github.com/MailCore/mailcore2/
こんな感じでできました
@import CFNetwork; @import Security; #import <MailCore/MailCore.h> const NSString * const DocomoMailAddress = @"xxx@docomo.ne.jp"; const NSString * const DocomoMailUser = @"user"; const NSString * const DocomoMailPassword = @"password"; const NSString * const ExampleMailingAddress = @"hello@example.jp"; @implementation DocomoMailSender - (void)fetchMessages { MCOIMAPSession *session = [[MCOIMAPSession alloc] init]; [session setHostname:@"imap2.spmode.ne.jp"]; [session setPort:993]; [session setUsername:DocomoMailUser]; [session setPassword:DocomoMailPassword]; [session setConnectionType:MCOConnectionTypeTLS]; MCOIMAPMessagesRequestKind requestKind = MCOIMAPMessagesRequestKindHeaders; NSString *folder = @"INBOX"; MCOIndexSet *uids = [MCOIndexSet indexSetWithRange:MCORangeMake(1, UINT64_MAX)]; MCOIMAPFetchMessagesOperation *fetchOperation = [session fetchMessagesByUIDOperationWithFolder:folder requestKind:requestKind uids:uids]; [fetchOperation start:^(NSError * error, NSArray * fetchedMessages, MCOIndexSet * vanishedMessages) { if(error) { NSLog(@"Error downloading message headers:%@", error); } for (MCOAbstractMessage *message in fetchedMessages) { NSLog(@"Subject: %@", message.header.subject); } }]; } - (void)sendMail { MCOSMTPSession *session = [[MCOSMTPSession alloc] init]; [session setHostname:@"smtp.spmode.ne.jp"]; [session setPort:465]; [session setUsername:DocomoMailUser]; [session setPassword:DocomoMailPassword]; [session setConnectionType:MCOConnectionTypeTLS]; MCOMessageHeader *header = [[MCOMessageHeader alloc] init]; [header setFrom:[MCOAddress addressWithMailbox:DocomoMailAddress]]; [header setTo:@[[MCOAddress addressWithMailbox:ExampleMailingAddress]]]; [header setSubject:[NSString stringWithFormat:@"テストメール: %f", [[NSDate date] timeIntervalSince1970]]]; MCOMessageBuilder * builder = [[MCOMessageBuilder alloc] init]; builder.header = header; builder.textBody = @"" "こんにちは\n" "\n" "テストメールです。\n"; MCOSMTPSendOperation *sendOperation = [session sendOperationWithData:[builder data]]; [sendOperation start:^(NSError *error) { if(error) { NSLog(@"Error send email connection:%@", error); } }]; } @end
https://gist.github.com/laiso/8554578
ストリーム接続にSSLv3が必須で仕様が公開されています。
ドコモメールアプリ以外のメールソフトでのご利用方法 | サービス・機能 | NTTドコモ
MCOConnectionTypeTLSの部分。
既存ライブラリだとよくMCOConnectionTypeStartTLSと同じSTARTTLS相当の実装になっててサーバーに接続できなくてハマるかもしれない(知識ないのでプロトコル詳細は理解してない)。
SKPSMTPMessageなんかもそうなっていて、パッチあてる必要があった。ので自作してる人は以下のようにNSInputStreamにNSStreamSocketSecurityLevelKeyの値を入れるようにするのが良さそう。
[inputStream setProperty:NSStreamSocketSecurityLevelSSLv3 forKey:NSStreamSocketSecurityLevelKey]; [inputStream open];