ドコモiPhoneメールのアカウントでメールを送受信(IMAP/SMTP)する

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];