質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2535閲覧

SwiftでMailCore2を動かそうとしましたが必要なコードが分からずBuildに失敗してしまします...

BONO99

総合スコア3

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/10/03 13:10

前提・実現したいこと

現在卒研の為、ゼロからiOSのアプリ開発をしている中で、MailCore2というライブラリを使ってみようとしました。
インターネットで見つけたサンプルのコードをコピペしてそのまま実行して動きを見てみたかったのですが、あまりにも初心者のため、プレビュー部分のコードが書けませんでした。その結果、プレビューのコード部分にエラーが発生してしまい、行き詰まっています。
プログラミングのいろはのいの字もわかっていません。ごめんなさい。
プログラミングの先輩方に教えを乞いたいと思い、質問させていただきます。
おそらく何か必要なコードが足りていないのではないかと推測しています…

発生している問題・エラーメッセージ

Cannot find 'ContentView' in scope

該当のソースコード

Swift

1import SwiftUI 2import UIKit 3 4class ViewController: UIViewController ,UITextViewDelegate{ 5 6 @IBOutlet weak var buttonSelect: UIButton! 7 @IBOutlet weak var textview: UITextView! 8 9 let master_mail = "××××××@gmail.com" 10 let master_pass = "××××××××××" 11 12 13 @IBAction func ButtonSelect(_ sender: Any) { 14 sendEmail(message: textview.text) 15 } 16 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 textview.keyboardType = .default 21 textview.delegate = self 22 } 23 24 func sendEmail(message:String) 25 { 26 let smtpSession = MCOSMTPSession() 27 smtpSession.hostname = "smtp.gmail.com" 28 smtpSession.username = "××××××@gmail.com" 29 smtpSession.password = "××××××" 30 smtpSession.port = 465 31 smtpSession.isCheckCertificateEnabled = false 32 smtpSession.authType = MCOAuthType.saslPlain 33 smtpSession.connectionType = MCOConnectionType.TLS 34 smtpSession.connectionLogger = {(connectionID, type, data) in 35 if data != nil { 36 if let string = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){ 37 NSLog("Connectionlogger: (string)") 38 } 39 } 40 } 41 42 let builder = MCOMessageBuilder() 43 builder.header.to = [MCOAddress(displayName: "××××××", mailbox: "××××××")!] 44 builder.header.from = MCOAddress(displayName: "××××××", mailbox: "××××××m") 45 builder.header.subject = "タイトル" 46 builder.htmlBody = message 47 48 let rfc822Data = builder.data() 49 let sendOperation = smtpSession.sendOperation(with: rfc822Data!) 50 sendOperation?.start { (error) -> Void in 51 if (error != nil) { 52 NSLog("Error sending email: (String(describing: error))") 53 } else { 54 NSLog("Successfully sent email!") 55 } 56 } 57 58 } 59 60} 61 62 63 64struct ContentView_Previews: PreviewProvider { 65 static var previews: some View { 66 ContentView() 67 } 68}

試したこと

参考にしたコードが2019年の記事のコードであったため、wrapのエラーなどが起きたため、自分で直そうといじってしまいました。サンプルコードのコピペから始めたため、コード内容が理解できていません。

補足情報(FW/ツールのバージョンなど)

