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

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

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

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

・csvにデータを入れる
　`csvData.append(["日付","データ１","データ２","データ３","データ４"])`

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

```swift
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(["日付","データ１","データ２","データ３","データ４"])
        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の文字列を作成する(以下のコード参照)

```swift
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](https://qiita-image-store.s3.amazonaws.com/0/75241/bf2c2d98-5cfe-e761-9abf-bc75b09c65f4.png)

メール画面の下の方に**sample.csv**というCSVファイルが添付されているのが確認出来ます。
![re2.png](https://qiita-image-store.s3.amazonaws.com/0/75241/eb3a8f11-c56f-f736-2f04-806a4af85e5c.png)

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

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

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

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