Bir iPhone uygulamasından nasıl posta gönderebilirim?


242

İPhone uygulamamdan bir e-posta göndermek istiyorum. İOS SDK'nın bir e-posta API'sı olmadığını duydum. Uygulamamdan çıkacağı için aşağıdaki kodu kullanmak istemiyorum:

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

Peki uygulamamdan nasıl e-posta gönderebilirim?

Yanıtlar:


430

İOS 3.0 ve sonraki sürümlerde , MessageUI çerçevesinde gizlenmiş MFMailComposeViewControllersınıfı ve MFMailComposeViewControllerDelegateprotokolü kullanmalısınız .

İlk olarak çerçeveyi ekleyin ve içe aktarın:

#import <MessageUI/MFMailComposeViewController.h>

Sonra bir mesaj göndermek için:

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

Daha sonra kullanıcı işi yapar ve temsilci geri aramasını zamanında alırsınız:

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

Cihazın e-posta göndermek için yapılandırılıp yapılandırılmadığını kontrol etmeyi unutmayın:

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

5
+1. İçe aktarılması gereken çerçeveler burada belirtilmiştir ( mobileorchard.com/… ).
Dan Rosenstark

71
Atlamayı kurtarmak için #import <MessageUI / MFMailComposeViewController.h>
TomH

22
Sadece bu cevap UIViewController yöntemleri yazıldığından presentModalViewController:animated:ve dismissModalViewControllerAnimated:kullanımdan kaldırılmış olarak işaretlendiğinden - blok tabanlı değiştirme yöntemleri presentViewController:animated:completion:ve dismissViewControllerAnimated:completion:kullanılması gerektiğini unutmayın.

2
Ve .h@interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
Nazir'de

18
Ve IOS 6'da [self presentModalViewController:controller animated:YES]; değiştirin [self presentViewController:controller animated:YES completion:nil]; ve [self dismissModalViewControllerAnimated:YES]; onunla değiştirin [self dismissViewControllerAnimated:YES completion:nil];
Nazir

61

MFMailComposeViewController , iPhone OS 3.0 yazılımının piyasaya sürülmesinden sonra gitmenin yoludur. Örnek koda veya yazdığım öğreticiye bakabilirsiniz .


2
Mugunth tarafından harika bir yazı. Gitmenin yolu dostum!
Ürdün

1
Gerçekten harika. Teşekkürler. Kullanıcıdan gelen e-postayı ve konuyu kabul etmek için özel bir görünüm tasarladım. aynı kodu uygulayarak yine benzer bir bakış açısı gösterir. görünüm denetleyicisi sınıfındaki düğme basın olayından temsilci yöntemini çağırabilir miyim Yardımınız için teşekkürler, Shibin
smakstr

Aynı örnek kodu indirdim ancak posta göndermiyor. Yalnızca postanın başarıyla gönderilmesini ister ancak posta alınmaz. Varsayılan olarak kırmızı renkli görünen MessageUI çerçevesi eklemeyi denedim, ancak yine de uygulama postayı göndermiyor. Bu konuda herhangi bir yardım çok takdir edilecektir. Uygulamayı simülatörde test ediyorum.
Ravi shankar

Simülatörden e-posta gönderilemiyor.
malaki1974

20

Buraya eklemek istediğim birkaç şey:

  1. Mail.app simülatörde yüklü olmadığından mailto URL'yi kullanmak simülatörde çalışmaz. Yine de cihazda çalışıyor.

  2. Mailto URL'sinin uzunluğunda bir sınırlama vardır. URL 4096 karakterden büyükse, mail.app başlatılmaz.

  3. OS 3.0'da, uygulamanızdan ayrılmadan e-posta göndermenizi sağlayan yeni bir sınıf var. MFMailComposeViewController sınıfına bakın.


13

Uygulamanızdan e-posta göndermek istiyorsanız, uygulamanızın içinde kendi posta istemcinizi (SMTP) kodlamadığınız veya bir sunucunun postayı sizin yerinize göndermesini sağlamadığınız sürece yukarıdaki kod bunu yapmanın tek yoludur.

Örneğin, uygulamanızı sunucunuzda postayı sizin için gönderecek bir URL çağırması için kodlayabilirsiniz. Ardından URL'yi kodunuzdan çağırmanız yeterlidir.

Yukarıdaki kodla, e-postaya SMTP istemci yönteminin yanı sıra sunucu tarafı yönteminin yapmasına izin veren bir şey ekleyemeyeceğinizi unutmayın.


12

Aşağıdaki kod benim app eki ile e-posta göndermek için kullanılır burada ekleri bir görüntüdür. Aklınızda tutulması gereken herhangi bir dosya türünü doğru 'mimeType' belirtmek zorunda olduğunu unutmayın

bunu .h dosyanıza ekle

#import <MessageUI/MFMailComposeViewController.h>

MessageUI.framework proje dosyanıza ekleyin

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

Delege yöntemi aşağıda gösterildiği gibidir

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

11

Bu u yardımcı olabilir ama mesaj ui framewark ve delege yöntemi MFMailComposeViewControllerDelegate dahil etmeyi unutmayın kodu

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

Çok teşekkür ederim! HTML gövdesi ile çok yararlı bir örnek.
Resty

4

Hızlı 2.2. Esq'ın cevabından uyarlandı

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üşteri kodu :

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

İPhone uygulamasından bir e-posta göndermek için aşağıdaki görev listesini yapmanız gerekir.

1. Adım: İçe Aktarma#import <MessageUI/MessageUI.h> E-posta göndermek istediğiniz denetleyici sınıfınızda.

2. Adım: Temsilciyi aşağıda gösterildiği gibi denetleyicinize ekleyin

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

3. Adım: E-posta göndermek için aşağıdaki yöntemi ekleyin.

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

Adım 4: MFMailComposeViewController Temsilcisi Uygulama

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

bu cevap mevcut cevaplardan birine henüz eklenmemiş yeni bilgiler sağlıyor mu?
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

Heres Swift versiyonu:

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

Kaynak


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.