在ios端mono开发中,发送邮件可以选择调用ios原生email程序。有两种方式实现这种功能,一是程序跳转到ipad中email程序,另外一种是将发送邮件的界面在自己应用里弹出。
首先第一种方式的代码:
string sendEmail = "mailto:收件人邮箱地址?cc=发件人邮箱地址&subject=主题&body=邮件内容"; UIApplication.SharedApplication.OpenUrl(NSUrl.FromString(sendEmail));
这种方式会直接打开ipad本地email程序,但这种方式有个缺点是无法传送附件,并且会离开当前应用。
第二种方式,是可以发送附件并且可以在本应用中进行,mono中已经有封装好的类MFMailComposeViewController去调用。
如果你ipad未设置邮箱账户,或者你的邮箱账户在设置里未显示激活状态,则直接弹出此窗体会报错。所以在调用代码的时候,要先判断MFMailComposeViewController.CanSendMail是否为true,如果为false的话,可以通过用第一种方式把设置邮箱账户的界面弹出来。在发送的时候,通过读取保存在xml中的收件人信息,设置本次收件人的地址,这样用户就不需要每次都填写收件人了。具体代码如下:
/// <summary> /// 发送邮件 /// </summary> /// <param name="subject">邮件主题.</param> /// <param name="messageBody">邮件内容</param> protected void SendEmail(string subject, string messageBody) { //首先判断是否能发送邮件,如果邮箱里已经设置邮箱账户,并激活则为true //模拟器里为true if (!MFMailComposeViewController.CanSendMail) { MFMailComposeViewController mf = new MFMailComposeViewController(); mf.MailComposeDelegate = new MailComposeDelegate(); //设置发送完成后的委托事件 mf.SetSubject(subject);// 设置邮件主题 #region 获取上次发送邮件后保存在xml中的收件人 XmlDocument xmlDoct = new XmlDocument(); string xmlpath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "SysConfiguration.xml"); xmlDoct.Load(xmlpath); if (xmlDoct != null) { XmlNode xmlNodeContinue = xmlDoct.SelectSingleNode("Configuration/MailReceiver"); if (xmlNodeContinue != null) { string strReceiver = xmlNodeContinue.InnerText; mf.SetToRecipients(strReceiver.Split(',')); //设置收件人 } } #endregion; mf.SetMessageBody("说明: 请下载附件进行打印 ", true); //设置邮件内容 #region 设置附件 CFString cf = new CFString(""); NSData data = NSData.FromString(messageBody, NSStringEncoding.UTF8); mf.AddAttachmentData(data, @"text/html", subject + ".html"); #endregion //弹出发送邮件窗体 this.PresentModalViewController(mf, true); } else { Tapku.TKAlertCenter.DefaultCenter.PostAlert("无发件人,请先在系统设置里添加邮箱账户"); //这里也会调用ipad email应用 弹出设置邮箱账户的窗体 string sendEmail = "mailto:xianchagnzhifa@163.com"; UIApplication.SharedApplication.OpenUrl(NSUrl.FromString(sendEmail)); } }
这时候点击发送或者取消,将会触发邮件完成事件,在完成的时候,通过递归遍历MFMailComposeViewController 中的控件(均继承自UIView),找到收件人的UITextField,保存收件人的地址到xml。
递归遍历代码:
///设置发送完成后的委托事件 class MailComposeDelegate:MFMailComposeViewControllerDelegate { static string strReceiver = string.Empty; //保存收件人的Email地址 void FindUITextField(UIView view) { if (view is UITextField) { //找到发件人的UITextField控件 if ((view as UITextField).Text.Contains("@")) { strReceiver = (view as UITextField).Text; } return; } if (view.Subviews.GetCount() > 0) { foreach (UIView subView in view.Subviews) { //进行递归遍历 FindUITextField(subView); } } } ///发送邮件或取消发送后的完成事件 public override void Finished(MFMailComposeViewController controller, MFMailComposeResult result, NSError error) { } }
保存收件人并响应完成发送具体事件的操作实现代码如下:
///发送邮件或取消发送后的完成事件 public override void Finished(MFMailComposeViewController controller, MFMailComposeResult result, NSError error) { //如果邮件发送成功,保存此次收件人的信息 if (result == MFMailComposeResult.Sent) { FindUITextField(controller.View);//递归得到收件人Email地址 //保存本次发件人的地址 if (!string.IsNullOrEmpty(strReceiver)) { XmlDocument xmlDoct = new XmlDocument(); string xmlpath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "SysConfiguration.xml"); xmlDoct.Load(xmlpath); if (xmlDoct != null) { XmlNode xmlNodeContinue = xmlDoct.SelectSingleNode("Configuration/MailReceiver"); if (xmlNodeContinue != null) { xmlNodeContinue.InnerText = strReceiver; xmlDoct.Save(xmlpath); } } } } string message = string.Empty; bool flag = false; switch (result) { case MFMailComposeResult.Cancelled: message = "邮件未保存到草稿箱"; flag = true; break; case MFMailComposeResult.Failed: message = "发送失败:" + error.ToString(); break; case MFMailComposeResult.Saved: message = "已保存到草稿箱"; flag = true; break; case MFMailComposeResult.Sent: message = "发送成功"; flag = true; break; default: break; } if (!string.IsNullOrEmpty(message)) { Tapku.TKAlertCenter.DefaultCenter.PostAlert(message); } if (flag) { //关掉发送邮件的窗体 controller.DismissModalViewControllerAnimated(true); } } }
另外在mono中如果想读取和修改xml,不能讲xml文件放在程序目录文件夹里面,要把它copy到系统个人文件夹下面,应该是苹果权限控制的比较死的原因。具体操作代码如下:每次程序启动的时候会执行检测文件是否存在,不存在则拷贝到personal文件夹下面。
string SystemSetPath=System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),"SysConfiguration.xml"); if(!System.IO.File.Exists(SystemSetPath)) { System.IO.File.Copy("SysConfiguration.xml",SystemSetPath); }
本次xml的结构如下:
<?xml version="1.0" encoding="UTF-8" ?> <Configuration> <MailReceiver></MailReceiver> </Configuration>
另外,附件(html格式)发送到qq邮箱,预览时会乱码,如果发送到网易不会乱码,下载到本地打开也不会乱码,有大神知道的还望给予指导!不胜感激!
喜欢这篇文章就推荐下吧!您的支持是我继续的最大动力!