iOS : MFMailComposeViewControllerでメールを送信する

MessageUIフレームワークのMFMailComposeViewControllerを利用することで、アプリケーション内でメールの作成や送信ができます。

サンプルコードの実行例

概要

MFMailComposeViewControllerは以下の手順で利用します。

  1. プロジェクトにMessageUIフレームワークを追加する
  2. canSendMail関数を利用して、メール送信できることを確認する
  3. MFMailComposeViewControllerインスタンスを生成し、宛先や本文などを設定する
  4. MFMailComposeViewControllerDelegateで終了処理を実装する
  5. 親ViewControllerからpresentModalViewController関数を利用して画面を表示する

プロジェクトにMessageUIフレームワークを追加する

MFMailComposeViewControllerを利用するために、プロジェクトにMessageUIフレームワークを追加します。

プロジェクトのFrameworksにMessageUI.frameworkを追加します。

MessageUI.frameworkの追加

次に、MessageUIフレームワークのヘッダーファイルを読み込みます。

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

メール送信できることを確認する

システムにメールアカウントが設定されていないとメール送信できないため、MFMailComposeViewControllerが利用できません。MFMailComposeViewControllerを利用する前にcanSendMail関数を利用して、メールアカウントが設定されているか/メール送信可能かを確認する必要があります。

