2014-06-17 11 views
10

Desidero utilizzare rapidamente per implementare l'e-mail in-app. Quando faccio clic sul pulsante, viene visualizzata la finestra di posta elettronica. Tuttavia, non sono in grado di inviare la mia email. Inoltre, dopo aver fatto clic su annulla-cancella bozza, non posso tornare alla schermata originale.Impossibile utilizzare Swift per implementare l'e-mail in-app

import UIkit 
import MessageUI 


class Information : UIViewController, MFMailComposeViewControllerDelegate{ 

    var myMail: MFMailComposeViewController! 

    @IBAction func sendReport(sender : AnyObject) { 

     if(MFMailComposeViewController.canSendMail()){ 
      myMail = MFMailComposeViewController() 

      //myMail.mailComposeDelegate 

      // set the subject 
      myMail.setSubject("My report") 

      //To recipients 
      var toRecipients = ["[email protected]"] 
      myMail.setToRecipients(toRecipients) 

      //CC recipients 
      var ccRecipients = ["[email protected]"] 
      myMail.setCcRecipients(ccRecipients) 

      //CC recipients 
      var bccRecipients = ["[email protected]"] 
      myMail.setBccRecipients(ccRecipients) 

      //Add some text to the message body 
      var sentfrom = "Email sent from my app" 
      myMail.setMessageBody(sentfrom, isHTML: true) 

      //Include an attachment 
      var image = UIImage(named: "Gimme.png") 
      var imageData = UIImageJPEGRepresentation(image, 1.0) 

      myMail.addAttachmentData(imageData, mimeType: "image/jped", fileName:  "image") 

      //Display the view controller 
      self.presentViewController(myMail, animated: true, completion: nil) 
     } 
     else{ 
      var alert = UIAlertController(title: "Alert", message: "Your device cannot send emails", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alert, animated: true, completion: nil) 


     } 
    } 




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

     switch(result.value){ 
     case MFMailComposeResultSent.value: 
      println("Email sent") 

     default: 
      println("Whoops") 
     } 

     self.dismissViewControllerAnimated(true, completion: nil) 

} 
} 
+0

Non si può mai impostare il 'mailComposeDelegate'. – rmaddy

risposta

10

Dal momento che non è stato impostato il controller della vista corrente come mailComposeDelegate della myMail, il metodo mailComposeController:didFinishWithResult non è essere chiamato. Dopo aver init myMail, assicurarsi di aggiungere:

myMail.mailComposeDelegate = self 

e sarete pronti per partire

+0

Questo funziona! Grazie mille! Tuttavia, dopo aver fatto clic su "invia", sembra che l'email non sia stata inviata. Posso chiedere come inviare la mia email? –

+0

Stai facendo questo sul dispositivo o sul simulatore? –

+0

Oh, mi rendo conto che lo sto facendo sul simulatore ... Grazie mille! –

1

Nel caso qualcuno è alla ricerca di una soluzione non MFMailCompose, ecco quello che ho fatto per trasmettere utilizzando il server SMTP di Gmail .

  1. Scarica uno zip di questa repo: https://github.com/jetseven/skpsmtpmessage
  2. trascinare e rilasciare i file sotto SMTPLibrary nel progetto XCode
  3. Creare un nuovo file di intestazione - MyApp-Briding-Header.h
  4. Sostituire nuovo file di intestazione con questo:
#import "Base64Transcoder.h" 
#import "HSK_CFUtilities.h" 
#import "NSData+Base64Additions.h" 
#import "NSStream+SKPSMTPExtensions.h" 
#import "SKPSMTPMessage.h" 
  1. Vai al progetto (Obiettivi> MyApp a sinistra)/costruire Impostazioni/Swift Compiler - Generazione di codice
  2. Aggiungi percorso intestazione del file sotto Objective-C Briding Header ->Debug (vale a dire MyApp/MyApp-Bridging-Header.h
  3. Vai a Project/Build Phases/Compile Sources
  4. Selezionare tutti i file .m e fare clic su Invio. Digita -fno-objc-arc e premi invio.

  5. Usa questo codice per inviare e-mail:

var mail = SKPSMTPMessage()  
mail.fromEmail = "[email protected]" 
mail.toEmail = "[email protected]" 
mail.requiresAuth = true 
mail.login = "[email protected]" 
mail.pass = "password" 
mail.subject = "test subject" 
mail.wantsSecure = true 
mail.relayHost = "smtp.gmail.com" 

mail.relayPorts = [587] 

var parts: NSDictionary = [ 
      "kSKPSMTPPartContentTypeKey": "text/plain; charset=UTF-8", 
      "kSKPSMTPPartMessageKey": "test message", 
] 

mail.parts = [parts] 

mail.send() 

Speranza che aiuta qualcuno. Non volevo utilizzare l'opzione MFMailCompose perché non volevo richiedere all'utente.

0

Ecco come ho composto la mia email con il documento PDF allegato documento.

solo per testare questo esempio è necessario trascinare e rilasciare un campione PDF denominato "All_about_tax.pdf"

@IBAction func sendEmail(sender: UIButton) 
    { 
     //Check to see the device can send email. 
     if(MFMailComposeViewController.canSendMail()) 
     { 
      print("Can send email.") 

      let mailComposer = MFMailComposeViewController() 
      mailComposer.mailComposeDelegate = self 

      //Set to recipients 
      mailComposer.setToRecipients(["your email id here"]) 

      //Set the subject 
      mailComposer.setSubject("Tax info document pdf") 

      //set mail body 
      mailComposer.setMessageBody("This is what they sound like.", isHTML: true) 

      if let filePath = NSBundle.mainBundle().pathForResource("All_about_tax", ofType: "pdf") 
      { 
       print("File path loaded.") 

       if let fileData = NSData(contentsOfFile: filePath) 
       { 
        print("File data loaded.") 
        mailComposer.addAttachmentData(fileData, mimeType: "application/pdf", fileName: "All_about_tax.pdf") 

       } 
      } 

      //this will compose and present mail to user 
      self.presentViewController(mailComposer, animated: true, completion: nil) 
     } 
     else 
     { 
      print("email is not supported") 
     } 
    } 



    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) 
    { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    }