• mono中发送邮件并保存本次收件人的地址


    在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  设置附件
                    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邮箱,预览时会乱码!在大神(博客地址)的帮助下,解决了这个问题!解决方案如下:

    QQ图片20130913164100

    然后在发送邮件的时候,附件相关代码要这样改动:

    NSData data = NSData.FromString(messageBody, NSStringEncoding.UTF8); 
    //替换为
    byte[] messageBytes=System.Text.Encoding.GetEncoding("GB2312").GetBytes(messageBody);
    NSData data = NSData.FromArray(messageBytes);

    喜欢这篇文章就推荐下吧!您的支持是我继续的最大动力!

  • 相关阅读:
    Vue 项目启动抛出 Error/ No PostCSS Config found in
    js sort排序
    layui table合计但是未计算的解决
    vue项目echarts画布删除历史数据重新渲染数据
    layui 数据返回但是table表格未渲染出来的问题
    Spring Boot实践——AOP实现
    IntelliJ IDEA—IDEA2018.1激活方式
    Spring Boot实践——统一异常处理
    Spring Boot实践——Filter实现
    Spring Boot实践——三种拦截器的创建
  • 原文地址:https://www.cnblogs.com/flowwind/p/3308475.html
Copyright © 2020-2023  润新知