MessageUIフレームワークのMFMailComposeViewControllerを利用することで、アプリケーション内でメールの作成や送信ができます。
MFMailComposeViewControllerは以下の手順で利用します。
MFMailComposeViewControllerを利用するために、プロジェクトにMessageUIフレームワークを追加します。
プロジェクトのFrameworksにMessageUI.frameworkを追加します。
次に、MessageUIフレームワークのヘッダーファイルを読み込みます。
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
システムにメールアカウントが設定されていないとメール送信できないため、MFMailComposeViewControllerが利用できません。MFMailComposeViewControllerを利用する前にcanSendMail関数を利用して、メールアカウントが設定されているか/メール送信可能かを確認する必要があります。
if( [ MFMailComposeViewController canSendMail ] == NO ) {
canSendMail関数の結果がNOだった場合は、メールアカウントの設定が必要であることを、アラートなどを利用してユーザに通知する必要があります。
MFMailComposeViewControllerインスタンスを生成し、setMessageBody:isHTML:などの関数を利用してメール本文や宛先などを設定します。メール本文や宛先などの指定は省略することもできます。
[ 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 ];
setMessageBody:isHTML:関数の公式リファレンス
メール本文に改行を含めるには、「\n」で改行を表します。
HTMLメール本文を固定文字列で指定する場合は、「”」(ダブルクオーテーション)のエスケープが必要です。HTMLメール本文の属性値などは「”」の代わりに「'」(シングルクォーテーション)を利用するとエスケープの手間が省けます。
MFMailComposeViewControllerのmailComposeDelegateプロパティとMFMailComposeViewControllerDelegateを利用することで、メール作成・送信の結果を取得し、画面の終了処理を実装できます。
controller.mailComposeDelegate = self;
mailComposeDelegateプロパティの公式リファレンス
MFMailComposeViewControllerDelegateプロトコルの公式リファレンス
result引数をチェックすることで結果を確認できます。result引数にはMFMailComposeResult列挙子の値が設定されます。
MFMailComposeResultSent | メールを送信した |
MFMailComposeResultSaved | メールを保存した |
MFMailComposeResultCancelled | キャンセルした(メールを破棄した) |
MFMailComposeResultFailed | 失敗した |
MFMailComposeResult列挙子の公式リファレンス
メール編集・送信画面を閉じるために、MFMailComposeViewControllerのdismissModalViewControllerAnimated:関数を呼び出します。メール編集・送信画面で「送信」「キャンセル」ボタンをタップしても自動的に画面は閉じません。明示的にdismissModalViewControllerAnimated:関数を呼び出す必要があります。
メール編集・送信画面を閉じるには、MFMailComposeViewControllerインスタンスに対してdismissModalViewControllerAnimated:関数を呼び出します(親ViewControllerではありません)。
[ controller dismissModalViewControllerAnimated:YES ];
dismissModalViewControllerAnimated:関数の公式リファレンス
親ViewControllerのpresentModalViewController関数を利用して、メール作成・送信画面を表示します。メール作成・送信画面では、ユーザがメール本文や宛先などを入力・編集することができます。
[ self presentModalViewController:controller animated:YES ];
presentModalViewController:animated:関数の公式リファレンス
アプリケーションの言語設定が英語だと、メール作成・送信画面も英語で表示されます(ボタン表記が英語)。
アプリケーションの言語設定を日本語にすると、日本語表記で画面が表示されます。言語設定はアプリケーションのplistファイルを開いて、「Localization native development region」項目で「Japan」を選びます。
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;
}