zoukankan      html  css  js  c++  java
  • 发送邮件(E-mail)方法整理合集

    在IOS开发中,有时候我们会需要用到邮件发送的功能。比如,接收用户反馈和程序崩溃通知等等。其实这个功能是很常用的,因为我目前就有发送邮件的开发需求,所以顺便整理下IOS发送邮件的方法。

    IOS原生自带有两种方法发送邮件的方法,另一种是使用第三方库:

    1)openURL(原生)

    ——用户体验较差,程序会进入后台,跳转至邮件发送界面。

    2)MFMailComposeViewController(原生)

    ——不会进入后台,使用模态弹出邮件发送视图。

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

    ——你可以不需要告知用户将要进行邮件发送的事情,我在想这个是不是不符合苹果的理论。当然你也可以在发送之前弄个弹出框告知用户,并让用户选择是否发送。

    以下代码均在真机(IOS8.0)进行测试,并通过测试。 

    一、使用openURL发送邮件:

    创建可变的地址字符串对象:

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

    添加收件人:

    NSArray *toRecipients = @[@"写你们自己的邮箱测试@qq.com"];
    // 注意:如有多个收件人,可以使用componentsJoinedByString方法连接,连接符为@","
    [mailUrl appendFormat:@"mailto:%@", toRecipients[0]];

    添加抄送人:

    NSArray *ccRecipients = @[@"1229436624@qq.com"];
    [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];
    View Code

    添加密送人:

    NSArray *bccRecipients = @[@"shana_happy@126.com"];
    [mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]];
    View Code

    添加邮件主题和邮件内容:

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

    效果图:

    二、使用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:@[@"1147626297@qq.com"]];
      // 设置抄送人
      [mailCompose setCcRecipients:@[@"1229436624@qq.com"]];
      // 设置密抄送
      [mailCompose setBccRecipients:@[@"shana_happy@126.com"]];
      /**
       *  设置邮件的正文内容
       */
      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的邮件发送里,附件会直接显示在正文的下方,但是不要误认为是图片放在了正文当中,两者是有区别的!

    三、 使用第三方库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;
    	x-unix-mode=0644;
    	name="test.vcf"",kSKPSMTPPartContentTypeKey,
                             @"attachment;
    	filename="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 - %@
    error - %@", 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

    说法二

    IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController。借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能。

     1.openURL

    使用openURL调用系统邮箱客户端是我们在IOS3.0以下实现发邮件功能的主要手段。我们可以通过设置url里的相关参数来指定邮件的内容,不过其缺点很明显,这样的过程会导致程序暂时退出。下面是使用openURL来发邮件的一个小例子:
    1. #pragma mark - 使用系统邮件客户端发送邮件   
    2. -(void)launchMailApp   
    3. {     
    4.     NSMutableString *mailUrl = [[[NSMutableString alloc]init]autorelease];   
    5.     //添加收件人   
    6.     NSArray *toRecipients = [NSArray arrayWithObject: @"first@example.com"];   
    7.     [mailUrl appendFormat:@"mailto:%@", [toRecipients componentsJoinedByString:@","]];   
    8.     //添加抄送   
    9.     NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@example.com", @"third@example.com", nil];     
    10.     [mailUrl appendFormat:@"?cc=%@", [ccRecipients componentsJoinedByString:@","]];   
    11.     //添加密送   
    12.     NSArray *bccRecipients = [NSArray arrayWithObjects:@"fourth@example.com", 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. }  

    2.MFMailComposeViewController

    MFMailComposeViewController是在IOS3.0新增的一个接口,它在MessageUI.framework中。通过调用MFMailComposeViewController,可以把邮件发送窗口集成到我们的应用里,发送邮件就不需要退出程序了。MFMailComposeViewController的使用方法:
    • 1.项目中引入MessageUI.framework;
    • 2.在使用的文件中导入MFMailComposeViewController.h头文件;
    • 3.实现MFMailComposeViewControllerDelegate,处理邮件发送事件;
    • 4.调出邮件发送窗口前先使用MFMailComposeViewController里的“+ (BOOL)canSendMail”方法检查用户是否设置了邮件账户;
    • 5.初始化MFMailComposeViewController,构造邮件体
    1. //   
    2. //  ViewController.h   
    3. //  MailDemo   
    4. //   
    5. //  Created by LUOYL on 12-4-4.   
    6. //  Copyright (c) 2012年 http://luoyl.info. All rights reserved.   
    7. //   
    8.   
    9. #import <UIKit/UIKit.h>   
    10. #import <MessageUI/MFMailComposeViewController.h>   
    11.   
    12. @interface ViewController : UIViewController<MFMailComposeViewControllerDelegate>   
    13.   
    14. @end  
     
    1. #pragma mark - 在应用内发送邮件   
    2. //激活邮件功能   
    3. - (void)sendMailInApp   
    4. {   
    5.     Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));    
    6.     if (!mailClass) {   
    7.         [self alertWithMessage:@"当前系统版本不支持应用内发送邮件功能,您可以使用mailto方法代替"];   
    8.         return;   
    9.     }   
    10.     if (![mailClass canSendMail]) {   
    11.         [self alertWithMessage:@"用户没有设置邮件账户"];   
    12.         return;   
    13.     }   
    14.     [self displayMailPicker];   
    15. }   
    16.   
    17. //调出邮件发送窗口   
    18. - (void)displayMailPicker   
    19. {   
    20.     MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];     
    21.     mailPicker.mailComposeDelegate = self;     
    22.        
    23.     //设置主题     
    24.     [mailPicker setSubject: @"eMail主题"];     
    25.     //添加收件人   
    26.     NSArray *toRecipients = [NSArray arrayWithObject: @"first@example.com"];   
    27.     [mailPicker setToRecipients: toRecipients];     
    28.     //添加抄送   
    29.     NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@example.com", @"third@example.com", nil];     
    30.     [mailPicker setCcRecipients:ccRecipients];         
    31.     //添加密送   
    32.     NSArray *bccRecipients = [NSArray arrayWithObjects:@"fourth@example.com", nil];     
    33.     [mailPicker setBccRecipients:bccRecipients];     
    34.        
    35.     // 添加一张图片     
    36.     UIImage *addPic = [UIImage imageNamed: @"Icon@2x.png"];     
    37.     NSData *imageData = UIImagePNGRepresentation(addPic);            // png        
    38.     //关于mimeType:http://www.iana.org/assignments/media-types/index.html   
    39.     [mailPicker addAttachmentData: imageData mimeType: @"" fileName: @"Icon.png"];     
    40.     
    41.     //添加一个pdf附件   
    42.     NSString *file = [self fullBundlePathFromRelativePath:@"高质量C++编程指南.pdf"];   
    43.     NSData *pdf = [NSData dataWithContentsOfFile:file];   
    44.     [mailPicker addAttachmentData: pdf mimeType: @"" fileName: @"高质量C++编程指南.pdf"];     
    45.   
    46.     NSString *emailBody = @"<font color='red'>eMail</font> 正文";     
    47.     [mailPicker setMessageBody:emailBody isHTML:YES];     
    48.     [self presentModalViewController: mailPicker animated:YES];     
    49.     [mailPicker release];     
    50. }   
    51.   
    52. #pragma mark - 实现 MFMailComposeViewControllerDelegate    
    53. - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error   
    54. {   
    55.     //关闭邮件发送窗口   
    56.     [self dismissModalViewControllerAnimated:YES];   
    57.     NSString *msg;     
    58.     switch (result) {     
    59.         case MFMailComposeResultCancelled:     
    60.             msg = @"用户取消编辑邮件";     
    61.             break;     
    62.         case MFMailComposeResultSaved:     
    63.             msg = @"用户成功保存邮件";     
    64.             break;     
    65.         case MFMailComposeResultSent:     
    66.             msg = @"用户点击发送,将邮件放到队列中,还没发送";     
    67.             break;     
    68.         case MFMailComposeResultFailed:     
    69.             msg = @"用户试图保存或者发送邮件失败";     
    70.             break;     
    71.         default:     
    72.             msg = @"";   
    73.             break;     
    74.     }     
    75.     [self alertWithMessage:msg];   
    76. }   
  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/isItOk/p/5098703.html
Copyright © 2011-2022 走看看