Unityで画像を添付したMailを送信する方法ですが、下記ページを参考に実装しました。
【C#】MailKit でメールを送信する方法
どうもありがとうございました!
実装いた際に躓いたのが、PC上ではそのまま動いたのですが、Android上では非同期の処理を使うと送信ができませんでした。そこで、メール送信処理は非同期をやめて、Unityの別スレッドで送信することで実現しました。理由が分かる方がいたら教えて頂けるとありがたいです。
なお、UnityでMailkitを使えるようにするために、Nugetを導入して、その後NugetパッケージからMailKitを導入してあるのが前提になります。
※別スレッドでメール送信している最中に、contextを使ってUIを更新しています。
- public class Mail {
- //送信者名
- public string NameFrom { get; set; }
- //宛先名
- public string NameTo { get; set; }
- //送信者アドレス
- public string AddressFrom { get; set; }
- //宛先アドレス
- public string AddressTo { get; set; }
- //件名
- public string Subject { get; set; }
- //本文
- public string BodyText { get; set; }
- //SMTPサーバ
- public string SmtpServer { get; set; }
- //ポート番号
- public int Port { get; set; }
- //サーバ認証ユーザ名
- public string AuthUserName { get; set; }
- //サーバ認証パスワード
- public string AuthPassWord { get; set; }
- public async void SendMail(string filePath,SynchronizationContext context) {
- var attachment = new MimeKit.MimePart(“image/jpg”);
- attachment.Content = new MimeKit.MimeContent(System.IO.File.OpenRead(filePath));
- attachment.ContentDisposition = new MimeKit.ContentDisposition();
- attachment.ContentTransferEncoding = MimeKit.ContentEncoding.Base64;
- attachment.FileName = System.IO.Path.GetFileName(filePath);
- var message = new MimeKit.MimeMessage();
- // 送信者
- message.From.Add(new MimeKit.MailboxAddress(NameFrom, AddressFrom));
- // 宛先
- message.To.Add(new MimeKit.MailboxAddress(NameTo, AddressTo));
- //CC
- //message.Cc.Add(new MimeKit.MailboxAddress(NameCC, AdressCC));
- // タイトル
- message.Subject = Subject;
- // 開発用のSMTPサーバが暗号化に対応していないときは、次の行を追加する
- //smtpClient.ServerCertificateValidationCallback = (s, c, h, e) => true;
- // 本文
- var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Text);
- textPart.Text = BodyText;
- var multipart = new MimeKit.Multipart(“mixed”);
- multipart.Add(textPart);
- multipart.Add(attachment);
- message.Body = multipart;
- using (var smtpClient = new MailKit.Net.Smtp.SmtpClient()) {
- try {
- context.Post(__ => {
- GameObject.Find(“TextMail”).GetComponent<Text>().text = ”接続”;
- }, null);
- //await smtpClient.ConnectAsync(SmtpServer, Port); // 接続
- smtpClient.Connect(SmtpServer, Port); // 接続
- context.Post(__ => {
- GameObject.Find(“TextMail”).GetComponent<Text>().text = ” 認証”;
- }, null);
- //await smtpClient.AuthenticateAsync(AuthUserName, AuthPassWord); // 認証
- smtpClient.Authenticate(AuthUserName, AuthPassWord); // 認証
- context.Post(__ => {
- GameObject.Find(“TextMail”).GetComponent<Text>().text = ”送信”;
- }, null);
- //await smtpClient.SendAsync(message); // 送信
- smtpClient.Send(message); // 送信
- context.Post(__ => {
- GameObject.Find(“TextMail”).GetComponent<Text>().text = ”切断”;
- }, null);
- //await smtpClient.DisconnectAsync(true); // 切断
- smtpClient.Disconnect(true); //usingだから不要?
- attachment.Content.Stream.Dispose();//これがないと添付ファイルがロックされて削除しようとエラーになる
- } catch (Exception ex) {
- throw new Exception();
- }
- }
- }
- }
以下、送信をする処理です。
- var context = SynchronizationContext.Current;
- Task.Run(() => {
- // 別スレッドでやりたい処理
- var mail = new Mail() {
- NameFrom = “*********”,
- AddressFrom = “*********”,
- NameTo = “*********”,
- AddressTo = “*********”,
- Subject = “*********”,
- BodyText = “*********”,
- SmtpServer = “smtp.gmail.com”,//GmailのSMTPを使って送信
- //Port = 587,
- Port = 465,//常時SSL
- AuthUserName = “*********”,
- AuthPassWord = “*********”,
- };
- //メール送信
- mail.SendMail(”画像ファイルのパス”, context);
- context.Post(__ => {
- //送信完了後 メインスレッドにて
- }, null);
- });