クラス
MFMailComposeViewController
関数
+ ( BOOL )canSendMail
説明
メールアカウントが設定されているとYESを、未設定だとNOを返します。
利用例
if( [ MFMailComposeViewController canSendMail ] == NO ) {

canSendMailプロパティの公式リファレンス

canSendMail関数の結果がNOだった場合は、メールアカウントの設定が必要であることを、アラートなどを利用してユーザに通知する必要があります。

MFMailComposeViewControllerインスタンスを生成し、宛先や本文などを設定する

MFMailComposeViewControllerインスタンスを生成し、setMessageBody:isHTML:などの関数を利用してメール本文や宛先などを設定します。メール本文や宛先などの指定は省略することもできます。

メールタイトルを設定する:setSubject:関数

クラス
MFMailComposeViewController
関数
- ( void )setSubject:( NSString* )subject
説明
subject引数でメールのタイトルを指定します。
利用例
[ controller setSubject:@"テストメール" ];

setSubject:関数の公式リファレンス

宛先を設定する:setToRecipients:関数

クラス
MFMailComposeViewController
関数
- ( void )setToRecipients:( NSArray* )toRecipients
説明
toRecipients引数でメールの宛先を指定します。toRecipientsは文字列(NSString)の配列(NSArray)です。複数の宛先を指定できます。
利用例
[ controller setToRecipients:[ NSArray arrayWithObject:@"main@example.com" ] ];

setToRecipients:関数の公式リファレンス

CCを設定する:setCcRecipients:関数

クラス
MFMailComposeViewController
関数
- ( void )setCcRecipients:( NSArray* )ccRecipients
説明
ccRecipients引数でメールのCC宛先を指定します。ccRecipientsは文字列(NSString)の配列(NSArray)です。複数の宛先を指定できます。
利用例
[ controller setCcRecipients:[ NSArray arrayWithObjects:
        @"cc1@example.com", @"cc2@excample.com", nil ] ];

setCcRecipients:関数の公式リファレンス

BCCを設定する:setBccRecipients:関数

クラス
MFMailComposeViewController
関数
- ( void )setBccRecipients:( NSArray* )bccRecipients
説明
bccRecipients引数でメールのBCC宛先を指定します。bccRecipientsは文字列(NSString)の配列(NSArray)です。複数の宛先を指定できます。
利用例
[ controller setBccRecipients:[ NSArray arrayWithObjects:
        @"bcc1@example.com", @"bcc2@excample.com", nil ] ];

setBccRecipients:関数の公式リファレンス

メール本文を設定する:setMessageBody:isHTML:関数

クラス
MFMailComposeViewController
関数
- ( void )setMessageBody:( NSString* )body isHTML:( BOOL )isHTML
説明
body引数でメール本文を指定します。isHTMLがYESの場合はHTMLメール、NOの場合はテキストメールとなります。
利用例
[ controller setMessageBody:@"サンプルメール\n2行目\n3行目" isHTML:NO ];

setMessageBody:isHTML:関数の公式リファレンス

メール本文に改行を含めるには、「\n」で改行を表します。

HTMLメール本文を固定文字列で指定する場合は、「”」(ダブルクオーテーション)のエスケープが必要です。HTMLメール本文の属性値などは「”」の代わりに「'」(シングルクォーテーション)を利用するとエスケープの手間が省けます。

MFMailComposeViewControllerDelegateで終了処理を実装する

MFMailComposeViewControllerのmailComposeDelegateプロパティとMFMailComposeViewControllerDelegateを利用することで、メール作成・送信の結果を取得し、画面の終了処理を実装できます。

クラス
MFMailComposeViewController
プロパティ
mailComposeDelegate
説明
MFMailComposeViewControllerDelegateプロトコルを実装したインスタンスを設定すると、メール作成・送信画面が終了したタイミングでDelegate関数が呼び出されます。
利用例
controller.mailComposeDelegate = self;

mailComposeDelegateプロパティの公式リファレンス

プロトコル
MFMailComposeViewControllerDelegate
関数
- ( void )mailComposeController:( MFMailComposeViewController* )controller didFinishWithResult:( MFMailComposeResult )result error:( NSError* )error
説明
メール作成・送信画面が終了したタイミングで呼び出されます。controller引数は対象となるMFMailComposeViewControllerインスタンス、resultは完了結果、errorはエラー情報が設定されます。

MFMailComposeViewControllerDelegateプロトコルの公式リファレンス

result引数をチェックすることで結果を確認できます。result引数にはMFMailComposeResult列挙子の値が設定されます。

MFMailComposeResult列挙子

MFMailComposeResultSentメールを送信した
MFMailComposeResultSavedメールを保存した
MFMailComposeResultCancelledキャンセルした(メールを破棄した)
MFMailComposeResultFailed失敗した

MFMailComposeResult列挙子の公式リファレンス

メール編集・送信画面を閉じるために、MFMailComposeViewControllerのdismissModalViewControllerAnimated:関数を呼び出します。メール編集・送信画面で「送信」「キャンセル」ボタンをタップしても自動的に画面は閉じません。明示的にdismissModalViewControllerAnimated:関数を呼び出す必要があります。

メール編集・送信画面を閉じるには、MFMailComposeViewControllerインスタンスに対してdismissModalViewControllerAnimated:関数を呼び出します(親ViewControllerではありません)。

クラス
UIViewController
関数
- ( void )dismissModalViewControllerAnimated:( BOOL )animated
説明
表示中のViewControllerを閉じます。animated引数にYESを指定すると、画面下へスライドするように閉じます。NOを指定すると、瞬時に閉じます。
利用例
[ controller dismissModalViewControllerAnimated:YES ];

dismissModalViewControllerAnimated:関数の公式リファレンス

presentModalViewController関数を利用して画面を表示する

親ViewControllerのpresentModalViewController関数を利用して、メール作成・送信画面を表示します。メール作成・送信画面では、ユーザがメール本文や宛先などを入力・編集することができます。

クラス
UIViewController
関数
- ( void )presentModalViewController:( UIViewController* )modalViewController animated:( BOOL )animated
説明
modalViewController引数にMFMailComposeViewControllerインスタンスを指定します。animated引数にYESを指定すると、画面下からスライドするように表示されます。NOを指定すると、瞬時に表示されます。
利用例
[ self presentModalViewController:controller animated:YES ];

presentModalViewController:animated:関数の公式リファレンス

注意点

言語設定

アプリケーションの言語設定が英語だと、メール作成・送信画面も英語で表示されます(ボタン表記が英語)。

MFMailComposeViewControllerの英語表示

アプリケーションの言語設定を日本語にすると、日本語表記で画面が表示されます。言語設定はアプリケーションのplistファイルを開いて、「Localization native development region」項目で「Japan」を選びます。

アプリケーションの言語設定
MFMailComposeViewControllerの日本語表示

対応するiOS

MessageUIフレームワーク(MFMailComposeViewController)はiOS 3.0以降で利用できます。

メールアプリの起動

メールアプリを起動したい場合は、UIApplicationクラスのopenURL関数を利用します。

[ [ UIApplication sharedApplication ] openURL:
        [ NSURL URLWithString:@"mailto:test@example.com" ] ];

サンプルコード

- ( void )loadView
{
    [ super loadView ];

    UIView * parentView = self.view;
    
    parentView.backgroundColor = [ UIColor grayColor ];
    
    UIButton * buttonA = [ UIButton buttonWithType:UIButtonTypeRoundedRect ];
    [ buttonA setTitle:@"MFMailComposeViewController起動" forState:UIControlStateNormal ];
    buttonA.frame = CGRectMake( 20, 50, 280, 55 );
    [ buttonA addTarget:self action:@selector( onTapButtonA: ) forControlEvents:UIControlEventTouchUpInside ];
    [ parentView addSubview:buttonA ];
    
    UIButton * buttonB = [ UIButton buttonWithType:UIButtonTypeRoundedRect ];
    [ buttonB setTitle:@"mailtoで起動" forState:UIControlStateNormal ];
    buttonB.frame = CGRectMake( 20, 150, 280, 55 );
    [ buttonB addTarget:self action:@selector( onTapButtonB: ) forControlEvents:UIControlEventTouchUpInside ];
    [ parentView addSubview:buttonB ];
    
    return;
}

- ( void )onTapButtonA:( id )sender
{
    if( [ MFMailComposeViewController canSendMail ] == NO )
    {
        [ [ [ [ UIAlertView alloc ] initWithTitle:@"エラー" message:@"メールアカウントを設定してください" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil ] autorelease ] show ];
    }
    else
    {
        MFMailComposeViewController * controller = [ [ [ MFMailComposeViewController alloc ] init ] autorelease ];
        
        [ controller setSubject:@"テストメール" ];
        [ controller setToRecipients:[ NSArray arrayWithObject:@"main@example.com" ] ];
        [ controller setCcRecipients:[ NSArray arrayWithObjects:@"cc1@example.com", @"cc2@excample.com", nil ] ];
        [ controller setBccRecipients:[ NSArray arrayWithObjects:@"bcc1@example.com", @"bcc2@excample.com", nil ] ];
        [ controller setMessageBody:@"サンプルメール€n2行目€n3行目" isHTML:NO ];
        controller.mailComposeDelegate = self;
        
        [ self presentModalViewController:controller animated:YES ];
    }
    
    return;
}

- ( void )mailComposeController:( MFMailComposeViewController* )controller didFinishWithResult:( MFMailComposeResult )result error:( NSError* )error
{
    if( error != nil )
    {
        NSLog( @"エラーが発生しました。" );
    }
    else
    {
        switch( result )
        {
            case MFMailComposeResultSent: NSLog( @"メールを送信" ); break;
            case MFMailComposeResultSaved: NSLog( @"メールを保存" ); break;
            case MFMailComposeResultCancelled: NSLog( @"キャンセル" ); break;
            case MFMailComposeResultFailed: NSLog( @"失敗" ); break;
            default: NSLog( @"不明な結果" ); break;
        }
    }
    
    [ controller dismissModalViewControllerAnimated:YES ];
    
    return;
}