【Swift】MFMailComposeVCでメールを送信する

 

 

完成図

 

f:id:nekokichi_yos2:20181230233222p:plain

 

解説

 

新規メールを起動し、指定したメアドにメールを送れる。

 

・設定できる項目は

  1. 宛先
  2. Cc
  3. Bc
  4. 件名
  5. 本文

 の5つ。

 

参考になった動画がこちら。

 

注意点が1つ。

 

スマホの環境設定からメールのアカウントを追加しないと起動しない。

 

GmailやYahooなどのiCloud以外のアカウントを追加する必要がある。

 

※2019/2/17更新

didFinishWithのメソッド内にあるresultとswitch構文を用いれば、

  • キャンセル
  • 下書き保存
  • 送信

のそれぞれの動作に応じた処理を施すことができる。

 

例えば、

  • 送信したらUIAlertControllerを起動
  • キャンセル、送信時にdismissで元の画面へ戻る

など。

 

ソースコード

 

import UIKit
import MessageUI

class Contact: UIViewController,MFMailComposeViewControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        sendMail()
    }
    
    //新規メールを開く
    func sendMail() {
        //メール送信が可能なら
        if MFMailComposeViewController.canSendMail() {
            //MFMailComposeVCのインスタンス
            let mail = MFMailComposeViewController()
            //MFMailComposeのデリゲート
            mail.mailComposeDelegate = self
            //送り先
            mail.setToRecipients(["test1@gmail.com","test2@gmail.com"])
            //Cc
            mail.setCcRecipients(["mike@gmail.com"])
            //Bcc
            mail.setBccRecipients(["amy@gmail.com"])
            //件名
            mail.setSubject("件名")
            //メッセージ本文
            mail.setMessageBody("このメールはMFMailComposeViewControllerから送られました。", isHTML: false)
            //メールを表示
            self.present(mail, animated: true, completion: nil)
        //メール送信が不可能なら
        } else {
            //アラートで通知
            let alert = UIAlertController(title: "No Mail Accounts", message: "Please set up mail accounts", preferredStyle: .alert)
            let dismiss = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alert.addAction(dismiss)
            self.present(alert, animated: true, completion: nil)
        }
    }
    
    //エラー処理
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        if error != nil {
            //送信失敗
            print(error)
        } else {
            switch result {
            case .cancelled:
                //キャンセル
            case .saved:
                //下書き保存
            case .sent:
                //送信
            default:
                break
            }
            controller.dismiss(animated: true, completion: nil)
        }
    }
    
}