Làm cách nào để gửi thư từ ứng dụng iPhone


242

Tôi muốn gửi email từ ứng dụng iPhone của mình. Tôi đã nghe nói rằng SDK iOS không có API email. Tôi không muốn sử dụng mã sau vì nó sẽ thoát khỏi ứng dụng của tôi:

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]];

Vậy làm thế nào tôi có thể gửi email từ ứng dụng của mình?

Câu trả lời:


430

Trên iOS 3.0 trở lên, bạn nên sử dụng MFMailComposeViewControllerlớp và MFMailComposeViewControllerDelegategiao thức, được giấu trong khung MessageUI.

Đầu tiên thêm khung và nhập:

#import <MessageUI/MFMailComposeViewController.h>

Sau đó, để gửi tin nhắn:

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];

Sau đó, người dùng thực hiện công việc và bạn nhận được cuộc gọi lại đại biểu kịp thời:

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

Nhớ kiểm tra xem thiết bị có được cấu hình để gửi email không:

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

5
+1. Các khung cần nhập được đề cập ở đây ( mobileorchard.com/, ).
Dan Rosenstark

71
Để tiết kiệm cho bạn nhảy, bạn cần phải #import <MessageUI / MFMailComposeViewController.h>
TomH

22
Chỉ cần lưu ý rằng vì câu trả lời này được viết bằng các phương thức của UIViewContoder presentModalViewController:animated:dismissModalViewControllerAnimated:đã được đánh dấu là không dùng nữa - thay vào đó các phương thức thay thế dựa trên khối presentViewController:animated:completion:dismissViewControllerAnimated:completion:nên được sử dụng.

2
Và đừng quên thiết lập đại biểu trong .h @interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir

18
Và trong iOS 6 [self presentModalViewController:controller animated:YES]; thay thế bằng [self presentViewController:controller animated:YES completion:nil]; [self dismissModalViewControllerAnimated:YES]; thay thế bằng [self dismissViewControllerAnimated:YES completion:nil];
Nazir

61

MFMailComposeViewCont kiểm soát là cách tốt nhất sau khi phát hành phần mềm iPhone OS 3.0. Bạn có thể nhìn vào mã mẫu hoặc hướng dẫn tôi đã viết .


2
Bài viết tuyệt vời của Mugunth. Con đường để đi bạn thân!
Jordan

1
Nó thực sự tuyệt vời. Cảm ơn. Tôi đã thiết kế một khung nhìn đặc biệt để chấp nhận email và chủ đề từ người dùng. bằng cách thực hiện cùng một mã, một lần nữa hiển thị phần nhìn tương tự. Tôi có thể gọi phương thức đại biểu từ sự kiện nhấn nút của tôi trong lớp trình điều khiển xem Cảm ơn sự giúp đỡ của bạn, Shibin
smakstr

Tôi đã tải xuống cùng một mã mẫu nhưng nó không gửi bất kỳ thư nào. Nó chỉ nhắc rằng thư đã được gửi thành công nhưng không nhận được thư. Tôi đã thử thêm khung MessageUI xuất hiện màu đỏ theo mặc định nhưng ứng dụng vẫn không gửi thư. Bất kỳ trợ giúp về vấn đề này sẽ được đánh giá cao. Tôi đang thử nghiệm ứng dụng trong trình giả lập.
Ravi shankar

Không thể gửi email từ trình giả lập.
malaki1974

20

Một vài điều tôi muốn thêm vào đây:

  1. Sử dụng URL mailto sẽ không hoạt động trong trình giả lập vì mail.app không được cài đặt trên trình giả lập. Nó không hoạt động trên thiết bị mặc dù.

  2. Có giới hạn về độ dài của URL mailto. Nếu URL lớn hơn 4096 ký tự, mail.app sẽ không khởi chạy.

  3. Có một lớp mới trong OS 3.0 cho phép bạn gửi e-mail mà không cần rời khỏi ứng dụng của mình. Xem lớp MFMailComposeViewControll.


13

Nếu bạn muốn gửi email từ ứng dụng của mình, đoạn mã trên là cách duy nhất để làm điều đó trừ khi bạn mã hóa ứng dụng thư khách (SMTP) của riêng bạn trong ứng dụng của bạn hoặc có một máy chủ gửi thư cho bạn.

Ví dụ: bạn có thể mã ứng dụng của mình để gọi URL trên máy chủ sẽ gửi thư cho bạn. Sau đó, bạn chỉ cần gọi URL từ mã của bạn.

Lưu ý rằng với đoạn mã trên, bạn không thể đính kèm bất cứ điều gì vào email, phương thức máy khách SMTP sẽ cho phép bạn thực hiện, cũng như phương thức phía máy chủ.


12

Mã bên dưới được sử dụng trong ứng dụng của tôi để gửi email kèm theo tệp đính kèm ở đây, tệp đính kèm là hình ảnh. Bạn có thể gửi bất kỳ loại tệp nào chỉ cần lưu ý rằng bạn phải chỉ định 'mimeType' chính xác

thêm phần này vào tập tin .h của bạn

#import <MessageUI/MFMailComposeViewController.h>

Thêm MessageUI.framework vào tệp dự án của bạn

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];

Phương pháp đại biểu như dưới đây

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

11

Đây là mã có thể giúp bạn nhưng đừng quên bao gồm thông báo ui framewark và bao gồm phương thức đại biểu MFMailComposeViewControllDelegate

-(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];
    }

Cảm ơn bạn rất nhiều! Ví dụ rất hữu ích với cơ thể HTML.
Resty

4

Swift 2.2. Chuyển thể từ câu trả lời của 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)
    }
}

Mã khách hàng:

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

Để gửi email từ ứng dụng iPhone, bạn cần thực hiện bên dưới danh sách nhiệm vụ.

Bước 1: Nhập#import <MessageUI/MessageUI.h> Trong lớp trình điều khiển của bạn, nơi bạn muốn gửi email.

Bước 2: Thêm đại biểu vào bộ điều khiển của bạn như hiển thị bên dưới

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

Bước 3: Thêm phương thức bên dưới để gửi email.

 - (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.
}
}

Bước 4: Triển khai đại biểu MFMailComposeViewControll

- (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;
}
}

câu trả lời này có cung cấp bất kỳ thông tin mới nào chưa được đưa vào một trong những câu trả lời hiện có không?
Florian Koch

2

Swift 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

Đây là phiên bản Swift:

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)
    }
}

Nguồn


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.