iOS邮件发送功能

作者: _feiyu_2100 | 来源:发表于2018-05-09 18:33 被阅读612次
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];
    });

    });

效果图:


iOS邮件发送功能

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

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

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

DEMO

相关文章

  • iOS邮件发送功能

    iOS程序中邮件发送方法有三种方式,有两种原生自带方法发送邮件,另一种是使用第三方库发送邮件。使用原生发送邮件,前...

  • iOS12系统应用发送普通邮件构建邮件

    iOS12系统应用发送普通邮件构建邮件 当确定设备支持邮件发送功能后,开发者就可以实现该功能。根据是否包含附件,邮...

  • iOS 发送邮件(E-mail)

    参照:iOS开发-发送邮件(E-mail)方法整理合集(共3种)在iOS开发过程中,有时需要实现邮件发送的功能。发...

  • iOS MessageUI 发送邮件功能

    1 先导入头文件 2 写逻辑 3 写代理

  • iOS12系统应用发送邮件中的附件

    iOS12系统应用发送邮件中的附件 iOS12系统应用发送邮件中的附件,如果发送邮件的内容很多,或者包含文档、图片...

  • python -- Email , send(smtp), re

    python Email功能: 发送普通文本邮件 发送带有html格式的邮件 发送带有附件的邮件 发送插入图片到正...

  • 发送邮件功能

    设置QQ邮箱客户端功能 登录QQ邮箱,开启下面两个功能;获取到【授权码】; node端 https://nodem...

  • Python入门系列--邮件--day02

    参考地址: Python发送邮件给多人 Python邮件功能 - 使用163邮箱SMTP服务器发送邮件

  • iOS邮件发送(最新)(iOS Email)

    iOS 上的系统邮件发送相当简单,瞬间让你搞懂邮件发送。 APP站内发生邮件 跳转到系统邮件页面发生邮件 参考代码

  • 2018-07-17

    发送邮件 django中内置了邮件发送功能,被定义在django.core.mail模块中,发送邮件需要使用SMT...

网友评论

    本文标题:iOS邮件发送功能

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