iPhone 응용 프로그램에서 메일을 보내려면 어떻게합니까


242

iPhone 응용 프로그램에서 이메일을 보내려고합니다. iOS SDK에 이메일 API가 없다고 들었습니다. 다음 코드는 응용 프로그램을 종료하기 때문에 사용하고 싶지 않습니다.

NSString *url = [NSString stringWithString: @"mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

내 앱에서 이메일을 보내려면 어떻게해야합니까?

답변:


430

iOS 3.0 이상 에서는 MessageUI 프레임 워크에 있는 MFMailComposeViewController클래스와 MFMailComposeViewControllerDelegate프로토콜을 사용해야합니다 .

먼저 프레임 워크를 추가 하고 가져옵니다.

#import <MessageUI/MFMailComposeViewController.h>

그런 다음 메시지를 보내려면

MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"My Subject"];
[controller setMessageBody:@"Hello there." isHTML:NO]; 
if (controller) [self presentModalViewController:controller animated:YES];
[controller release];

그런 다음 사용자는 작업을 수행하고 시간에 대리인 콜백을 얻습니다.

- (void)mailComposeController:(MFMailComposeViewController*)controller  
          didFinishWithResult:(MFMailComposeResult)result 
                        error:(NSError*)error;
{
  if (result == MFMailComposeResultSent) {
    NSLog(@"It's away!");
  }
  [self dismissModalViewControllerAnimated:YES];
}

장치가 이메일을 보내도록 구성되어 있는지 확인하십시오.

if ([MFMailComposeViewController canSendMail]) {
  // Show the composer
} else {
  // Handle the error
}

5
+1. 가져 오기가 필요한 프레임 워크는 여기 ( mobileorchard.com/… )에 언급되어 있습니다 .
Dan Rosenstark

71
점프를 저장하려면 #import <MessageUI / MFMailComposeViewController.h>
TomH

22
다만주의 할 것을이 답변의 UIViewController의 방법을 쓴 이후 presentModalViewController:animated:dismissModalViewControllerAnimated:되지 않는 것으로 표시 한 - 대신 블록 기반 교체 방법 presentViewController:animated:completion:dismissViewControllerAnimated:completion:사용되어야한다.

2
.h@interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir의

18
그리고 IOS 6 [self presentModalViewController:controller animated:YES]; 로 교체 [self presentViewController:controller animated:YES completion:nil]; 하고 [self dismissModalViewControllerAnimated:YES]; 교체 [self dismissViewControllerAnimated:YES completion:nil];
지르

61

MFMailComposeViewController 는 iPhone OS 3.0 소프트웨어가 출시 된 후가는 방법입니다. 샘플 코드내가 쓴 튜토리얼을 볼 수 있습니다 .


2
Mugunth의 멋진 게시물. 친구가는 길!
Jordan

1
정말 굉장합니다. 감사. 전자 메일과 사용자의 제목을 수락하기 위해 특별히보기를 설계했습니다. 동일한 코드를 구현하여 다소 비슷한 견해를 보여줍니다. 난 당신의 도움, 시빈의 뷰 컨트롤러 클래스 덕분에 내 버튼을 눌러 이벤트의 대리자 메서드를 호출 할 수 있습니다
smakstr

동일한 샘플 코드를 다운로드했지만 메일을 보내지 않습니다. 메일이 성공적으로 전송되었다는 메시지 만 표시하지만 메일을받지 못했습니다. 기본적으로 붉은 색으로 표시된 MessageUI 프레임 워크를 추가하려고 시도했지만 여전히 응용 프로그램이 메일을 보내지 않습니다. 이와 관련하여 도움을 주시면 감사하겠습니다. 시뮬레이터에서 앱을 테스트하고 있습니다.
Ravi shankar

시뮬레이터에서 이메일을 보낼 수 없습니다.
malaki1974

20

여기에 추가하고 싶은 몇 가지 사항 :

  1. 시뮬레이터에 mail.app가 설치되어 있지 않으므로 시뮬레이터에서 mailto URL을 사용할 수 없습니다. 그래도 장치에서 작동합니다.

  2. mailto URL의 길이에는 제한이 있습니다. URL이 4096자를 초과하면 mail.app이 시작되지 않습니다.

  3. OS 3.0에는 앱을 종료하지 않고 전자 메일을 보낼 수있는 새로운 클래스가 있습니다. MFMailComposeViewController 클래스를 참조하십시오.


13

