1. 程式人生 > >IOS開發中呼叫(傳送)Email的方法

IOS開發中呼叫(傳送)Email的方法

IOS系統框架提供的兩種傳送Email的方法:openURL 和 MFMailComposeViewController。藉助這兩個方法,我們可以輕鬆的在應用里加入如使用者反饋這類需要傳送郵件的功能。

1.openURL

使用openURL呼叫系統郵箱客戶端是我們在IOS3.0以下實現發郵件功能的主要手段。我們可以通過設定url裡的相關引數來指定郵件的內容,不過其缺點很明顯,這樣的過程會導致程式暫時退出。下面是使用openURL來發郵件的一個小例子: C程式碼  收藏程式碼
  1. #pragma mark - 使用系統郵件客戶端傳送郵件   
  2. -(void)launchMailApp     
  3. {       
  4.     NSMutableString *mailUrl = [[[NSMutableString alloc]init]autorelease];     
  5.     //新增收件人   
  6.     NSArray *toRecipients = [NSArray arrayWithObject: @"
    [email protected]
    "
    ];     
  7.     [mailUrl appendFormat:@"mailto:%@", [toRecipients componentsJoinedByString:@","]];     
  8.     //新增抄送   
  9.     NSArray *ccRecipients = [NSArray arrayWithObjects:@"[email protected]", @"[email protected]", nil];       
  10.     [mailUrl appendFormat:@"?cc=%@", [ccRecipients componentsJoinedByString:@
    ","]];     
  11.     //新增密送   
  12.     NSArray *bccRecipients = [NSArray arrayWithObjects:@"[email protected]", nil];       
  13.     [mailUrl appendFormat:@"&bcc=%@", [bccRecipients componentsJoinedByString:@","]];     
  14.     //新增主題   
  15.     [mailUrl appendString:@"&subject=my email"];     
  16.     //新增郵件內容   
  17.     [mailUrl appendString:@"&body=<b>email</b> body!"
    ];     
  18.     NSString* email = [mailUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];       
  19.     [[UIApplication sharedApplication] openURL: [NSURL URLWithString:email]];       
  20. }    
 缺點很明顯,這樣的過程會導致程式暫時退出,即使在iOS 4.x支援多工的情況下,這樣的過程還是會讓人覺得不是很方便。

2.MFMailComposeViewController

MFMailComposeViewController是在IOS3.0新增的一個介面,它在MessageUI.framework中。通過呼叫MFMailComposeViewController,可以把郵件傳送視窗整合到我們的應用裡,傳送郵件就不需要退出程式了。MFMailComposeViewController的使用方法:
  • 1.專案中引入MessageUI.framework;
  • 2.在使用的檔案中匯入MFMailComposeViewController.h標頭檔案;
  • 3.實現MFMailComposeViewControllerDelegate,處理郵件傳送事件;
  • 4.調出郵件傳送視窗前先使用MFMailComposeViewController裡的“+ (BOOL)canSendMail”方法檢查使用者是否設定了郵件賬戶;
  • 5.初始化MFMailComposeViewController,構造郵件體
#pragma mark - 在應用內傳送郵件
//啟用郵件功能
-(void)contactUsWithEmail
{
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
    if (!mailClass) {
        NSLog(@"當前系統版本不支援應用內傳送郵件功能,您可以使用mailto方法代替");
        return;
    }
    if (![mailClass canSendMail]) {
        NSLog(@"使用者沒有設定郵件賬戶!");
        return;
    }
    [self displayMailPicker];
}

