iOS邮件发送功能

Send my love.png

iOS程序中邮件发送方法有三种方式,有两种原生自带方法发送邮件,另一种是使用第三方库发送邮件。
使用原生发送邮件,前提是手机上已经登录自己的邮箱地址了,否则不能发送,需要提示用户去登录设置邮箱地址,而使用第三方库发送不需要登录邮箱号,也可以不需要告知用户将要进行邮件发送的事情,但这个可能不符合苹果的理论,当然你也可以在发送之前弄个弹出框告知用户,并让用户选择是否发送。在上线项目中我还没有使用过这个第三方库。

1)openURL(原生)——用户体验较差,程序会进入后台,跳转至邮件发送界面。
2)MFMailComposeViewController(原生)——不会进入后台,使用模态弹出邮件发送视图。
3)SKPSMTPMessage

一、使用openURL发送邮件(测试环境:真机测试)

       //创建可变的地址字符串对象:
            NSMutableString *mailUrl = [[NSMutableString alloc] init];
            //添加收件人:
            NSArray *toRecipients = @[@"1780575208@qq.com"];
            // 注意:如有多个收件人,可以使用componentsJoinedByString方法连接,连接符为@","
            [mailUrl appendFormat:@"mailto:%@", toRecipients[0]];
            //添加抄送人:
            NSArray *ccRecipients = @[@"1780575208@qq.com"];
            [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];
           // 添加密送人:
            NSArray *bccRecipients = @[@"1780575208@qq.com"];
            [mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]];
            
            //添加邮件主题和邮件内容:
            [mailUrl appendString:@"&subject=my email"];
            [mailUrl appendString:@"&body=<b>Hello</b> World!"];
            //打开地址,这里会跳转至邮件发送界面:
            NSString *emailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:emailPath]];

效果图:


openURL发送邮件.jpeg

注意:如果你没添加抄送或密送,主题需要设为 ?subject=my email,不然邮件会没有主题。

邮件发送使用的是mailto的语法,可以自己去查看语法。

二、使用MFMailComposeViewController发送邮件(测试环境:真机测试)
1.项目需要导入框架:MessageUI.framework

我们选中工程->选中targets中的工程,选中Build phases 第三行(Link Binary With Libraries)添加MessageUI.framework
添加MessageUI.framework.png

2.发送代码实现
 if ([MFMailComposeViewController canSendMail]) {
 // 用户已设置邮件账户
  // 邮件服务器
    MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
    // 设置邮件代理
    [mailCompose setMailComposeDelegate:self];
    
    // 设置邮件主题
    [mailCompose setSubject:@"我是邮件主题"];
    
    // 设置收件人
    [mailCompose setToRecipients:@[@"1780575208@qq.com"]];
    // 设置抄送人
    [mailCompose setCcRecipients:@[@"1780575208@qq.com"]];
    // 设置密抄送
    [mailCompose setBccRecipients:@[@"1780575208@qq.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:@"1"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [mailCompose addAttachmentData:imageData mimeType:@"" fileName:@"image.png"];
    
    NSString *file = [[NSBundle mainBundle] pathForResource:@"123" ofType:@"pdf"];
    NSData *pdf = [NSData dataWithContentsOfFile:file];
    [mailCompose addAttachmentData:pdf mimeType:@"" fileName:@"file"];
    
    // 弹出邮件发送视图
    [self presentViewController:mailCompose animated:YES completion:nil];

 }else{
         NSLog(@"请先设置登录邮箱号");
 }

3.//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];
}

效果图:


MFMailComposeViewController发送邮件.jpeg

在iOS的邮件发送里,附件会直接显示在正文的下方,但是不要误认为是图片放在了正文当中,两者是有区别的!

三、使用第三方库SKPSMTPMessage发送邮件 (测试环境:真机测试、模拟器测试)
1.先导入第三方库:pod 'skpsmtpmessage'
2.如果您的程序是ARC模式,导入第三方库需要配置程序兼容ARC模式,因为这个第三方库使用的是MRC模式开发的。

我们选中工程->选中targets中的工程,选中Build phases 第二行(Compile Sources )在导入的类后面双击加入标记"-fno-objc-arc"


兼容ARC.png

3.导入类#import "SKPSMTPMessage.h"、#import "NSData+Base64Additions.h"
4.发送代码实现

 /*
     邮箱号和SMTP的授权码是我自己编的,需要换成你们的
     */
    SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
    //发信人
    myMessage.fromEmail=@"1230@163.com";
    //收件人
    myMessage.toEmail=@"2545706530@qq.com";
    //bccEmail、ccEmail可传可不传,如果需要的填写
    //    myMessage.bccEmail=@"123567@163.com";//暗抄送
    //    myMessage.ccEmail = @"123567@163.com";//抄送人
    //发送邮件代理服务器
    // myMessage.relayHost=@"smtp.qq.com";//qq个人
    //    myMessage.relayHost=@"smtp.exmail.qq.com";qq企业账号
    
    myMessage.relayHost=@"smtp.163.com";
    myMessage.requiresAuth=YES;//验证身份是否登录
    if (myMessage.requiresAuth) {
        //发信人
        myMessage.login=@"1230@163.com"; //发信人账号
        myMessage.pass=@"1234ddd";//发信人的SMTP的授权码
    }
    myMessage.wantsSecure =YES; //需要加密
    /*
     163邮箱报错的
     S: 554 DT:SPM 163 smtp9,DcCowADXPVEoF_FaG5peAg--.47217S3 1525749544,please see http://mail.163.com/help/help_spam_16.htm?ip=125.118.133.189&hostid=smtp9&time=1525749544
     重新修改subject内容
     */
    myMessage.subject = @"你的第三封信";//// 设置邮件主题
    myMessage.delegate = self;// 设置邮件代理
    //设置邮件内容
    NSString *sendMessageStr = @"hello";
    
    NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain; charset=UTF-8",kSKPSMTPPartContentTypeKey,sendMessageStr,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
    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];
    myMessage.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