응용 프로그램에서 전자 메일을 보내려면 앱 내부에서 자신의 메일 클라이언트 (SMTP)를 코딩하거나 서버에서 메일을 보내지 않는 한 위의 코드 만 사용하면됩니다.

예를 들어 메일을 보낼 서버의 URL을 호출하도록 앱을 코딩 할 수 있습니다. 그런 다음 코드에서 URL을 호출하면됩니다.

위 코드를 사용하면 서버 측 방법뿐만 아니라 SMTP 클라이언트 방법으로 허용하는 전자 메일에 아무것도 첨부 할 수 없습니다.


12

아래 코드는 내 응용 프로그램에서 첨부 파일이있는 전자 메일을 보내는 데 사용됩니다. 첨부 파일은 이미지입니다. 모든 유형의 파일을 보낼 수있는 것은 명심하십시오. 올바른 것을 지정해야한다는 것입니다. 'mimeType'

이것을 .h 파일에 추가하십시오

#import <MessageUI/MFMailComposeViewController.h>

프로젝트 파일에 MessageUI.framework 추가

NSArray *paths = SSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"myGreenCard.png"];



MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Green card application"];
[controller setMessageBody:@"Hi , <br/>  This is my new latest designed green card." isHTML:YES]; 
[controller addAttachmentData:[NSData dataWithContentsOfFile:getImagePath] mimeType:@"png" fileName:@"My Green Card"];
if (controller)
    [self presentModalViewController:controller animated:YES];
[controller release];

위임 방법은 다음과 같습니다.

  -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error;
{
    if (result == MFMailComposeResultSent) {
        NSLog(@"It's away!");
    }
    [self dismissModalViewControllerAnimated:YES];
}

11

이것은 U를 도울 수 있지만 메시지 UI framewark를 포함하고 대리자를 포함하는 것을 잊지 않는 코드입니다 MFMailComposeViewControllerDelegate

-(void)EmailButtonACtion{

        if ([MFMailComposeViewController canSendMail])
        {
            MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
            controller.mailComposeDelegate = self;
            [controller.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation_bg_iPhone.png"] forBarMetrics:UIBarMetricsDefault];
            controller.navigationBar.tintColor = [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:1.0];
            [controller setSubject:@""];
            [controller setMessageBody:@" " isHTML:YES];
            [controller setToRecipients:[NSArray arrayWithObjects:@"",nil]];
            UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
            UIImage *ui = resultimg.image;
            pasteboard.image = ui;
            NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(ui)];
            [controller addAttachmentData:imageData mimeType:@"image/png" fileName:@" "];
            [self presentViewController:controller animated:YES completion:NULL];
        }
        else{
            UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"alrt" message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
            [alert show];
        }

    }
    -(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
    {

        [MailAlert show];
        switch (result)
        {
            case MFMailComposeResultCancelled:
                MailAlert.message = @"Email Cancelled";
                break;
            case MFMailComposeResultSaved:
                MailAlert.message = @"Email Saved";
                break;
            case MFMailComposeResultSent:
                MailAlert.message = @"Email Sent";
                break;
            case MFMailComposeResultFailed:
                MailAlert.message = @"Email Failed";
                break;
            default:
                MailAlert.message = @"Email Not Sent";
                break;
        }
        [self dismissViewControllerAnimated:YES completion:NULL];
        [MailAlert show];
    }

정말 고마워! HTML 본문에 매우 유용한 예입니다.
Resty

4

스위프트 2.2. Esq의 답변 에서 채택

import Foundation
import MessageUI

class MailSender: NSObject, MFMailComposeViewControllerDelegate {

    let parentVC: UIViewController

    init(parentVC: UIViewController) {
        self.parentVC = parentVC
        super.init()
    }

    func send(title: String, messageBody: String, toRecipients: [String]) {
        if MFMailComposeViewController.canSendMail() {
            let mc: MFMailComposeViewController = MFMailComposeViewController()
            mc.mailComposeDelegate = self
            mc.setSubject(title)
            mc.setMessageBody(messageBody, isHTML: false)
            mc.setToRecipients(toRecipients)
            parentVC.presentViewController(mc, animated: true, completion: nil)
        } else {
            print("No email account found.")
        }
    }

    func mailComposeController(controller: MFMailComposeViewController,
        didFinishWithResult result: MFMailComposeResult, error: NSError?) {

            switch result.rawValue {
            case MFMailComposeResultCancelled.rawValue: print("Mail Cancelled")
            case MFMailComposeResultSaved.rawValue: print("Mail Saved")
            case MFMailComposeResultSent.rawValue: print("Mail Sent")
            case MFMailComposeResultFailed.rawValue: print("Mail Failed")
            default: break
            }

            parentVC.dismissViewControllerAnimated(false, completion: nil)
    }
}

고객 코드 :

var ms: MailSender?

@IBAction func onSendPressed(sender: AnyObject) {
    ms = MailSender(parentVC: self)
    let title = "Title"
    let messageBody = "/programming/310946/how-can-i-send-mail-from-an-iphone-application this question."
    let toRecipents = ["foo@bar.com"]
    ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}

4

iPhone 응용 프로그램에서 이메일을 보내려면 아래 작업 목록을 수행해야합니다.

1 단계 : 가져 오기#import <MessageUI/MessageUI.h> 이메일을 보내려는 컨트롤러 클래스에서 가져 옵니다.

2 단계 : 아래와 같이 컨트롤러에 델리게이트 추가

 @interface <yourControllerName> : UIViewController <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate>

3 단계 : 이메일 전송 방법을 아래에 추가합니다.

 - (void) sendEmail {
 // Check if your app support the email.
 if ([MFMailComposeViewController canSendMail]) {
    // Create an object of mail composer.
    MFMailComposeViewController *mailComposer =      [[MFMailComposeViewController alloc] init];
    // Add delegate to your self.
    mailComposer.mailComposeDelegate = self;
    // Add recipients to mail if you do not want to add default recipient then remove below line.
    [mailComposer setToRecipients:@[<add here your recipient objects>]];
    // Write email subject.
    [mailComposer setSubject:@“<Your Subject Here>”];
    // Set your email body and if body contains HTML then Pass “YES” in isHTML.
    [mailComposer setMessageBody:@“<Your Message Body>” isHTML:NO];
    // Show your mail composer.
    [self presentViewController:mailComposer animated:YES completion:NULL];
 }
 else {
 // Here you can show toast to user about not support to sending email.
}
}

4 단계 : MFMailComposeViewController 델리게이트 구현

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


switch (result) {
   case MFMailComposeResultSaved: {
    // Add code on save mail to draft.
    break;
}
case MFMailComposeResultSent: {
    // Add code on sent a mail.
    break;
}
case MFMailComposeResultCancelled: {
    // Add code on cancel a mail.
    break;
}
case MFMailComposeResultFailed: {
    // Add code on failed to send a mail.
    break;
}
default:
    break;
}
}

