MFMailComposeViewController 是在 MessageUI Framework 中的一個類別,主要被使用來製作電子郵件的相關格式,從 iOS 3.0 開始,可以透過 MessageUI Framework 來為您的應用程式增加傳送電子郵件的功能,MessageUI 套件包含許多電子郵件的細微設定,除了基本的收件人、副本與密文等,也包含了附加檔案功能,可以在郵件中插入圖片或是附帶其他類型的檔案,當然在內文的部份也支援使用 HTML 語言,其基本使用方式如下。
首先匯入 MessageUI Framework,並引用其標頭檔,Xcode 4 Framework 匯入方式可以參考 Xcode 4 新增 Framework 的方法一文。
#import <MessageUI/MessageUI.h>
接著在要使用此物件的類別上設定 <MFMailComposeViewControllerDelegate> 代理。
@interface AttachmentsMailViewController : UIViewController <MFMailComposeViewControllerDelegate> {
}
接下來在程式碼中增加一個離開電子郵件編輯畫面時的函式,此函式會在使用者按下左上角的取消按鈕,或是送出郵件時觸發。
//此為內建函式
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
//執行取消發送電子郵件畫面的動畫
[self dismissModalViewControllerAnimated:YES];
}
現在準備就緒,我們可以開始撰寫製作電子郵件的程式碼了,其程式瑪如下。
//建立物件與指定代理
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
//設定收件人與主旨等資訊
[controller setToRecipients:[NSArray arrayWithObjects:@"給所有讀者", @"還有我自己", nil]];
[controller setCcRecipients:[NSArray arrayWithObjects:@"嫦娥", @"月兔", nil]];
[controller setBccRecipients:[NSArray arrayWithObjects:@"我不能說", nil]];
[controller setSubject:@"佳節愉快"];
//設定內文並且不使用HTML語法
[controller setMessageBody:@"Furnace iOS 祝大家中秋節快樂。" isHTML:NO];
//加入圖片
UIImage *theImage = [UIImage imageNamed:@"image.png"];
NSData *imageData = UIImagePNGRepresentation(theImage);
[controller addAttachmentData:imageData mimeType:@"image/png" fileName:@"image"];
//顯示電子郵件畫面
[self presentModalViewController:controller animated:YES];
[controller release];
你好
回覆刪除請問一下email可以自動傳送嗎?
就是不跑出那個傳送的視窗出來?
感謝~
henry 您好:
刪除如果你希望電子郵件能自動傳送,可能要尋求 java 等網頁程式碼的方式,
使用 MFMailComposeViewController 物件,它必須在送出前請使用者做確認,我想這可能是為了安全性的考量。
謝謝回覆
回覆刪除請問java等網頁程式碼是要連接到server的意思嗎?
要自己架server這樣嗎?
henry 您好:
刪除不需要架設server這麼麻煩,你可以考慮使用 javascript 的方式,製作寄送電子郵件的 js 檔案,
有關 Objective-C 與 javascript 的問題,可以在網路上查詢 stringByEvaluatingJavaScriptFromString: 看看,應該蠻多資料的,
這部份我就沒有深入研究了,
sorry
牛奶您好,
回覆刪除謝謝你的教學,讓我在開發上受用無窮。
這邊有個問題想請教您
我把這程式碼寫在 navigationItem.rightBarButtonItem 上
當我點下去時可以順利寄信並回到原本畫面
但是當我要第二次使用這個功能後他不會呼叫
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
這個函式
所以按下傳送後就無法回到原本的頁面了
請問這是我哪邊寫錯了TT
謝謝
鈞 您好:
刪除我不太知道你的配置,我這邊是 MainViewController -(Press Button)-> MFMailComposeViewController
上這面這些程式碼應該是寫在被按下的那個按鈕動作中,動態產生 MFMailComposeViewController,在送出郵件部分不需要撰寫任何的程式碼。
依照你的情況,可能你的 navigationItem.rightBarButtonItem 和 MFMailComposeViewController 的送出郵件按鈕是同一個物件才會這樣,你可以考慮我上述的佈局,我剛剛也做了一次沒什麼問題,不管送出成功與否都應該會呼叫你上面所說的函式,除非你沒設定 Delegate。
另外,如果你是用 iOS6.0 SDK,在 present 與 dismiss UIViewController 這邊已經換了方法函式:
presentViewController: animated: completion:
dismissViewControllerAnimated: completion:
completion: 必須使用 BLOCK 來撰寫,當然也可以填寫 nil,利用 completion: 可以得知你目前 UIViewController 的使用狀況。
牛奶你好:
回覆刪除請問本Framework裡提到的"也包含了附加檔案功能"
有限定附加檔案的格式嗎?
您好:
刪除沒有所謂的格式限定,但是你必須江檔案轉換成 NSData 型態喔,像是下面的網頁,就示範如何將 zip 格式賺換成 NSData。
http://stackoverflow.com/questions/3687235/using-ziparchive-zip-file-in-iphone-mail-attachment
牛奶您好:
回覆刪除請問如何運用此範例裡頭的insert photo or video 以及select之後出現的BIU 於其他程式中?
您好:
刪除我不是很瞭解您的問題耶,如果你只的是如何應用這些 Attachments,例如匯出到其他應用程式中,或是從其他地方匯入到 MFMailComposeViewController 之中,你可以參考以下的網頁(英文),雖然sdk的版本可能有所差異,但是實作上卻是相同的,觀念就是在 plist 中定義所支援的 CFBundleDocumentTypes 你才能將對應的檔案格式匯入到所寫的應用程式中。
http://mobiforge.com/developing/story/importing-exporting-documents-ios
另外,對於 Document 的存取,我們也有寫過類似文章可以供您參考。
ps:您所指的 BIU 是...?
牛奶你好:
回覆刪除我想要利用此framwork實做一個可發布訊息的app 因此我必須更改navigation bar item 的功能,不知道有沒有什麼方法可以自己實做一個,而不是用framwork裡面的
您好:
刪除這似乎沒辦法直接使用,你會發現你可以更改 navigation 的背景顏色或之類的,但是當你要自訂一個新的按鈕,你卻沒也辦法add到 left 或是 right 上面,因為這就是它的限制,它的作用只用來製作 mail 的發送,如果您是想製作訊息請參閱 MFMessageComposeViewController,不太一樣的東西。
下面是官方網站 MFMessageComposeViewController Reference的連結,抱歉幫不上忙:
http://developer.apple.com/library/ios/#documentation/MessageUI/Reference/MFMessageComposeViewController_class/Reference/Reference.html
您好:
回覆刪除我想請問
1. ios 5 不能執行,請問有辦法改嗎?
2. 一定要在ViewController才能使用嗎?
您好:
刪除ios5是可以執行的喔,沒有問題!
不一定要在ViewController才能用,它自己本身就是一個ViewController