iOS
 Computer >> コンピューター >  >> プログラミング >> iOS

【Swift入門】iOSアプリからメールで添付ファイルを送信する方法

多くのiOSアプリにはコンテンツ共有機能が搭載されており、その中でも「メールに添付ファイルを付けて送信する」機能は非常に需要が高いものです。そのため、開発者としてこの実装手法を実践的に身につけておくことは大きなメリットになります。

本記事では、Swiftを使ってメールに添付ファイルを送信する方法を、実際にサンプルアプリを作りながらステップごとにわかりやすく解説していきます。

今回使用するクラスについて

メール送信には、Appleが標準で提供している MFMailComposeViewController を利用します。これは、ユーザーがメールの管理・編集・送信を行うためのインターフェースを持つ標準ビューコントローラです。

詳細は以下の公式ドキュメントを参照してください。
MFMailComposeViewController – Apple Developer Documentation

さらに、メールの送信結果(送信完了・キャンセル・失敗など)を適切に処理するため、MFMailComposeViewControllerDelegate プロトコルにも準拠します。

詳細はこちら:
MFMailComposeViewControllerDelegate – Apple Developer Documentation

サンプルアプリの実装手順

ステップ1:プロジェクトの作成

Xcodeを開き、「Single View Application」を選択して、新しいプロジェクトを「EmailAttachment」という名前で作成します。

ステップ2:ボタンの配置

Main.storyboard を開き、画面にボタンを1つ追加し、タイトルを「send mail」などに設定します。

【Swift入門】iOSアプリからメールで添付ファイルを送信する方法

ステップ3:IBActionの作成

ボタンに接続するアクションとして、以下のように @IBAction を作成します。

@IBAction func btnSendMail(_ sender: Any) { }

ステップ4:MessageUIのインポート

ViewController.swift の先頭で MessageUI フレームワークをインポートします。

import MessageUI

ステップ5:デリゲートプロトコルへの準拠

ViewController クラスを MFMailComposeViewControllerDelegate に準拠させます。

class ViewController: UIViewController, MFMailComposeViewControllerDelegate

ステップ6:添付ファイルの追加

プロジェクトに添付用のファイルを追加します。ここでは「sampleData.json」を使用します。

【Swift入門】iOSアプリからメールで添付ファイルを送信する方法

ステップ7:メール送信処理の実装

btnSendMail アクション内に、以下のコードを記述します。まず canSendMail() でメール送信が可能かどうかを確認し、宛先・件名・本文を設定した上で、Bundleから読み込んだJSONデータを添付しています。

@IBAction func btnSendMail(_ sender: Any) {
    if MFMailComposeViewController.canSendMail() {
        let mail = MFMailComposeViewController()
        mail.setToRecipients(["test@gmail.com"])
        mail.setSubject("GREETING")
        mail.setMessageBody("Welcome to Tutorials Point!", isHTML: true)
        mail.mailComposeDelegate = self
        // 添付ファイルの追加
        if let filePath = Bundle.main.path(forResource: "sampleData", ofType: "json") {
            if let data = NSData(contentsOfFile: filePath) {
                mail.addAttachmentData(data as Data, mimeType: "application/json", fileName: "sampleData.json")
            }
        }
        present(mail, animated: true)
    }
    else {
        print("Email cannot be sent")
    }
}

これで基本的な実装は完了です!

送信結果のハンドリング(デリゲートメソッドの実装)

しかし、これだけでは不十分です。メールが「送信された」「キャンセルされた」「送信に失敗した」といった各状態を適切に処理する必要があります。そのために、先ほど準拠させたデリゲートプロトコルのメソッドを実装します。

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    if let _ = error {
        self.dismiss(animated: true, completion: nil)
    }
    switch result {
        case .cancelled:
            print("Cancelled")
            break
        case .sent:
            print("Mail sent successfully")
            break
        case .failed:
            print("Sending mail failed")
            break
        default:
            break
    }
    controller.dismiss(animated: true, completion: nil)
}

これで全ての実装が完了しました!シミュレータではなく実機でプログラムを実行すると、動作を確認できます。

【Swift入門】iOSアプリからメールで添付ファイルを送信する方法

完全なコード

最後に、ここまでの内容をまとめた完全なコードを掲載します。

import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
    override func viewDidLoad() {
    }
    @IBAction func btnSendMail(_ sender: Any) {
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.setToRecipients(["test@gmail.com"])
            mail.setSubject("GREETING")
            mail.setMessageBody("Welcome to Tutorials Point!", isHTML: true)
            mail.mailComposeDelegate = self
            if let filePath = Bundle.main.path(forResource: "sampleData", ofType: "json") {
                if let data = NSData(contentsOfFile: filePath) {
                    mail.addAttachmentData(data as Data, mimeType: "application/json", fileName: "sampleData.json")
                }
            }
            present(mail, animated: true)
        }
        else {
            print("Email cannot be sent")
        }
    }
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        if let _ = error {
            self.dismiss(animated: true, completion: nil)
        }
        switch result {
            case .cancelled:
                print("Cancelled")
                break
            case .sent:
                print("Mail sent successfully")
                break
            case .failed:
                print("Sending mail failed")
                break
            default:
                break
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

まとめ

本記事では、MFMailComposeViewControllerを使った添付ファイル付きメールの送信方法を解説しました。ポイントは以下の3つです。

  • canSendMail() で事前に送信可能かをチェックする
  • addAttachmentData(mimeType:fileName:) でデータを添付する
  • デリゲートメソッドで送信結果(成功・キャンセル・失敗)を必ず処理する

なお、メール送信機能はシミュレータでは動作しないため、テストの際は必ず実機を使用してください。ぜひご自身のアプリにも応用してみてください。

  1. メールの送り方を徹底解説!Gmailで失敗しないための9つのステップとコツ

    メールを送りたいけれど、何から始めればいいのか分からない——そんな経験はありませんか?あるいは、すでにメールは送れるけれど、もっと質の高いメールを作りたいと考えている方もいるでしょう。この記事では、メール送信の基本から実践的なコツまで、順を追って詳しく解説します。「メールを送る」という行為自体はシンプルに思えますが、相手にきちんと伝わる良いメールを書くのは決して簡単ではありません。宛先と本文さえあれば十分だと考えがちですが、実際にはそれ以外にも押さえるべきポイントが数多くあります。ここでは、質の高いメールを送るための手順を紹介します。メールを送るために必要なものメールの送り方を説明する前に、事

  2. Linuxターミナルからメールを送信する4つの方法(mail・sendmail・telnet・mutt)

    Linuxのターミナルは、わずかなキー操作だけで多彩なタスクを実行できる強力な環境です。日頃からターミナルで作業することが多い方なら、メールもターミナルから直接送信できることをご存じでしょうか。本記事では、Linuxターミナルからメールを送信するための代表的な4つの方法とツールを、具体的なコマンド例とともにわかりやすく解説します。 注意:ターミナルからメールを送信するには、あらかじめメールサーバーがセットアップされ、正常に動作している必要があります。 1. mailコマンドを使う Linuxターミナルからメールを送信する最もシンプルな方法が、mailユーティリティの利用です。宛先や件名を指定