iOS发送邮件的三种方式

一、 UIApplication

这是系统提供的最简单的发送邮件的方式,调用内建的邮件APP,只需要[[UIApplication sharedApplication] openURL:****];即可。

NSString *urlStr = @"mailto://aug_88@163.com?subject=这里是邮件的标题&body=这里是邮件的内容&cc=auu.aug@gmail.com";
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr] options:@{} completionHandler:nil];

这里的参数可以见如下内容:

http://www.ietf.org/rfc/rfc2368.txt

https://developer.apple.com/library/content/qa/qa1084/_index.html

二、MFMailComposeViewController

这种方法可以在APP内部打开一个发送邮件的页面,填入内容发送邮件。

前提是你的设备里的邮件APP里必须得填入的有邮箱账号,否则强行调用的话会导致程序崩溃。

首先加入一个framework : MessageUI,引入import <MessageUI/MFMailComposeViewController.h>,然后:

if ([MFMailComposeViewController canSendMail]) { // 判断是否可以在APP内部发送邮件
    MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init];
    mailController.mailComposeDelegate = self;
    [mailController setToRecipients:@[@"aug_88@163.com"]];
    [mailController setCcRecipients:@[@"auu.aug@gmail.com"]];
    [mailController setSubject:@"这里是邮件的标题"];
    [mailController setMessageBody:@"这里是邮件的内容" isHTML:NO];
    [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:mailController animated:YES completion:nil];
} else {
    [self sendmailEasy:nil];
}

这里需要实现MFMailComposeViewControllerDelegate这个代理里的方法,用于在发送邮件结束以后隐藏发送邮件页面:

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [controller dismissViewControllerAnimated:YES completion:nil];
}

三、SKPSMTPMessage

这是一个开源的第三方库,来自Google,但是现在貌似没人维护了,Github上也有不少的Repository,但是都是很老的代码了,需要拿过去小改动一下。

  1. 引入两个头文件
#import "SKPSMTPMessage.h"
#import "NSData+Base64Additions.h"
  1. 添加代理SKPSMTPMessageDelegate

这个库可以实现自定义发送邮件的页面和方式,代码如下:

SKPSMTPMessage *SMTPMessage = [[SKPSMTPMessage alloc] init];
SMTPMessage.fromEmail = @"aug_88@163.com";
SMTPMessage.toEmail = @"aug_88@163.com";

//抄送联系人列表,如:@"1@qq.com;1@qq.com;2@q.com;3@qq.com"
//testMsg.ccEmail = @"aug_88@163.com";
//密送联系人列表,如:@"1@qq.com;1@qq.com;2@q.com;3@qq.com"
//testMsg.bccEmail = @"aug_88@163.com";

SMTPMessage.relayHost = @"smtp.163.com";

SMTPMessage.requiresAuth = YES;         //需要鉴权
SMTPMessage.login = @"提供邮箱账号";
SMTPMessage.pass = @"提供邮箱密码";

SMTPMessage.subject = [NSString stringWithCString:"This is the test file" encoding:NSUTF8StringEncoding ];
SMTPMessage.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!

//主题
NSDictionary *plainPart = @{kSKPSMTPPartContentTypeKey              : @"text/plain",
                            kSKPSMTPPartMessageKey                  : @"This is a test message.\r\n支持中文。",
                            kSKPSMTPPartContentTransferEncodingKey  : @"8bit"};

// 文件附件
NSString *wavPath = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"];
NSData *wavData = [NSData dataWithContentsOfFile:wavPath];
NSDictionary *wavPart = @{kSKPSMTPPartContentTypeKey                : @"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"words.txt\"",
                          kSKPSMTPPartContentDispositionKey         : @"attachment;\r\n\tfilename=\"words.txt\"",
                          kSKPSMTPPartMessageKey                    : [wavData encodeBase64ForData],
                          kSKPSMTPPartContentTransferEncodingKey    : @"base64"};

SMTPMessage.parts = [NSArray arrayWithObjects:plainPart,wavPart, nil];
SMTPMessage.delegate = self;
[SMTPMessage send];

需要填入一个邮箱账号和密码,用于发送邮件,还需要填入邮件的smtp服务器及端口。

然后需要实现两个代理方法:

-(void)messageSent:(SKPSMTPMessage *)message {
    [self alertMessage:@"发送成功"];
}
-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error {
    [self alertMessage:@"发送失败"];
}

注意

在测试的时候,发现SMTP的代理必须得放到UIViewController的页面里,如果放到NSObject的类(不是视图类)里,会导致崩溃。

如果是将SMTP整个放到项目里的话,需要在Build Settings里对NSStream+SKPSMTPExtensionsSKPSMTPMessage两个文件添加-fno-objc-arcFlag,因为这两个文件是非ARC的。


/*各大型邮箱smtp服务器及端口收集*/ 新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sina.com.cn 收件服务器:pop3.sina.com.cn 163邮箱smtp服务器 pop: pop.163.com smtp: smtp.163.com QQ邮箱smtp服务器及端口 接收邮件服务器:imap.qq.com,使用SSL,端口号993 发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587 yahoo邮箱smtp服务器 接:pop.mail.yahoo.com.cn 发:smtp.mail.yahoo.com 126邮箱smtp服务器 pop: pop.126.com smtp: smtp.126.com 新浪免费邮箱 POP3:pop.sina.com SMTP:smtp.sina.com SMTP端口号:25 新浪VIP邮箱 POP3:pop3.vip.sina.com SMTP:smtp.vip.sina.com SMTP端口号:25 新浪企业邮箱 POP3:pop.sina.com SMTP:smtp.sina.com SMTP端口号:25 雅虎邮箱 POP3:pop.mail.yahoo.cn SMTP:smtp.mail.yahoo.cn SMTP端口号:25 搜狐邮箱 POP3:pop3.sohu.com SMTP:smtp.sohu.com SMTP端口号:25 TOM邮箱 POP3:pop.tom.com SMTP:smtp.tom.com SMTP端口号:25 Gmail邮箱 POP3:pop.gmail.com SMTP:smtp.gmail.com SMTP端口号:587 或 25 QQ邮箱 POP3:pop.qq.com SMTP:smtp.qq.com SMTP端口号:25 263邮箱 域名:263.net POP3:263.net SMTP:smtp.263.net SMTP端口号:25 域名:x263.net POP3:pop.x263.net SMTP:smtp.x263.net SMTP端口号:25 域名:263.net.cn POP3:263.net.cn SMTP:263.net.cn SMTP端口号:25 域名:炫我型 POP3:pop.263xmail.com SMTP:smtp.263xmail.com SMTP端口号:25 21CN 免费邮箱 POP3:pop.21cn.com SMTP:smtp.21cn.com IMAP:imap.21cn.com SMTP端口号:25 21CN 经济邮邮箱 POP3:pop.21cn.com SMTP:smtp.21cn.com SMTP端口号:25 21CN 商务邮邮箱 POP3:pop.21cn.net SMTP:smtp.21cn.net SMTP端口号:25 21CN 快感邮箱 POP3:vip.21cn.com SMTP:vip.21cn.com SMTP端口号:25 21CN Y邮箱 POP3:pop.y.vip.21cn.com SMTP:smtp.y.vip.21cn.com SMTP端口号:25 中华网任我邮邮箱 POP3:rwpop.china.com SMTP:rwsmtp.china.com SMTP端口号:25 中华网时尚、商务邮箱 POP3:pop.china.com SMTP:smtp.china.com SMTP端口号:25

发表评论

电子邮件地址不会被公开。