Help us understand the problem. What is going on with this article?

【Swift】アプリ内でメーラーを起動させ、作成したCSVファイルを自動添付するやり方

More than 3 years have passed since last update.

はじめに

今回は、アプリ内でCSVファイルの中身を作成し、
それをメールに自動添付するやり方をまとめました。

メーラーを起動させて、
メールアドレス・件名・本文などを指定してメール送信するやり方は、
以下のURLにまとめてあります。
【Swift】アプリ内でメーラーを起動しメール送信するやり方
また、
この記事の後半部分に完成版ソースコードがあるため、
そちらを参考にしても構いません。

やり方

・CSVデータの中身を作成するために、csvDataという変数を定義する
 var csvData=[[String]]()

・csvにデータを入れる
 csvData.append(["日付","データ1","データ2","データ3","データ4"])

sendMailWithCSVという関数を作成し、呼び出す
sendMailWithCSV("メール件名", message: "メール本文", csv: csvData)

func sendMailWithCSV(subject: String, message: String, csv: [[String]]) {

    let mailViewController = MFMailComposeViewController()
    mailViewController.mailComposeDelegate = self

    mailViewController.setSubject(subject)
    mailViewController.setToRecipients(toRecipients)
    mailViewController.setCcRecipients(CcRecipients)
    mailViewController.setBccRecipients(BccRecipients)
    mailViewController.setMessageBody(message, isHTML: false)
    mailViewController.addAttachmentData(imageData, mimeType: "image/png", fileName: "image")
    mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), mimeType: "text/csv", fileName: "sample.csv")
    self.presentViewController(mailViewController, animated: true) {}
}

完成

ViewController.swift
import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate{

    let startMailerBtn = UIButton(frame: CGRectMake(0,0,200,30))
    var csvData=[[String]]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        startMailerBtn.layer.position = CGPoint(x:self.view.bounds.width/2,y:self.view.bounds.height/2);
        startMailerBtn.setTitle("メール送信", forState: .Normal)
        startMailerBtn.setTitleColor(UIColor.blueColor(), forState: .Normal)
        startMailerBtn.addTarget(self, action: "onClickStartMailerBtn:", forControlEvents: .TouchUpInside)
        self.view.addSubview(startMailerBtn)

    }

    func onClickStartMailerBtn(sender: UIButton) {
        //メールを送信できるかチェック
        if MFMailComposeViewController.canSendMail()==false {
            println("Email Send Failed")
            return
        }

        //CSVデータの作成
        csvData.append(["日付","データ1","データ2","データ3","データ4"])
        csvData.append(["2015年5月5日","aaa","bbb","ccc","ddd"])

        sendMailWithCSV("メール件名", message: "メール本文", csv: csvData)

    }

    func sendMailWithCSV(subject: String, message: String, csv: [[String]]) {

        let mailViewController = MFMailComposeViewController()
        mailViewController.mailComposeDelegate = self
        var toRecipients = ["to@1gmail.com"]
        var CcRecipients = ["cc@1gmail.com"]
        var BccRecipients = ["Bcc1@1gamil.com","Bcc2@1gmail.com"]
        var image = UIImage(named: "myphoto.png")
        var imageData = UIImageJPEGRepresentation(image, 1.0)

        mailViewController.setSubject(subject)
        mailViewController.setToRecipients(toRecipients)
        mailViewController.setCcRecipients(CcRecipients)
        mailViewController.setBccRecipients(BccRecipients)
        mailViewController.setMessageBody(message, isHTML: false)
        mailViewController.addAttachmentData(imageData, mimeType: "image/png", fileName: "image")
        mailViewController.addAttachmentData(toCSV(csv).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), mimeType: "text/csv", fileName: "sample.csv")
        self.presentViewController(mailViewController, animated: true) {}
    }

    func toCSV(a: [[String]]) -> String {
        return join("\n", a.map { join(",", $0.map { e in
            contains(e) { contains("\n\",", $0) } ?
                "\"" + e.stringByReplacingOccurrencesOfString("\"", withString: "\"\"", options: nil, range: nil) + "\"" : e
            })}) + "\n"
    }

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

        switch result.value {
        case MFMailComposeResultCancelled.value:
            println("Email Send Cancelled")
            break
        case MFMailComposeResultSaved.value:
            println("Email Saved as a Draft")
            break
        case MFMailComposeResultSent.value:
            println("Email Sent Successfully")
            break
        case MFMailComposeResultFailed.value:
            println("Email Send Failed")
            break
        default:
            break
        }

        self.dismissViewControllerAnimated(true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

・CSVの文字列を作成する(以下のコード参照)

func toCSV(a: [[String]]) -> String {
     return join("\n", a.map { join(",", $0.map { e in
         contains(e) { contains("\n\",", $0) } ?
             "\"" + e.stringByReplacingOccurrencesOfString("\"", withString: "\"\"", options: nil, range: nil) + "\"" : e
            })}) + "\n"
}

そして、
以下のような実行結果になります。
re1.png

メール画面の下の方にsample.csvというCSVファイルが添付されているのが確認出来ます。
re2.png

メール画面でsample.csvをクリックすることが出来ないため、
一度メールを送信して、
受信先でデータの中身を確認しなければなりません。

完成版ソースコード

https://github.com/chankei1/CSVAttachedToMailer
上記のGitHubに載っています。
前回の記事(【Swift】アプリ内でメーラーを起動しメール送信するやり方)で紹介したコード(メールアドレスの自動入力や画像表示など)も含んでいます。

※しかし、関数を使用したため若干、
 前回の記事とコードが違いますが、
 実行結果は同じです。

githubに載せているコードは今回使用したコードになっています。

おわりに

これで、アプリ内で作成したデータをCSVファイルにして、
メール送信させることが出来ました。

参考サイト

「SwiftによるCSVファイルの生成方法」
URL:http://ja.stackoverflow.com/questions/5668/swift%E3%81%AB%E3%82%88%E3%82%8Bcsv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E6%96%B9%E6%B3%95
「[iPhoneアプリ/Swift]csvファイルの作成方法」
URL:https://teratail.com/questions/6070
「[Swift]ファイルをメールに自動添付させる方法」
URL:https://teratail.com/questions/6071

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away