iOS開發-發送郵件(E-mail)方法整理合集(共3種)

前言:在IOS開發中,有時候咱們會須要用到郵件發送的功能。好比,接收用戶反饋和程序崩潰通知等等。其實這個功能是很經常使用的,由於我目前就有發送郵件的開發需求,因此順便整理下IOS發送郵件的方法。html

 

IOS原生自帶有兩種方法發送郵件的方法,另外一種是使用第三方庫:git

1)openURL(原生)github

    ——用戶體驗較差,程序會進入後臺,跳轉至郵件發送界面。服務器

2)MFMailComposeViewController(原生)app

    ——不會進入後臺,使用模態彈出郵件發送視圖。框架

3)SKPSMTPMessage(https://github.com/jetseven/skpsmtpmessage測試

    ——你能夠不須要告知用戶將要進行郵件發送的事情,我在想這個是否是不符合蘋果的理論。固然你也能夠在發送以前弄個彈出框告知用戶,並讓用戶選擇是否發送。ui

 

如下代碼均在真機(IOS8.0)進行測試,並經過測試。編碼

 

1、使用openURL發送郵件:加密

建立可變的地址字符串對象:

NSMutableString *mailUrl = [[NSMutableString alloc] init];

 

添加收件人:

NSArray *toRecipients = @[@"寫大家本身的郵箱測試@qq.com"];
// 注意:若有多個收件人,可使用componentsJoinedByString方法鏈接,鏈接符爲@","
[mailUrl appendFormat:@"mailto:%@", toRecipients[0]];

 

添加抄送人:

NSArray *ccRecipients = @[@"
寫大家本身的郵箱測試
@qq.com"]; [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];

 

添加密送人:

NSArray *bccRecipients = @[@"
寫大家本身的郵箱測試
@126.com"]; [mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]];

 

添加郵件主題和郵件內容:

[mailUrl appendString:@"&subject=my email"];
[mailUrl appendString:@"&body=<b>Hello</b> World!"];

注意:若是你沒添加抄送或密送,主題須要設爲 ?subject=my email,否則郵件會沒有主題。

mailto的用法,例:<a href="mailto:sample@163.com?subject=test&cc=sample@hotmail.com&body=use mailto sample">send mail</a>

詳情能夠自行去查看語法,謝謝。

 

打開地址,這裏會跳轉至郵件發送界面:

NSString *emailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailPath]];

 

效果圖: 

2、使用MFMailComposeViewController發送郵件

使用前注意:

1)項目須要導入框架:MessageUI.framework

2)使用的Controlelr裏導入頭文件:#import <MessageUI/MessageUI.h>

 

獲取用戶是否設置了郵件帳戶:

if ([MFMailComposeViewController canSendMail]) { // 用戶已設置郵件帳戶
    [self sendEmailAction]; // 調用發送郵件的代碼
}

 

sendEmailAction方法代碼:

- (void)sendEmailAction
{
    // 郵件服務器
    MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
    // 設置郵件代理
    [mailCompose setMailComposeDelegate:self];

    // 設置郵件主題
    [mailCompose setSubject:@"我是郵件主題"];

    // 設置收件人
    [mailCompose setToRecipients:@[@"郵箱號碼"]];
    // 設置抄送人
    [mailCompose setCcRecipients:@[@"郵箱號碼"]];
    // 設置密抄送
    [mailCompose setBccRecipients:@[@"郵箱號碼"]];
    
    /**
     *  設置郵件的正文內容
     */
    NSString *emailContent = @"我是郵件內容";
    // 是否爲HTML格式
    [mailCompose setMessageBody:emailContent isHTML:NO];
    // 如使用HTML格式,則爲如下代碼
//    [mailCompose setMessageBody:@"<html><body><p>Hello</p><p>World!</p></body></html>" isHTML:YES];
    
    /**
     *  添加附件
     */
    UIImage *image = [UIImage imageNamed:@"image"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [mailCompose addAttachmentData:imageData mimeType:@"" fileName:@"custom.png"];
    
    NSString *file = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"pdf"];
    NSData *pdf = [NSData dataWithContentsOfFile:file];
    [mailCompose addAttachmentData:pdf mimeType:@"" fileName:@"7天精通IOS233333"];
    
    // 彈出郵件發送視圖
    [self presentViewController:mailCompose animated:YES completion:nil];
}

 

