SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.iOS Eメール送信

【 Xamarin 記事一覧 】


iOSの機能を利用した送信

(1)テキストのみ

f:id:furuya02:20140608115328p:plain:w150:left
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)添付ファイル

f:id:furuya02:20140608115329p:plain:w150:left
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");

直接送信

f:id:furuya02:20140608115548p:plain:w150:leftf:id:furuya02:20140608115549p:plain:w150:left
システムの機能を利用する場合、ユーザが「Send」ボタンを押す必要がありますが、これを隠ぺいし、バックグラウンドで直接送信したい時は、Objective-Cでは「FrontierMail」などのライブラリの使用が紹介されています。
しかし、ここではC#なので・・・ややこしい事は考えないで、あっさりとSystem.Net.Mail.SmtpClientを使いましょう。
下記のサンプルは、Xamarin.AndroidでEメールを直接送信した例とまったく同じです。

「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();
}

【 Xamarin 記事一覧 】