Xcode13,iOS15
参考にしたサイト(https://develop.hateblo.jp/entry/ios-mail-auto-send)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/10/03 17:23

gmail のパスワードをアプリに書き込むなんてセキュリティ的にあり得ないと思いますが、それはさておき、SwiftUI のアプリに UIViewController を組み込みたいなら UIViewControllerRepresentable を使う必要があるかと…。
BONO99

2021/10/04 05:25

すみません。今回はパブリックにしない趣味範囲のものなのでセキュリティは大目に見てください… なるほど、UIViewControllerRepresentableですか。調べてやってみます。 アドバイス有難うございました。
hoshi-takanori

2021/10/04 05:56

というか、メール送信処理は sendEmail メソッドで完結しているので、SwiftUI に組み込むならこのメソッドだけで良いのでは。
BONO99

2021/10/04 09:34

後々に特定の条件を達成したら自動的にメールを送信するアプリを作ろうと考えておりまして、sendEmailメソッドですと"送信ボタンを押す"というワンステップ挟んでしまうようなので、今回は自動化のためにMailcore2を選んでしまいました…
hoshi-takanori

2021/10/04 11:16

何か誤解がある気がしますが、質問文中の sendEmail メソッドは MailCore2 を使って自動的にメール送信するもので、質問文中のコードでは送信ボタンが押された時に sendEmail を呼んでメールを送信するようになってると思いますが、特定の条件を達成した時に呼べば自動的にメールが送られるはず…。
BONO99

2021/10/04 12:39

理解が乏しくすみません。今回SwiftUI上でMailcore2を利用しようと考えていましたが、無知の為、どの部分を切り取ったら良いのかわからず、それなら一回公開されているコード全部で動かしてみようと思っていました。 間違っているかもしれないのですが、func sendEmail(message:String)以降のコードだけをそのまま使ってメール送信が実行されるでしょうか?そうなるとSwiftUIですぐに実装できるボタンに結び付けることが出来る…UIViewControllerRepresentablを使わないで済むなら初心者にもありがたいのですが…そう上手くはいかないですよね。
hoshi-takanori

2021/10/04 15:02

> func sendEmail(message:String)以降のコードだけをそのまま使ってメール送信が実行されるでしょうか? そう言ってるつもりなんですが…。(試してないので、もしも動かなかったらごめんなさい。)
BONO99

2021/10/05 09:06

ありがとうございます。貴方様のお力もあり、解決いたしました。とても感謝しています!
guest

回答1

0

自己解決

解決できました

SwiftUIに適した形でメールの送信部分のみを組み込むという教えのもとにもう1度調べたところ、さらに良さそうなサンプルコードが載っているサイトを発見しました。
https://stackoverflow.com/questions/31485359/sending-mailcore2-plain-emails-in-swift)
そのまま使うと、いくつかのエラーが発生したのですが、自動Fixのボタンのみで解決できました。

以下が送信まで成功したコードになります。

Swift

1import SwiftUI 2 3struct ContentView: View { 4 var body: some View { 5 Button(action: { 6 let smtpSession = MCOSMTPSession() 7 smtpSession.hostname = "smtp.gmail.com" 8 smtpSession.username = "送信元@gmail.com" 9 smtpSession.password = "パスワード" 10 smtpSession.port = 465 11 smtpSession.authType = MCOAuthType.saslPlain 12 smtpSession.connectionType = MCOConnectionType.TLS 13 smtpSession.connectionLogger = {(connectionID, type, data) in 14 if data != nil { 15 if let string = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){ 16 NSLog("Connectionlogger: (string)") 17 } 18 } 19 } 20 21 let builder = MCOMessageBuilder() 22 builder.header.to = [MCOAddress(displayName: "送信先", mailbox: "送信先@gmail.com")!] 23 builder.header.from = MCOAddress(displayName: "送信元", mailbox: "送信元@gmail.com") 24 builder.header.subject = "タイトル" 25 builder.htmlBody = "本文" 26 27 let rfc822Data = builder.data() 28 let sendOperation = smtpSession.sendOperation(with: rfc822Data) 29 sendOperation!.start { (error) -> Void in 30 if (error != nil) { 31 NSLog("Error sending email: (String(describing: error))") 32 } else { 33 NSLog("Successfully sent email!") 34 } 35 } 36 }) { 37 Text("メール送信") 38 } 39 } 40} 41 42struct ContentView_Previews: PreviewProvider { 43 static var previews: some View { 44 ContentView() 45 } 46}

MailCore2はオブジェクトCで動くため、ヘッダー用のファイルも作りました

#ifndef MailCore2_Bridging_h #define MailCore2_Bridging_h #import <MailCore/MailCore.h> #endif /* MailCore2_Bridging_h */

今回ココアポッドを使ってMailCore2を導入しています。
ターミナルを使った途中経過は色々なサイトに載っている通りにやって問題なかったです。

今回知恵を貸してくださった方にとても感謝しています:)

投稿2021/10/05 09:05

編集2021/10/05 09:10
BONO99

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問