MFMailComposeViewControllerDelegate的代理方法:

- (void)mailComposeController:(MFMailComposeViewController *)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError *)error
{
    switch (result)
    {
        case MFMailComposeResultCancelled: // 用戶取消編輯
            NSLog(@"Mail send canceled...");
            break;
        case MFMailComposeResultSaved: // 用戶保存郵件
            NSLog(@"Mail saved...");
            break;
        case MFMailComposeResultSent: // 用戶點擊發送
            NSLog(@"Mail sent...");
            break;
        case MFMailComposeResultFailed: // 用戶嘗試保存或發送郵件失敗
            NSLog(@"Mail send errored: %@...", [error localizedDescription]);
            break;
    }
    
    // 關閉郵件發送視圖
    [self dismissViewControllerAnimated:YES completion:nil];
}

 

程序運行效果圖:

在IOS的郵件發送裏,附件會直接顯示在正文的下方,可是不要誤認爲是圖片放在了正文當中,二者是有區別的!

 

3、 使用第三方庫SKPSMTPMessage發送郵件 

使用前注意:

1)下載第三方庫(下載地址文章開頭)

2)導入類#import "SKPSMTPMessage.h"、#import "NSData+Base64Additions.h"

 

設置基本參數:

SKPSMTPMessage *mail = [[SKPSMTPMessage alloc] init];
[mail setSubject:@"我是主題"];  // 設置郵件主題
[mail setToEmail:@"填大家本身的@qq.com"]; // 目標郵箱
[mail setFromEmail:@"填大家本身的@qq.com"]; // 發送者郵箱
[mail setRelayHost:@"smtp.qq.com"]; // 發送郵件代理服務器
[mail setRequiresAuth:YES];
[mail setLogin:@"填大家本身的@qq.com"]; // 發送者郵箱帳號
[mail setPass:@"填大家本身的"]; // 發送者郵箱密碼
[mail setWantsSecure:YES];  // 須要加密
[mail setDelegate:self];

 

設置郵件正文內容:

NSString *content = [NSString stringWithCString:"測試內容" encoding:NSUTF8StringEncoding];
NSDictionary *plainPart = @{kSKPSMTPPartContentTypeKey : @"text/plain", kSKPSMTPPartMessageKey : content, kSKPSMTPPartContentTransferEncodingKey : @"8bit"};

 

添加附件(如下代碼可在SKPSMTPMessage庫的DMEO裏找到):

NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];
NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath];
NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey,
                         @"attachment;\r\n\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,[vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];

 

執行發送郵件代碼:

[mail setParts:@[plainPart, vcfPart]]; // 郵件首部字段、郵件內容格式和傳輸編碼
[mail send];

 

SKPSMTPMessage代理,能夠獲知成功/失敗進行後續步驟處理:

- (void)messageSent:(SKPSMTPMessage *)message
{
    NSLog(@"%@", message);
}

- (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error
{
    NSLog(@"message - %@\nerror - %@", message, error);
}

 

效果圖:

什麼效果圖?沒有效果圖,只因任性。

這裏採起的是不通知用戶發送郵件,因此沒效果圖。

 

本篇文章借鑑了:

http://blog.sina.com.cn/s/blog_7d280d7c0101da7d.html

http://www.cnblogs.com/zhuqil/archive/2011/07/21/2112816.html

http://blog.csdn.net/zhibudefeng/article/details/7677421

 

 

 


博文做者:GarveyCalvin

博文出處:http://www.cnblogs.com/GarveyCalvin/

本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索