이 답변은 기존 답변 중 하나에 아직 포함되지 않은 새로운 정보를 제공합니까?
Florian Koch

2

스위프트 2.0

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?){
    if let error = error{
        print("Error: \(error)")
    }else{
        //NO Error
        //------------------------------------------------
        var feedbackMsg = ""

        switch result.rawValue {
        case MFMailComposeResultCancelled.rawValue:
            feedbackMsg = "Mail Cancelled"
        case MFMailComposeResultSaved.rawValue:
            feedbackMsg = "Mail Saved"
        case MFMailComposeResultSent.rawValue:
            feedbackMsg = "Mail Sent"
        case MFMailComposeResultFailed.rawValue:
            feedbackMsg = "Mail Failed"
        default:
            feedbackMsg = ""
        }

        print("Mail: \(feedbackMsg)")

        //------------------------------------------------
    }
}

1

스위프트 버전은 다음과 같습니다.

import MessageUI

class YourVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if MFMailComposeViewController.canSendMail() {
            var emailTitle = "Vea Software Feedback"
            var messageBody = "Vea Software! :) "
            var toRecipents = ["pj@veasoftware.com"]
            var mc:MFMailComposeViewController = MFMailComposeViewController()
            mc.mailComposeDelegate = self
            mc.setSubject(emailTitle)
            mc.setMessageBody(messageBody, isHTML: false)
            mc.setToRecipients(toRecipents)
            self.presentViewController(mc, animated: true, completion: nil)
        } else {
            println("No email account found")
        }
    }
}

extension YourVC: MFMailComposeViewControllerDelegate {
    func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
        switch result.value {
        case MFMailComposeResultCancelled.value:
            println("Mail Cancelled")
        case MFMailComposeResultSaved.value:
            println("Mail Saved")
        case MFMailComposeResultSent.value:
            println("Mail Sent")
        case MFMailComposeResultFailed.value:
            println("Mail Failed")
        default:
            break
        }
        self.dismissViewControllerAnimated(false, completion: nil)
    }
}

출처


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.