아이 폰 개발 중 이메일 을 보 내 는 3 가지 방법

1.openURL 을 사용 하여 메 일 을 보 내 는 기능 을 실현 합 니 다.
NSString *url = [NSString stringWithString: @"mailto:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

단점 은 분명 하 다.이런 과정 은 프로그램 을 일시 적 으로 종료 시 킬 수 있다.iOS 4.x 가 다 중 태 스 크 를 지원 하 더 라 도 이런 과정 은 불편 하 다.
2.MFmail Compose View Controller 를 사용 하여 메 일 을 보 내 는 기능 을 수행 합 니 다.Message UI.framework 에서 프로젝트 에 이 프레임 워 크 를 추가 하고 사용 하 는 파일 에서 MFmail Compose View Controller.h 헤더 파일 을 가 져 와 야 합 니 다.
#import <MessageUI/MFMailComposeViewController.h>;
 
MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"My Subject"];
[controller setMessageBody:@"Hello there." isHTML:NO];
[self presentModalViewController:controller animated:YES];
[controller release];

이 방법 을 사용 하여 Email 을 보 내 는 것 이 가장 일반적인 방법 입 니 다.이 방법 은 해당 하 는 MFmail Compose View Controller Delegate 이벤트 가 있 습 니 다.
- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error;
{
  if (result == MFMailComposeResultSent) {
    NSLog(@"It's away!");
  }
  [self dismissModalViewControllerAnimated:YES];
}


일부 관련 데이터 구조의 정 의 는 헤더 파일 에 구체 적 인 설명 이 있 습 니 다.
enum MFMailComposeResult {
    MFMailComposeResultCancelled,//        
    MFMailComposeResultSaved,//        
    MFMailComposeResultSent,//      ,        
    MFMailComposeResultFailed//              
};
typedef enum MFMailComposeResult MFMailComposeResult;   // iOS3.0    


헤더 파일 에서 MFmail Compose View Controller 의 일부 방법 은 다음 과 같 습 니 다.
+ (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
//            ,    NO,               MFMailComposeViewController    mailto://     ,   ,           skpsmtpmessage     Email   。

- (void)addAttachmentData:(NSData *)attachment mimeType:(NSString *)mimeType fileName:(NSString *)filename;
//NSData   attachment      ,  mimeType      ,            http://www.iana.org/assignments/media-types/ ,               。  mimeType   ,            =]


두 번 째 방법의 약점 도 뚜렷 하 다.iOS 시스템 이 우리 에 게 메 일 에 있 는 UI 를 제공 해 주 었 지만 우 리 는 주문 을 맞 출 수 없 었 다.이 는 맞 춤 형 앱 을 뒷걸음질 치 게 만 들 었 다.이렇게 사용 하면 너무 갑 작 스 러 울 수 밖 에 없 기 때문이다.
3.저 희 는 자신의 UI 디자인 수요 에 따라 해당 하 는 보 기 를 맞 춰 전체적인 디자인 에 적응 할 수 있 습 니 다.비교적 유명한 오픈 소스 SMTP 프로 토 콜 을 사용 하여 실현 할 수 있다.
SKPSMTPMessage 류 에 서 는 보기 에 대해 어떠한 요구 도 하지 않 았 습 니 다.이 는 데이터 등급 의 처 리 를 제공 합 니 다.해당 하 는 발송 요 구 를 정의 하면 메 일 발송 을 실현 할 수 있 습 니 다.이러한 정 보 를 어떤 방식 으로 얻 는 지 에 대해 서 는 소프트웨어 의 수요 에 따라 상호작용 방식 과 보기 스타일 을 확정 할 수 있다.
   SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];
		testMsg.fromEmail = @"[email protected]";
		testMsg.toEmail =@"[email protected]";
		testMsg.relayHost = @"smtp.gmail.com";
		testMsg.requiresAuth = YES;
		testMsg.login = @"[email protected]";
		testMsg.pass = @"test";
		testMsg.subject = [NSString stringWithCString:"  " encoding:NSUTF8StringEncoding];
		testMsg.bccEmail = @"[email protected]";
		testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!
 
		// Only do this for self-signed certs!
		// testMsg.validateSSLChain = NO;
		testMsg.delegate = self;
 
		NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,
								   [NSString stringWithCString:"    " encoding:NSUTF8StringEncoding],kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
 
		    NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];
		    NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath];
 
		    NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r
\tx-unix-mode=0644;\r
\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey, @"attachment;\r
\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,[vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil]; testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil]; [testMsg send];

이 종 류 는 발송 상 태 를 더 잘 알 수 있 도록 해당 하 는 Delegate 방법 을 제공 합 니 다.
-(void)messageSent:(SKPSMTPMessage *)message;
-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error;

좋은 웹페이지 즐겨찾기