テクノモンキーのアプリ開発日記

テクノモンキーの開発ブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsやアプリ開発に役立つ情報を発信します。

【iOS】アプリからgmailにテキストを自動送信させる方法(サーバーを使わない)

今僕が公開しているほとんどのアプリでは、

「ユーザーに追加要望や不具合報告を送ってもらう」

ためにメーラーを立ち上げる機能を実装してます。



この機能を実装してからユーザーさんの声をアプリに反映させやすくなりました。

ただ、メーラーを立ち上げてユーザーに送ってもらう方法だと、以下のような問題点があるように思います。

  • ユーザー側のメールアドレスを開発者に知らせることになる
  • ユーザー目線だと、わざわざメールを送るのは面倒
  • 開発者目線だと、毎回ユーザーとのメールやりとりをするのも結構大変


上記のような問題点を改善する為の策としては、

ユーザーから不具合報告や追加要望をアプリから簡単に行えるという点で、

サーバーにテキストを送信できるAPIを用意するのがベストかなと思います。



(ユーザーがストアのレビューで不具合報告をするようになると、新規ユーザーにはあまり見た目がよろしくないので、不具合系は別のところで収集した方がいい)



ただ、APIを用意するとなると、サーバーコストも掛かってくるのが悩みどころです。

サーバーを用意せずにユーザーからの声をこちらで受け取る方法を考えてみたところ、

アプリからgmailに自動送信できる方法を思いついたので、メモとして残しておきたいと思います。


iOS】アプリからgmailにテキストを送信させる方法(サーバーを使わない)


まず、iOSアプリにメール送信機能を付与するために、MailCore2というライブラリを導入します。
github.com

CocoaPodsを使えば簡単に導入できます。

pod 'mailcore2-ios', '~> 0.6'

【注意点】MailCore2はObjective-Cのライブラリなので、swiftで利用するためにはBridging-Header.hを使用する必要があります。

//MailApp-Bridging-Header.h

#ifndef MailApp_Bridging_Header_h
#define MailApp_Bridging_Header_h

#import <MailCore/MailCore.h>
#endif 

MailCore2のライブラリが導入できたら、以下のようなプログラムを書きます。
下記の例は、アプリ上のTextViewに入力したテキストをgmailアカウントに送信するプログラムです。


import UIKit

class ViewController: UIViewController ,UITextViewDelegate{

    @IBOutlet weak var buttonSelect: UIButton!
    @IBOutlet weak var textview: UITextView!
    
    let master_mail = "abc@gmail.com"
    let master_pass = "pass"
    
    
    @IBAction func ButtonSelect(_ sender: Any) {
        sendEmail(message: textview.text)
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textview.keyboardType = .default
        textview.delegate = self
    }

    func sendEmail(message:String)
    {
        let smtpSession = MCOSMTPSession()
        smtpSession.hostname = "smtp.gmail.com"
        smtpSession.username = master_mail
        smtpSession.password = master_pass
        smtpSession.port = 465
        smtpSession.isCheckCertificateEnabled = false
        smtpSession.authType = MCOAuthType.saslPlain
        smtpSession.connectionType = MCOConnectionType.TLS
        smtpSession.connectionLogger = {(connectionID, type, data) in
            if data != nil {
                if let string = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){
                    NSLog("Connectionlogger: \(string)")
                }
            }
        }
        
        let builder = MCOMessageBuilder()
        builder.header.to = [MCOAddress(displayName: display_name, mailbox: master_mail)]
        builder.header.from = MCOAddress(displayName: display_name, mailbox: master_mail)
        builder.header.subject = "タイトル"
        builder.htmlBody = message
        
        let rfc822Data = builder.data()
        let sendOperation = smtpSession.sendOperation(with: rfc822Data!)
        sendOperation?.start { (error) -> Void in
            if (error != nil) {
                NSLog("Error sending email: \(error)")
            } else {
                NSLog("Successfully sent email!")
            }
        }
        
    }
    
}

一応、上記のコードでメーラーを立ち上げることなく、
指定のgmailアカウントにテキストを送信できますが、動作確認中にエラーが出る場合もありました。

アカウント情報は正しいはずなのにメール送信でエラーになる場合は、Googleアカウントのセキュリティ設定により弾かれている可能性がありそうです。

そうゆう場合は、Googleアカウントの以下のページで「安全性の低いアプリのアクセス」をオンにすればメールが正常に送れるようになります。(ただし、セキュリティー的には低くなってしまうので自己責任)

【iOS】アプリからgmailにテキストを自動送信させる方法(サーバーを使わない)


上記の方法でメーラーを立ち上げずにユーザーの声を受け取ることができれば、

  • ユーザーからの新規追加要望
  • ユーザーからの不具合報告

などがより活発になりそうなので、試してみて問題なさそうだったら今後導入していこうと思います。


【追記】
Androidでのやり方は下記の記事に書きました↓
develop.hateblo.jp