en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

9.12.2011

MFMailComposeViewController 的基本使用方法


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






14 則留言:

  1. 你好
    請問一下email可以自動傳送嗎?
    就是不跑出那個傳送的視窗出來?
    感謝~

    回覆刪除
    回覆
    1. henry 您好:

      如果你希望電子郵件能自動傳送,可能要尋求 java 等網頁程式碼的方式,
      使用 MFMailComposeViewController 物件,它必須在送出前請使用者做確認,我想這可能是為了安全性的考量。

      刪除
  2. 謝謝回覆
    請問java等網頁程式碼是要連接到server的意思嗎?
    要自己架server這樣嗎?

    回覆刪除
    回覆
    1. henry 您好:

      不需要架設server這麼麻煩,你可以考慮使用 javascript 的方式,製作寄送電子郵件的 js 檔案,
      有關 Objective-C 與 javascript 的問題,可以在網路上查詢 stringByEvaluatingJavaScriptFromString: 看看,應該蠻多資料的,
      這部份我就沒有深入研究了,

      sorry

      刪除
  3. 牛奶您好,
    謝謝你的教學,讓我在開發上受用無窮。
    這邊有個問題想請教您
    我把這程式碼寫在 navigationItem.rightBarButtonItem 上
    當我點下去時可以順利寄信並回到原本畫面
    但是當我要第二次使用這個功能後他不會呼叫
    - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
    這個函式
    所以按下傳送後就無法回到原本的頁面了
    請問這是我哪邊寫錯了TT
    謝謝

    回覆刪除
    回覆
    1. 鈞 您好:

      我不太知道你的配置,我這邊是 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 的使用狀況。

      刪除
  4. 匿名3/26/2013

    牛奶你好:

    請問本Framework裡提到的"也包含了附加檔案功能"
    有限定附加檔案的格式嗎?

    回覆刪除
    回覆
    1. 您好:

      沒有所謂的格式限定,但是你必須江檔案轉換成 NSData 型態喔,像是下面的網頁,就示範如何將 zip 格式賺換成 NSData。

      http://stackoverflow.com/questions/3687235/using-ziparchive-zip-file-in-iphone-mail-attachment

      刪除
  5. 匿名4/03/2013

    牛奶您好:
    請問如何運用此範例裡頭的insert photo or video 以及select之後出現的BIU 於其他程式中?

    回覆刪除
    回覆
    1. 您好:

      我不是很瞭解您的問題耶,如果你只的是如何應用這些 Attachments,例如匯出到其他應用程式中,或是從其他地方匯入到 MFMailComposeViewController 之中,你可以參考以下的網頁(英文),雖然sdk的版本可能有所差異,但是實作上卻是相同的,觀念就是在 plist 中定義所支援的 CFBundleDocumentTypes 你才能將對應的檔案格式匯入到所寫的應用程式中。

      http://mobiforge.com/developing/story/importing-exporting-documents-ios


      另外,對於 Document 的存取,我們也有寫過類似文章可以供您參考。

      ps:您所指的 BIU 是...?

      刪除
  6. 匿名4/03/2013

    牛奶你好:
    我想要利用此framwork實做一個可發布訊息的app 因此我必須更改navigation bar item 的功能,不知道有沒有什麼方法可以自己實做一個,而不是用framwork裡面的

    回覆刪除
    回覆
    1. 您好:

      這似乎沒辦法直接使用,你會發現你可以更改 navigation 的背景顏色或之類的,但是當你要自訂一個新的按鈕,你卻沒也辦法add到 left 或是 right 上面,因為這就是它的限制,它的作用只用來製作 mail 的發送,如果您是想製作訊息請參閱 MFMessageComposeViewController,不太一樣的東西。

      下面是官方網站 MFMessageComposeViewController Reference的連結,抱歉幫不上忙:
      http://developer.apple.com/library/ios/#documentation/MessageUI/Reference/MFMessageComposeViewController_class/Reference/Reference.html

      刪除
  7. 匿名8/01/2013

    您好:
    我想請問
    1. ios 5 不能執行,請問有辦法改嗎?
    2. 一定要在ViewController才能使用嗎?

    回覆刪除
    回覆
    1. 您好:
      ios5是可以執行的喔,沒有問題!
      不一定要在ViewController才能用,它自己本身就是一個ViewController

      刪除