前言:在IOS開發中,有時候咱們會須要用到郵件發送的功能。好比,接收用戶反饋和程序崩潰通知等等。其實這個功能是很經常使用的,由於我目前就有發送郵件的開發需求,因此順便整理下IOS發送郵件的方法。html
IOS原生自帶有兩種方法發送郵件的方法,另外一種是使用第三方庫:git
1)openURL(原生)github
——用戶體驗較差,程序會進入後臺,跳轉至郵件發送界面。服務器
2)MFMailComposeViewController(原生)app
——不會進入後臺,使用模態彈出郵件發送視圖。框架
3)SKPSMTPMessage(https://github.com/jetseven/skpsmtpmessage)測試
——你能夠不須要告知用戶將要進行郵件發送的事情,我在想這個是否是不符合蘋果的理論。固然你也能夠在發送以前弄個彈出框告知用戶,並讓用戶選擇是否發送。ui
如下代碼均在真機(IOS8.0)進行測試,並經過測試。編碼
1、使用openURL發送郵件:加密
建立可變的地址字符串對象:
NSMutableString *mailUrl = [[NSMutableString alloc] init];
添加收件人:
NSArray *toRecipients = @[@"寫大家本身的郵箱測試@qq.com"]; // 注意:若有多個收件人,可使用componentsJoinedByString方法鏈接,鏈接符爲@"," [mailUrl appendFormat:@"mailto:%@", toRecipients[0]];
添加抄送人:
NSArray *ccRecipients = @[@"
寫大家本身的郵箱測試
@qq.com"]; [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]];
添加密送人:
NSArray *bccRecipients = @[@"
寫大家本身的郵箱測試
@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]];
效果圖:
2、使用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:@[@"郵箱號碼"]]; // 設置抄送人 [mailCompose setCcRecipients:@[@"郵箱號碼"]]; // 設置密抄送 [mailCompose setBccRecipients:@[@"郵箱號碼"]]; /** * 設置郵件的正文內容 */ 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的郵件發送裏,附件會直接顯示在正文的下方,可是不要誤認爲是圖片放在了正文當中,二者是有區別的!
3、 使用第三方庫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;\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];
執行發送郵件代碼:
[mail setParts:@[plainPart, vcfPart]]; // 郵件首部字段、郵件內容格式和傳輸編碼 [mail send];
SKPSMTPMessage代理,能夠獲知成功/失敗進行後續步驟處理:
- (void)messageSent:(SKPSMTPMessage *)message { NSLog(@"%@", message); } - (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error { NSLog(@"message - %@\nerror - %@", 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/
本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!