//調出郵件傳送視窗
- (void)displayMailPicker
{
    MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc]init];
    mailPicker.mailComposeDelegate = self;
    //設定主題
    [mailPicker setSubject: @"智慧體溫計意見反饋"];
    //新增收件人
    NSArray *toRecipients = [NSArray arrayWithObject: @"[email protected]"];
    [mailPicker setToRecipients: toRecipients];
    //新增抄送
    NSArray *ccRecipients = [NSArray arrayWithObjects:@"[email protected]", @"[email protected]", nil];
    [mailPicker setCcRecipients:ccRecipients];
    //新增密送
    NSArray *bccRecipients = [NSArray arrayWithObjects:@"[email protected]", nil];
    [mailPicker setBccRecipients:bccRecipients];
    
    // 新增一張圖片
    UIImage *addPic = [UIImage imageNamed: @"[email protected]"];
    NSData *imageData = UIImagePNGRepresentation(addPic);            // png
    //關於mimeType:http://www.iana.org/assignments/media-types/index.html
    [mailPicker addAttachmentData: imageData mimeType: @"" fileName: @"Icon.png"];
    
    //新增一個pdf附件
//    NSString *file = [self fullBundlePathFromRelativePath:@"高質量C++程式設計指南.pdf"];
//    NSData *pdf = [NSData dataWithContentsOfFile:file];
//    [mailPicker addAttachmentData: pdf mimeType: @"" fileName: @"高質量C++程式設計指南.pdf"];
    
    NSString *emailBody = @"<font color='red'>如果我們的產品有不完善的地方給你帶來不便,我在此表示誠摯的歉意!請趕快把你的建議告訴我們吧。</font> /n  正文";
    [mailPicker setMessageBody:emailBody isHTML:YES];
    [self presentViewController:mailPicker animated:YES completion:nil];
}

#pragma mark - 實現 MFMailComposeViewControllerDelegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    //關閉郵件傳送視窗
    [self dismissViewControllerAnimated:controller completion:nil];
    NSString *msg;
    switch (result) {
        case MFMailComposeResultCancelled:
            msg = @"使用者取消編輯郵件";
            break;
        case MFMailComposeResultSaved:
            msg = @"使用者成功儲存郵件";
            break;
        case MFMailComposeResultSent:
            msg = @"使用者點擊發送,將郵件放到佇列中,還沒傳送";
            break;
        case MFMailComposeResultFailed:
            msg = @"使用者試圖儲存或者傳送郵件失敗";
            break;
        default:
            msg = @"";
            break;
    }
    [self alertWithTitle:@"郵箱操作提醒" Message:msg Animation:URBAlertAnimationFlipVertical];
}
-(void)alertWithTitle:(NSString *)title Message:(NSString *)msg  Animation:(URBAlertAnimation)animation
{
    URBAlertView *alertView = [[URBAlertView alloc]initWithTitle:title subtitle:msg];
    alertView.blurBackground = YES;
    [alertView addButtonWithTitle:@"取消"];
    [alertView addButtonWithTitle:@"確認"];
    [alertView setHandlerBlock:^(NSInteger buttonIndex, URBAlertView *alertView) {
        if (buttonIndex == 0) {
            //取消動作
        }else
        {
            //確認動作:解除繫結
            NSLog(@"button tapped: index=%li", (long)buttonIndex);
            
        }
        
        [alertView hideWithCompletionBlock:^{
            // stub
        }];
    }];
    
    [alertView showWithAnimation:URBAlertAnimationTumble];

}


 第二種方法的劣勢也很明顯,iOS系統替我們提供了一個mail中的UI,而我們卻完全無法對齊進行訂製,這會讓那些定製化成自己風格的App望而卻步,因為這樣使用的話無疑太突兀了。

3、我們可以根據自己的UI設計需求來定製相應的檢視以適應整體的設計。可以使用比較有名的開源SMTP協議來實現。

 https://github.com/jetseven/skpsmtpmessage

在SKPSMTPMessage類中,並沒有對檢視進行任何的要求,它提供的都是資料層級的處理,你之需要定義好相應的傳送要求就可以實現郵件傳送了。至於是以什麼樣的方式獲取這些資訊,就可以根據軟體的需求來確定互動方式和檢視樣式了。

