スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


このエントリーをはてなブックマークに追加

アプリからメール送信する方法

iPhoneアプリからメール送信画面を開いて、添付ファイル等を送信する方法について紹介。

まずは、MessageUI.framewarkというフレームワークを追加する。

※XCODE4でフレームワークの追加方法が分からない場合は↓を参照
Xcode4の使い方 - フレームワークを追加する方法

次に、メール送信画面を呼び出すビューやビューコントローラに対して、MFMailComposeViewControllerDelegateインターフェースを追加する。


@interface xxxViewController : UIViewController <UIActionSheetDelegate, MFMailComposeViewControllerDelegate> {
    :
}


メール送信画面呼び出しコードは次のとおり。


MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];
mailPicker.mailComposeDelegate = self;

// メール本文を設定
[mailPicker setMessageBody:@"本文" isHTML:NO];

// 題名を設定
[mailPicker setSubject:@"題名"];

// 宛先を設定
[mailPicker setToRecipients:[NSArray arrayWithObjects:@"aaa@bbb", @"ccc@ddd", nil]];

// 添付ファイル名を設定
NSString *imagePath = [NSString stringWithFormat:@"%@/test.gif" , [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];
NSData* fileData = [NSData dataWithContentsOfFile:imagePath];
[mailPicker addAttachmentData:fileData mimeType:@"image/gif" fileName:imagePath];

// メール送信用のモーダルビューを表示
[self presentModalViewController:mailPicker animated:TRUE];
[self presentViewController:mailPicker animated:TRUE completion:nil];  // iOS6以降

[mailPicker release];


そして最後は、メール送信処理完了時にdelegateによって呼び出されるメソッドを実装。見ての通り、成功/失敗/キャンセル等にも呼び出される。


// メール送信処理完了時のイベント
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    switch (result){
        case MFMailComposeResultCancelled:  // キャンセル
            break;
        case MFMailComposeResultSaved:      // 保存
            break;
        case MFMailComposeResultSent:       // 送信成功
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                  message:@"送信に成功しました"
                                                 delegate:nil
                                        cancelButtonTitle:nil
                                        otherButtonTitles:@"OK", nil];
            [alert show];
            [alert release];
            break;
        }
        case MFMailComposeResultFailed:     // 送信に失敗した場合
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                  message:@"送信に失敗しました"
                                                 delegate:nil
                                        cancelButtonTitle:nil
                                        otherButtonTitles:@"OK", nil];
            [alert show];
            [alert release];
            break;
        }
        default:
            break;
    }
    [self dismissModalViewControllerAnimated:YES];
    [self dismissViewControllerAnimated:YES completion:nil];  // iOS6以降
}


以上。iOS3.0以降であればこの方法でお手軽に実装できる。このサンプルではアニメーションGIFファイルを添付しているが、メール送信画面でアニメーションが動くのが嬉しい。もちろん別の形式の添付ファイルでもOK!

※2012/10/31追記
・ヘッダのインクルードに関する説明が抜けていたため追記します。

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


・iOS6以降の場合の記述を追記しました。(赤文字部分)
・サンプルプログラムを追加しました。
 こちらからダウンロードできます


このエントリーをはてなブックマークに追加

コメント

非公開コメント

質問です

はじめまして!
アプリ内でメーラーを起動させたくて、このブログを見つけ、念願叶ったのですが、変な現象がおきています。

Xcode4.5使用で、iPhone5ではパーフェクトなのですが、下記のデバイスでエラーが出るのです。最初はiOSのバージョンに依るものかと思いましたがそうではありませんでした。

何がイケナイのでしょうか?アドバイス頂けますと幸いでございます。

iPhone4S (iOS6) エラー
iPhone4 (iOS4.35)エラー
iPod Touch (iOS6) エラー

エラーは。。

