• IOS开发-发送邮件(E-mail)方法整理合集(共3种)


     本文转载至 http://www.cnblogs.com/GarveyCalvin/p/4184162.html

    前言:在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]];

    添加密送人:

    NSArray *bccRecipients = @[@"shana_happy@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]];

    效果图: 

    二、使用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


    博文作者:GarveyCalvin

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

    本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

    必须要努力努力再努力!
     
     
  • 相关阅读:
    【网络】【交换机】相关字符串处理
    python【telnet】使用
    【?】使用汇总
    【dbm】【功率】换算
    快速【kill进程】
    常用功能【时间log】
    python切换镜像源
    git报remote HTTP Basic Access denied错误的解决方法
    求取1到n的素数的数学思想——埃拉托斯特尼筛法
    MySQL count(*) 和 count(字段) 区别
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/4186135.html
Copyright © 2020-2023  润新知