Java程式碼  收藏程式碼
  1. SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];  
  2.         testMsg.fromEmail = @"[email protected]";  
  3.         testMsg.toEmail [email protected]"[email protected]";  
  4.         testMsg.relayHost = @"smtp.gmail.com";  
  5.         testMsg.requiresAuth = YES;  
  6.         testMsg.login = @"[email protected]";  
  7.         testMsg.pass = @"test";  
  8.         testMsg.subject = [NSString stringWithCString:"測試" encoding:NSUTF8StringEncoding];  
  9.         testMsg.bccEmail = @"[email protected]";  
  10.         testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!
  11.         // Only do this for self-signed certs!
  12.         // testMsg.validateSSLChain = NO;
  13.         testMsg.delegate = self;  
  14. NSDictionary *plainPart = [NSDictionary   
  15. dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,  
  16. [NSString stringWithCString:"測試正文" encoding:NSUTF8StringEncoding],  
  17. kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];  
  18. NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];  
  19. NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath];  
  20. NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys: @"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey,  
  21. @"attachment;\r\n\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,  
  22. [vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];  
  23.  testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];  
  24.  [testMsg send];  

該類也提供了相應的Delegate方法來讓你更好的獲知傳送的狀態.

Java程式碼  收藏程式碼
  1. -(void)messageSent:(SKPSMTPMessage *)message;  
  2. -(void)messageFailed:(SKPSMTPMessage *)message   
  3. error:(NSError *)error; 

相關推薦

IOS開發呼叫傳送Email方法

IOS系統框架提供的兩種傳送Email的方法:openURL 和 MFMailComposeViewController。藉助這兩個方法,我們可以輕鬆的在應用里加入如使用者反饋這類需要傳送郵件的功能。 1.openURL 使用openURL呼叫系統郵箱客戶端是我們在

多年iOS開發經驗總結

1、設定UILabel行間距 NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:label.text];

iOS開發基礎Swift04— 迴圈

迴圈的介紹在開發中經常會需要迴圈常見的迴圈有:for/while/do while.這裡我們只介紹for/while,因為for/while最常見for迴圈的寫法最常規寫法// 傳統寫法 for var

iOS開發之runtime:runtime除錯環境搭建

本系列部落格是本人的原始碼閱讀筆記,如果有iOS開發者在看runtime的,歡迎大家多多交流。為了方便討論,本人新建了一個微信群(iOS技術討論群),想要加入的,請新增本人微信:zhujinhui207407,【加我前請備註:ios 】,本人部落格http://www.kyson.cn 也在不停的更新中,歡迎

iOS開發--使用Charles青花瓷抓包圖文詳解

推薦一款抓包軟體Charles又名青花瓷,名字還挺小清新 開始之前先做準備工作 1、安裝Charles軟體 2、開啟網路偏好設定 --> 檢視電腦的WiFi-IP 3、自己手機也連結在同名W

iOS開發-使用charles青花瓷抓包圖文詳解

iOS開發 使用Charles(青花瓷)抓包圖文詳解 文:@丫了個P 導語: 童鞋們在做軟體開發學習過程中不可避免的要做練習,那麼想模仿一個軟體就要拿到這個軟體的介面資料,接下來我就推薦一個抓包軟體–Charles又名(青花瓷) 1.

iOS開發---本地通知UILocalNotification

iOS中通知機制又叫訊息機制,其包括兩類:一類是本地通知;另一類是推送通知,也叫遠端通知。 本地通知是由本地應用觸發的,它是基於時間行為的一種通知形式,例如鬧鐘定時、待辦事項提醒,又或者一個應用在一段時候後不使用通常會提示使用者使用此應用等都是本地通知。建立一

iOS開發載入網頁webview時的菊花小圈

在iOS開發中會有一種情況,就是請求載入一個網頁,有時是H5頁面,當然也是一個網頁,有時候這個網頁裡的內容很多,或者網速很慢的時候就會有一段時間是整個手機白屏,你做不了任何的操作,這樣給使用者的體驗是非常差的 在載入中,但是網頁還沒出現的的時候就會用到一個菊花來提示這個頁面

iOS開發之快取:記憶體快取