// 邮件首部字段、邮件内容格式和传输编码
//    [myMessage setParts:@[plainPart]];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //发送
        [myMessage send];
    });

4.SKPSMTPMessage代理,可以获知成功/失败进行后续步骤处理:

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

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

拓展功能,发送HTML文本
1.使用SKPSMTPMessage发送html
配置跟上面一样,代码如下

 if ([MFMailComposeViewController canSendMail]) { // 用户已设置邮件账户
        // 邮件服务器
        MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
        // 设置邮件代理
        [mailCompose setMailComposeDelegate:self];
        
        // 设置邮件主题
        [mailCompose setSubject:@"我是邮件主题"];
        
        // 设置收件人
        [mailCompose setToRecipients:@[@"1780575208@qq.com"]];
        // 设置抄送人
        [mailCompose setCcRecipients:@[@"1780575208@qq.com"]];
        // 设置密抄送
        [mailCompose setBccRecipients:@[@"1780575208@qq.com"]];
        
        /**
         *  设置邮件的正文内容
         */
        NSString *emailContent = self.sendStr;
        // 如使用HTML格式,则为以下代码
        [mailCompose setMessageBody:emailContent isHTML:YES];
        // 弹出邮件发送视图
        [self presentViewController:mailCompose animated:YES completion:nil];
    }else{
        NSLog(@"请先设置邮箱号");
        
    }
//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];
}

效果图
2.使用SKPSMTPMessage发送html
配置跟上面一样,代码如下

  /*
     邮箱号和SMTP的授权码是我自己编的,需要换成你们的
     */
    SKPSMTPMessage *myMessage = [[SKPSMTPMessage alloc] init];
    //发信人
    myMessage.fromEmail=@"2545706530@qq.com";
    //收件人
    myMessage.toEmail=@"2545706530@qq.com";
    //bccEmail、ccEmail可传可不传,如果需要的填写
    //    myMessage.bccEmail=@"123567@163.com";//暗抄送
    //    myMessage.ccEmail = @"123567@163.com";//抄送人
    //发送邮件代理服务器
     myMessage.relayHost=@"smtp.qq.com";//qq个人
    //    myMessage.relayHost=@"smtp.exmail.qq.com";qq企业账号
    
//    myMessage.relayHost=@"smtp.163.com";
    myMessage.requiresAuth=YES;//验证身份是否登录
    if (myMessage.requiresAuth) {
        //发信人
        myMessage.login=@"2545706530@qq.com"; //发信人账号
        myMessage.pass=@"ilbtouxxepakeadj";//发信人的SMTP的授权码
    }
    myMessage.wantsSecure =YES; //需要加密
    /*
     163邮箱报错的
     S: 554 DT:SPM 163 smtp9,DcCowADXPVEoF_FaG5peAg--.47217S3 1525749544,please see http://mail.163.com/help/help_spam_16.htm?ip=125.118.133.189&hostid=smtp9&time=1525749544
     重新修改subject内容
     */
    myMessage.subject = @"你好啊我是";//// 设置邮件主题
    myMessage.delegate = self;// 设置邮件代理
    //设置邮件内容
    NSString *dataStr = self.sendStr;
    NSString *sendMessageStr =  [self htmlEntityDecode:dataStr];
    NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/html",kSKPSMTPPartContentTypeKey,
                               sendMessageStr,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
 
myMessage.parts = [NSArray arrayWithObjects:plainPart,nil];      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //发送
        [myMessage send];
    });

    });

效果图:


图片发自简书App

SKPSMTPMessage使用注意事项:
1、使用授权码密码登录
邮件平台的授权码一般需要手动获取,先登录你所需要的后台,点击设置,开启SMTP服务,生成授权码,设置账号登录的时候,用户名还填自己的,密码填写授权码。
2、添加附件的时候使用

    testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];

参考文章:
iOS开发-发送邮件(E-mail)方法整理合集(共3种)
iOS开发-内部邮件发送功能实现
使用的第三方框架:
SKPSMTPMessage 第三方库发送邮件
ZSSRichTextEditor 自定义内容html发送邮件

DEMO

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 微诗即微型诗,顾名思义就是短小的诗作。百度百科解释微诗是指数行以内的小诗,特点是语句短少、修辞精到、内容深刻、意境...
    简JN阅读 397评论 9 8
  • 一、关键字 1.1 概述: 1.2 特点: 1.3 注意: 1.4 常见关键字及其使用: static 特点:1)...
    sexyhair阅读 431评论 0 0
  • 只抓主场景、不做全功能 做大而全很容易,做少很难 如果没有化繁为简的能力,就克制自己的做多愿望 做多源于不自信 每...
    AndyLau阅读 3,156评论 0 2