Xamarin.iOS Eメール送信
iOSの機能を利用した送信
(1)テキストのみ

iOSで、システムの機能を利用したEメール送信の手順は、次のようになります。
・メール送信が可能かどうかの確認する
・MFMailComposeViewControllerのインスタンスを生成し、宛先や本文などを設定する
・Eメール画面を表示する
・Eメール画面の消去する
if (!MFMailComposeViewController.CanSendMail){//メール送信が可能かどうかの確認 return; //メール送信不能 } var mail = new MFMailComposeViewController();//インスタンスの生成 mail.SetToRecipients(new[] { "user1@example.com" });//宛先 mail.SetSubject("件名"); mail.SetMessageBody("本文", false); mail.Finished += (o, args) => { //送信処理終了時のイベント Console.WriteLine(args.Result.ToString()); // srgs.Result:戻り値 args.Controller.DismissViewController(true, null); //Eメール画面の消去 }; PresentViewController(mail, true, null);//Eメール画面の表示
送信処理終了時の戻り値は、下記のとおりです。
・MFMailComposeResult.Sent メールを送信した
・MFMailComposeResult.Saved メールを保存した
・MFMailComposeResult.Cancelled キャンセルした(メールを破棄した)
・MFMailComposeResult.Failed 失敗した
※シュミレータでは、実際にメール送信はできません。また、CanSendMailは常にtrueで、送信処理完了時はSentが返ります。
(2)添付ファイル

MFMailComposeViewControllerのインスタンスに、AddAttachmentData()で添付ファイルを指定することができます。
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "sample.png"); NSData data = NSData.FromFile(path); mail.AddAttachmentData(data, " image/png", "sample.png");
直接送信


システムの機能を利用する場合、ユーザが「Send」ボタンを押す必要がありますが、これを隠ぺいし、バックグラウンドで直接送信したい時は、Objective-Cでは「FrontierMail」などのライブラリの使用が紹介されています。
しかし、ここではC#なので・・・ややこしい事は考えないで、あっさりとSystem.Net.Mail.SmtpClientを使いましょう。
下記のサンプルは、Xamarin.AndroidでEメールを直接送信した例とまったく同じです。
図は、送信に成功した場合とエラーが発生した場合の表示です。
try { var mail = new MailMessage(); //System.Net.Mail.MailMessage mail.From = new MailAddress("user2@example.com"); mail.To.Add("user1@example.com"); mail.Subject = "件名"; mail.Body = "本文"; var smtpClient = new SmtpClient("smtp.gmail.com", 587); smtpClient.Credentials = new NetworkCredential("xxxx@gmail.com", "xxxx"); smtpClient.EnableSsl = true; ServicePointManager.ServerCertificateValidationCallback = (o, certificate, chain, errors) => true; smtpClient.Send(mail); (new UIAlertView("送信完了", "", null, "OK", null)).Show(); } catch (Exception ex) { (new UIAlertView("エラー", ex.Message, null, "OK", null)).Show(); }