點選有驚喜 前面一片文章介紹瞭如何上傳和下載檔案,這篇文章將介紹一下如何在iOS裝置中進行快取。 這篇文章將只介紹一下將內容快取到記憶體中,下一篇文章就介紹一下在iOS磁碟上快取內容。 使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行

ArcGIS Runtime SDK for iOS開發系列教程1——開發前準備

      眾說周知,ArcGIS10.1徹底架起了端到雲的橋樑,使得空間資訊的創造者與使用者緊密相連。它給使用者帶來了更加簡易的操作方式,能夠實現隨時隨地對空間資訊的獲取和共享,可以讓任何人在任何地點以任何方式享用ArcGIS Online這個雲GIS平臺所提供的智

Android開發資料庫sqlite的檢視及一些問題的解決方法

最近在學習Android中的Sqlite遇到一些問題,這裡做一下總結。 一、建立資料庫 首先你要新建一個使用Sqlite的APP,開發工具Ecplise、AndroidStudio都可,這裡以後者AS為例。如果你沒有現成的程式,可以用博主的這個、 檔名

IOS開發之HomeKit

       IOS10中已經自帶了homekit程式。現在由於支援該框架的硬體裝置有限,所以homekit應用還是比較少的,但是由於工作需要,我還是瞭解和學習了一些這方面的知識在這裡還是將這些東西記錄下來,方便以後翻閱,也為剛開始瞭解這方面的小夥伴們提供一些參考。硬體

IOS開發之HomeKit

       上一篇文章我們只是介紹瞭如何獲取新增移除home和room物件,這篇繼續往下走。還需要說的一點就是,我們所新增或者移除的這些homeKit物件都是會儲存在一個共享的homeKit資料庫中的。可以被多個應用程式通過homeKit框架訪問,我們在自己寫的hom

IOS開發之HomeKit

        書接上文,上一篇文章我們介紹了一下如何使用APP搜尋獲取到智慧硬體的物件。那麼這篇文章需要介紹一下智慧硬體模擬器的使用以及如何對智慧硬體進行簡單的控制。 一    HomeKit Accessory Simulator的使用 如何下載這個模擬器在第

iOS開發學習筆記 -- 動態新增控制元件和事件處理

剛開始學iOS開發的時候,經常要跟interface builder打交道,乍一看拖控制元件是挺方便的,跟以前做C#開發類似,但是Xcode比較噁心的一點是,拖完控制元件之後,還得手動地在Connections Inspector中繫結控制元件和變數的關係,事件的繫結也在這

java覆蓋重寫equals方法

package com.forming.sapinterface; import sun.java2d.pipe.SpanClipRenderer; import java.util.Objects; public class Sap { private Integer rsnu

python 全棧開發:str字串常用方法操作 、for 有限迴圈以及if 迴圈

  str(字串)常用方法操作: 首字母大寫: s = 'mylovepython' s1 = s.capitalize() print(s1) 輸出: Mylovepython 單行多字串首字母大寫: s = 'my love python' s2 = s.title(

ios開發常用的幾種輔助方法

//1.Keychain本地長期鍵值儲存 //刪除 +(void)deleteStringForKey:(NSString *)aKey { NSMutableDictionary *query = [NSMutableDictionary dictionary];

iOS開發的記憶體分配堆和棧

程序的記憶體分割槽 所有程序(執行的程式)都必須佔用一定數量的記憶體,它或是用來存放從磁碟載入的程式程式碼,或是存放取自使用者輸入的資料等等。不過程序對這些記憶體的管理方式因記憶體用途不一而不盡相同,有些記憶體是事先靜態分配和統一回收的,而有些卻是按需要動態分配和回收的

完美解決ios開發兩個.framework檔案.o檔案衝突的問題linker command failed with exit code 1 (use -v to see invocation

專案中使用到XYPrinter.framework和Printer.framework中的兩個.o檔案有衝突, 查了資料通過拆分XYPrinter.framework刪除其中衝突的.o檔案,然後重新生成靜態庫, 解決了問題. 步驟如下: 新建一個資料夾resolveConfli