SKPSMTPMessage 完全不依賴於iOS系統內置的發送郵件程序,可內置於你的應用實現后台發送郵件目的。
下載第三庫時導入文件會報錯,因為它是支持非ARC的,所以現在要導入我們的工程支持ARC,只需要在
中把要導入的文件添加-fno-objc-arc就可以運行了,下面我們進入正題,怎么操作實現郵件發送。
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); }
小編不死心,還是想着把剩下的兩種給大家一起探討一下;
IOS原生自帶有兩種方法發送郵件的方法:
1)openURL(原生)
——用戶體驗較差,程序會進入后台,跳轉至郵件發送界面。
2)MFMailComposeViewController(原生)
——不會進入后台,使用模態彈出郵件發送視圖。
3)SKPSMTPMessage( https://github.com/jetseven/skpsmtpmessage )
——你可以不需要告知用戶將要進行郵件發送的事情,我在想這個是不是不符合蘋果的理論。當然你也可以在發送之前弄個彈出框告知用戶,並讓用戶選擇是否發送。
以下代碼均在真機(IOS8.0)進行測試,並通過測試。
一、使用openURL發送郵件:
創建可變的地址字符串對象:
NSMutableString *mailUrl = [[NSMutableString alloc] init];
添加收件人:
NSArray *toRecipients = @[@"寫你們自己的郵箱測試@qq.com"]; // 注意:如有多個收件人,可以使用componentsJoinedByString方法連接,連接符為@"," [mailUrl appendFormat:@"mailto:%@", toRecipients[0]];
添加抄送人:
NSArray *ccRecipients = @[@"1229436624@qq.com"]; [mailUrl appendFormat:@"?cc=%@", ccRecipients[0]]; View Code
添加密送人:
NSArray *bccRecipients = @[@"shana_happy@126.com"]; [mailUrl appendFormat:@"&bcc=%@", bccRecipients[0]]; View Code
添加郵件主題和郵件內容:
[mailUrl appendString:@"&subject=my email"];
[mailUrl appendString:@"&body=<b>Hello</b> World!"];
二、使用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:@[@"1147626297@qq.com"]]; // 設置抄送人 [mailCompose setCcRecipients:@[@"1229436624@qq.com"]]; // 設置密抄送 [mailCompose setBccRecipients:@[@"shana_happy@126.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:@"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]; }
