iOS邮件发送功能

Send my love.png

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

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

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

       //创建可变的地址字符串对象:
            NSMutableString *mailUrl = [[NSMutableString alloc] init];
            //添加收件人:
            NSArray *toRecipients = @[@"[email protected]"];
            // 注意:如有多个收件人,可以使用componentsJoinedByString方法连接,连接符为@","
            [mailUrl appendFormat:@"mailto:%@", toRecipients[0]];
            //添加抄送人:
            NSArray *ccRecipients = @[@"[email protected]"];
            [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];
           // 添加密送人:
            NSArray *bccRecipients = @[@"[email protected]"];
            [mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]];
            
            //添加邮件主题和邮件内容:
            [mailUrl appendString:@"&subject=my email"];
            [mailUrl appendString:@"&body=Hello 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:@[@"[email protected]"]];
    // 设置抄送人
    [mailCompose setCcRecipients:@[@"[email protected]"]];
    // 设置密抄送
    [mailCompose setBccRecipients:@[@"[email protected]"]];
    
    /**
     *  设置邮件的正文内容
     */
    NSString *emailContent = @"我是邮件内容";
    // 是否为HTML格式
    [mailCompose setMessageBody:emailContent isHTML:NO];
    // 如使用HTML格式,则为以下代码
    //    [mailCompose setMessageBody:@"

Hello

World!

" 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=@"[email protected]";
    //收件人
    myMessage.toEmail=@"[email protected]";
    //bccEmail、ccEmail可传可不传,如果需要的填写
    //    myMessage.bccEmail=@"[email protected]";//暗抄送
    //    myMessage.ccEmail = @"[email protected]";//抄送人
    //发送邮件代理服务器
    // 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=@"[email protected]"; //发信人账号
        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:@[@"[email protected]"]];
        // 设置抄送人
        [mailCompose setCcRecipients:@[@"[email protected]"]];
        // 设置密抄送
        [mailCompose setBccRecipients:@[@"[email protected]"]];
        
        /**
         *  设置邮件的正文内容
         */
        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=@"[email protected]";
    //收件人
    myMessage.toEmail=@"[email protected]";
    //bccEmail、ccEmail可传可不传,如果需要的填写
    //    myMessage.bccEmail=@"[email protected]";//暗抄送
    //    myMessage.ccEmail = @"[email protected]";//抄送人
    //发送邮件代理服务器
     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=@"[email protected]"; //发信人账号
        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

你可能感兴趣的:(iOS邮件发送功能)