Failed on using Swift to implement in-app email

前端 未结 3 2124
走了就别回头了
走了就别回头了 2021-02-14 08:52

I want to use swift to implement in-app email. When I click the button, the email window pops up. However, I am unable to send my email. Moreover, after I click cancel-delete dr

相关标签:
3条回答
  • 2021-02-14 09:26

    Since you haven't set the current view controller as the mailComposeDelegate of myMail, the mailComposeController:didFinishWithResult method isn't being called. After you init myMail, make sure to add:

    myMail.mailComposeDelegate = self
    

    and you'll be good to go

    0 讨论(0)
  • 2021-02-14 09:27

    In case anyone is looking for a non MFMailCompose option, here's what I did to send using Gmail's SMTP servers.

    1. Download a zip of this repo: https://github.com/jetseven/skpsmtpmessage
    2. Drag and drop the files under SMTPLibrary into your XCode project
    3. Create a new header file - MyApp-Briding-Header.h
    4. Replace new header file with this:
    #import "Base64Transcoder.h"
    #import "HSK_CFUtilities.h"
    #import "NSData+Base64Additions.h"
    #import "NSStream+SKPSMTPExtensions.h"
    #import "SKPSMTPMessage.h"
    
    1. Go to Project(Targets > MyApp on the left)/Build Settings/Swift Compiler - Code Generation
    2. Add path to header file under Objective-C Briding Header -> Debug (i.e. MyApp/MyApp-Bridging-Header.h
    3. Go to Project/Build Phases/Compile Sources
    4. Select all .m files and click enter. Type -fno-objc-arc and hit enter.

    5. Use this code to send email:

    var mail = SKPSMTPMessage()       
    mail.fromEmail = "fromemail@gmail.com"
    mail.toEmail = "tomail@gmail.com"
    mail.requiresAuth = true
    mail.login = "fromemail@gmail.com"
    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()
    

    Hope it helps someone. I didn't want to use the MFMailCompose option because I didn't want to have to prompt the user.

    0 讨论(0)
  • 2021-02-14 09:42

    This is how I have composed my email with attached PDF file document.

    Just to test this example you need to drag and drop a sample PDF named "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)
        }
    
    0 讨论(0)
提交回复
热议问题