2012-10-30 18:42:50.311 myApp[164:907] CRASH: Application tried to present a nil modal view controller on target <DAViewController: 0x1f082070>.
2012-10-30 18:42:50.370 myApp[164:907] Stack Trace: (
0 CoreFoundation 0x375b52bb <redacted> + 186
1 libobjc.A.dylib 0x358c597f objc_exception_throw + 30
2 UIKit 0x38972141 <redacted> + 3764
3 UIKit 0x38a94257 <redacted> + 30
4 SleepPaid 0x0007f305 -[DAViewController mailSending:] + 292
5 UIKit 0x389710ad <redacted> + 72
6 UIKit 0x3897105f <redacted> + 30
7 UIKit 0x3897103d <redacted> + 44
8 UIKit 0x389708f3 <redacted> + 502
9 UIKit 0x38970de9 <redacted> + 488
10 UIKit 0x388995f9 <redacted> + 524
11 UIKit 0x38886809 <redacted> + 380
12 UIKit 0x38886123 <redacted> + 6154
13 GraphicsServices 0x37a395a3 <redacted> + 590
14 GraphicsServices 0x37a391d3 <redacted> + 34
15 CoreFoundation 0x3758a173 <redacted> + 34
16 CoreFoundation 0x3758a117 <redacted> + 138
17 CoreFoundation 0x37588f99 <redacted> + 1384
18 CoreFoundation 0x374fbebd CFRunLoopRunSpecific + 356
19 CoreFoundation 0x374fbd49 CFRunLoopRunInMode + 104
20 GraphicsServices 0x37a382eb GSEventRunModal + 74
21 UIKit 0x388da301 UIApplicationMain + 1120
22 SleepPaid 0x0007ec19 main + 260
23 SleepPaid 0x0007eb10 start + 40
)
2012-10-30 18:42:50.376 SleepPaid[164:907] *** Assertion failure in void UIApplicationInstantiateSingleton(Class)(), /SourceCache/UIKit/UIKit-2372/UIApplication.m:2037
2012-10-30 18:42:50.378 SleepPaid[164:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
*** First throw call stack:
(0x375b52a3 0x358c597f 0x375b515d 0x3503730b 0x388da79d 0x388da109 0x7ed25 0x7eb10)
libc++abi.dylib: terminate called throwing an exception
(lldb)

どうぞよろしくお願い致します。

Re: 質問です

コメントありがとうございます。

> Xcode4.5使用で、iPhone5ではパーフェクトなのですが、下記のデバイスでエラーが出るのです。最初はiOSのバージョンに依るものかと思いましたがそうではありませんでした。
妙な現象ですね・・・。こちらではiPhone4S+iOS6.0 および iPhone3GS+iOS5.0.1の環境で正常動作しています。
iPhone5のみ動作ということで、考えられるのはアーキテクチャの違い(armv7s)ぐらいですが、よく分かりませんね。。

念のため確認に使ったサンプルプログラムを以下に配置しておきます。参考にしてみてください。
http://araking.hustle.ne.jp/download/MailSendTest.zip
※iOS6.0に対応できるよう記事のコードを少し変更しています。(記事自体も少しメンテしました)

質問

このサイトを参考している者ですが
サンプルプログラムをiPhone3GS+iOS6.0で起動したところ
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); Thread 1: signal SIGABRT
というエラーが出てきてしまい正しく起動しません。
iphone開発を始めたばかりなので何がいけないのかよくわかりません。
アドバイスを頂けるとうれしいです。

Application tried to present a nil modal view controller on target について

Application tried to present a nil modal view controller on target
の件ですが、その端末がメールを送れる状態でない場合に発生するようです。
http://stackoverflow.com/questions/10435496/application-tried-to-present-a-nil-modal-view-controller-on-target-error-crash
にあるとおり、MFMailComposeViewController の canSendMail で確認すると回避できました。

No title

質問されているエラーの件ですが、私も同じ現象になり、ネットをあさっておりました。

その後、解決いたしましたので書き込みさせていただきます。

iPhoneのメール設定をされていない場合に、[[MFMailComposeViewController alloc] init];から nil が返されるようです。

事前に確認を行い処理をする必要があるようです。

if ([MFMailComposeViewController canSendMail]){
// OKなのでメールの初期化等の処理
}
else {
// NGなのでメッセージ表示
}

ご参考まで
iPhoneアプリ紹介
パズルナビ for パズドラ 2016
最強のコンボツール!
colorization-large-icon.png

スクリーンショットを読み込むとコンボを自動計算してくれるパズドラの攻略アプリです。


AirRuler
(簡易距離計)

リモートで簡単に距離を測定できるアプリ!
colorization-large-icon.png

目標地点に向けてiPhoneを傾けるだけで簡単に距離を測定できます。ゴルフの距離測定機能付きパターの代わりにも使えます。


補色残像アート
~見えない色が見えてくる~
白黒なのにカラーに見えてしまう不思議な映像を体験しよう!
colorization-large-icon.png

補色残像という目の錯覚を利用して、白黒写真がカラーに見える不思議な映像を作成できます。作成した映像は、アニメGIFに変換したり、Twitterに投稿することもできます。


タイピング革命
フリック練習はタイピング革命で!ネットランキングで盛り上がろう!
icon-l-typing.jpg

オンラインランキング上のプレイを閲覧できるリプレイ機能付き!フリック入力とローマ字入力に完全対応したタイピング練習アプリです。初心者も安心のトレーニングモード付き。

★なんと!あのAppBank様に紹介して頂きました!!
typing-sale-led.gif


簡単3Dカメラ
iPhoneで手軽に3D写真を楽しもう!平行法/交差法/アナグリフ/グラグラ3Dに対応。
icon-l-3d.jpg

2枚の写真を撮影するだけで、裸眼で立体視できる3D写真が作成できます。85円でステレオ写真もアナグリフも楽しめるのは簡単3Dカメラだけ!

プロフィール

あらきんぐ☆

Author:あらきんぐ☆
はじめまして。あらきんぐです。
4月からiPhoneを購入し、その魅力に取り付かれて、気がついたらアプリ開発の道へ!仕事でプログラム開発をしていますが、基本「動けばOK!」な適当エンジニアです。適当でもアプリは作れる!っていう事を、ブログを通じて証明していきたと思います。

最新記事
最新コメント
最新トラックバック
カテゴリ
FC2カウンター
全記事表示リンク

全ての記事を表示する

Twitter
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
アクセスランキング
[ジャンルランキング]
コンピュータ
487位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
72位
アクセスランキングを見る>>
オススメ商品
iPhone/iPodと一般オーディオを繋ぐ貴重なアイテム!
アプライドオリジナルアイテム MBB...

アプライドオリジナルアイテム MBB...
価格:3,980円(税込、送料別)

開発中級者にオススメ!「こんなことができるんだ!」と驚かされる一冊
【送料無料】iPhone...

【送料無料】iPhone...
価格:1,500円(税込、送料別)

安い!シンプル!カッコいい!
希少なiPhone対応キーボード内蔵ケース
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。