iOS-静默方式发送邮件(SKPSMTPMessage)

作者: 一月筠 | 来源:发表于2017-02-16 17:00 被阅读919次

    前言

    在iOS开发中,有时候我们需要使用到发送邮件的功能,比如说接收用户的反馈信息、APP的崩溃情况的通知等等。

    iOS系统提供了两种原生方式已供开发者发送邮件(email):
    1)openURL(原生)

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

    2)MFMailComposeViewController(原生)

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

    这里主要介绍第三种,采用静默方式发送的email:

    使用到的库:SKPSMTPMessage
    下载地址:https://github.com/jetseven/skpsmtpmessage

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

    小主在Xcode 8.1,真机(iOS 10.2.1)环境下亲测通过,这里就如何使用该库做一下说明,希望对其他有需要的同学有帮助。

    1、工程配置

    我是手动导进工程里,因为该库是使用MRC开发的,所以就要设置进行相应的设置。
    在项目的build phrases->compile source->找到SKPSMTPMessage.m,NSStream+SKPSMTPExtensions.m这两个文件,双击后再弹框中添加-fno-objc-arc
    可见图例:

    工程配置.png

    2、引入头文件

    #import "SKPSMTPMessage.h"
    #import "NSData+Base64Additions.h"
    

    3、遵循协议

    SKPSMTPMessageDelegate
    

    4、协议的实现

     #pragma mark - SKPSMTPMessageDelegate
     - (void)messageSent:(SKPSMTPMessage *)message
     {
         [self.view makeToast:@"发送邮件成功" duration:1 position:@"center"];
     }
     - (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error
     {
         [self.view makeToast:[NSString stringWithFormat:@"发送邮件失败nerror - %@",error] duration:1 position:@"center"];
         NSLog(@"message - %@\nerror - %@", message, error);
     }
    

    5、方法的实现

    - (void)sendEmail
    {
        SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
        //此处发件箱已163为例:
        myMessage.fromEmail = @"******@163.com";//发送者邮箱
        myMessage.toEmail = @"******@qq.com";//收件邮箱
        //myMessage.bccEmail = @"******@qq.com";//抄送
        
        //myMessage.relayHost = @"smtp.exmail.qq.com";//发送地址host 腾讯企业邮箱:smtp.exmail.qq.com
        myMessage.relayHost = @"smtp.163.com";
        myMessage.requiresAuth = YES;
        if (myMessage.requiresAuth) {
            myMessage.login = @"******@163.com";//发送者邮箱的用户名
            myMessage.pass = @"******";//发送者邮箱的密码
        }
        
        myMessage.wantsSecure = YES;//为gmail邮箱设置 smtp.gmail.com
        myMessage.subject = @"iOS静默方式发送的email";//邮件主题
        myMessage.delegate = self;
        
        /* >>>>>>>>>>>>>>>>>>>> *   设置邮件内容   * <<<<<<<<<<<<<<<<<<<< */
        //1.文字信息
        NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain; charset=UTF-8",kSKPSMTPPartContentTypeKey, @"是不是很简单呀,这样一封email就发送成功了呢!",kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
        
        /* >>>>>>>>>>>>>>>>>>>> *   添加附件   * <<<<<<<<<<<<<<<<<<<< */
        /*
         //2.联系人信息附件
         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];
         */
        
        //3.图片和视频附件
        /*
         //3.1视频附件
         NSDictionary *videoPart = [NSDictionary dictionaryWithObjectsAndKeys:@"video/quicktime;\r\n\tx-unix-mode=0644;\r\n\tname=\"video.mov\"",kSKPSMTPPartContentTypeKey,
         @"attachment;\r\n\tfilename=\"video.mov\"",kSKPSMTPPartContentDispositionKey,[videoData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
         */
        
        //获取当前屏幕截图
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(kIPHONE_WIDTH, kIPHONE_HEIGHT), NO, [[UIScreen mainScreen] scale]);
        [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO];
        UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        NSData *imageData = UIImageJPEGRepresentation(snapshot, 1.0);
        
        //3.2图片附件
        NSDictionary *imagePart = [NSDictionary dictionaryWithObjectsAndKeys:@"image/jpg;\r\n\tx-unix-mode=0644;\r\n\tname=\"snapshot.jpg\"",kSKPSMTPPartContentTypeKey,
                                   @"attachment;\r\n\tfilename=\"snapshot.jpg\"",kSKPSMTPPartContentDispositionKey,[imageData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
        
        myMessage.parts = [NSArray arrayWithObjects:plainPart,imagePart,nil];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [myMessage send];
        });
    }
    

    相关文章

      网友评论

      • 谢衣丶:收到的邮件只有标题 没有内容...
        一月筠:你好,发送的邮件内容需要在SKPSMTPMessage的实例中设置parts,要保证字典中所对应的键值对格式是正确的。具体可参考本文中的第5步:【方法的实现】
      • db0c1f9fb48d:Attempting to connect to server at: smtp.gmail.com:587 没有后续了
        一月筠:需要开启认证权限requiresAuth的,请检查下你的用户名和密码是否有错误。

      本文标题:iOS-静默方式发送邮件(SKPSMTPMessage)

      本文链接:https://www.haomeiwen.com/subject/gpkhwttx.html