【Unity】Mailkitで画像を添付したメールを送信する方法

Unityで画像を添付したMailを送信する方法ですが、下記ページを参考に実装しました。

【C#】MailKit でメールを送信する方法

どうもありがとうございました!

実装いた際に躓いたのが、PC上ではそのまま動いたのですが、Android上では非同期の処理を使うと送信ができませんでした。そこで、メール送信処理は非同期をやめて、Unityの別スレッドで送信することで実現しました。理由が分かる方がいたら教えて頂けるとありがたいです。

なお、UnityでMailkitを使えるようにするために、Nugetを導入して、その後NugetパッケージからMailKitを導入してあるのが前提になります。

※別スレッドでメール送信している最中に、contextを使ってUIを更新しています。

  1. public class Mail {
  2.     //送信者名
  3.     public string NameFrom { get; set; }
  4.     //宛先名
  5.     public string NameTo { get; set; }
  6.     //送信者アドレス
  7.     public string AddressFrom { get; set; }
  8.     //宛先アドレス
  9.     public string AddressTo { get; set; }
  10.     //件名
  11.     public string Subject { get; set; }
  12.     //本文
  13.     public string BodyText { get; set; }
  14.     //SMTPサーバ
  15.     public string SmtpServer { get; set; }
  16.     //ポート番号
  17.     public int Port { get; set; }
  18.     //サーバ認証ユーザ名
  19.     public string AuthUserName { get; set; }
  20.     //サーバ認証パスワード
  21.     public string AuthPassWord { get; set; }
  22.     public async void SendMail(string filePath,SynchronizationContext context) {
  23.         var attachment = new MimeKit.MimePart(“image/jpg”);
  24.         attachment.Content = new MimeKit.MimeContent(System.IO.File.OpenRead(filePath));
  25.         attachment.ContentDisposition = new MimeKit.ContentDisposition();
  26.         attachment.ContentTransferEncoding = MimeKit.ContentEncoding.Base64;
  27.         attachment.FileName = System.IO.Path.GetFileName(filePath);
  28.         var message = new MimeKit.MimeMessage();
  29.         // 送信者
  30.         message.From.Add(new MimeKit.MailboxAddress(NameFrom, AddressFrom));
  31.         // 宛先
  32.         message.To.Add(new MimeKit.MailboxAddress(NameTo, AddressTo));
  33.         //CC
  34.         //message.Cc.Add(new MimeKit.MailboxAddress(NameCC, AdressCC));
  35.         // タイトル
  36.         message.Subject = Subject;
  37.         // 開発用のSMTPサーバが暗号化に対応していないときは、次の行を追加する
  38.         //smtpClient.ServerCertificateValidationCallback = (s, c, h, e) => true;
  39.         // 本文
  40.         var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Text);
  41.         textPart.Text = BodyText;
  42.         var multipart = new MimeKit.Multipart(“mixed”);
  43.         multipart.Add(textPart);
  44.         multipart.Add(attachment);
  45.         message.Body = multipart;
  46.         using (var smtpClient = new MailKit.Net.Smtp.SmtpClient()) {
  47.             try {
  48.                 context.Post(__ => {
  49.                     GameObject.Find(“TextMail”).GetComponent<Text>().text = ”接続”;
  50.                 }, null);
  51.                 //await smtpClient.ConnectAsync(SmtpServer, Port); // 接続
  52.                 smtpClient.Connect(SmtpServer, Port); // 接続
  53.                 context.Post(__ => {
  54.                     GameObject.Find(“TextMail”).GetComponent<Text>().text = ” 認証”;
  55.                 }, null);
  56.                 //await smtpClient.AuthenticateAsync(AuthUserName, AuthPassWord); // 認証
  57.                 smtpClient.Authenticate(AuthUserName, AuthPassWord); // 認証
  58.                 context.Post(__ => {
  59.                     GameObject.Find(“TextMail”).GetComponent<Text>().text = ”送信”;
  60.                 }, null);
  61.                 //await smtpClient.SendAsync(message); // 送信
  62.                 smtpClient.Send(message); // 送信
  63.                 context.Post(__ => {
  64.                     GameObject.Find(“TextMail”).GetComponent<Text>().text = ”切断”;
  65.                 }, null);
  66.                 //await smtpClient.DisconnectAsync(true); // 切断
  67.                 smtpClient.Disconnect(true); //usingだから不要?
  68.                 attachment.Content.Stream.Dispose();//これがないと添付ファイルがロックされて削除しようとエラーになる
  69.             } catch (Exception ex) {
  70.      throw new Exception();
  71.             }
  72.         }
  73.     }
  74. }

 

以下、送信をする処理です。

  1. var context = SynchronizationContext.Current;
  2. Task.Run(() => {
  3.     // 別スレッドでやりたい処理
  4.     var mail = new Mail() {
  5.         NameFrom = “*********”,
  6.         AddressFrom = “*********”,
  7.         NameTo = “*********”,
  8.         AddressTo = “*********”,
  9.         Subject = “*********”,
  10.         BodyText = “*********”,
  11.         SmtpServer = “smtp.gmail.com”,//GmailのSMTPを使って送信
  12.         //Port = 587,
  13.         Port = 465,//常時SSL
  14.         AuthUserName = “*********”,
  15.         AuthPassWord = “*********”,
  16.     };
  17.     //メール送信
  18.     mail.SendMail(”画像ファイルのパス”, context);
  19.     context.Post(__ => {
  20.         //送信完了後 メインスレッドにて
  21.     }, null);
  22. });

 

 

 

タイトルとURLをコピーしました