Inheritance: Universe.Framework.Modules.IDataTransferable
        public void InsertEmail (Email email)
        {
            if (m_doRemoteOnly)
            {
                DoRemote (email);
                return;
            }

            GenericUtils.AddGeneric (email.toPrimID, "Emails", UUID.Random ().ToString (), email.ToOSD (), GD);
        }
        public void InsertEmail (UUID to, Email email)
        {
            // It's tempting to create the queue here.  Don't; objects which have
            // not yet called GetNextEmail should have no queue, and emails to them
            // should be silently dropped.

            lock (m_MailQueues) {
                if (m_MailQueues.ContainsKey (to)) {
                    if (m_MailQueues [to].Count >= m_MaxQueueSize) {
                        // fail silently
                        return;
                    }

                    lock (m_MailQueues [to]) {
                        m_MailQueues [to].Add (email);
                    }
                }
            }
        }
        /// <summary>
        ///     SendMail function utilized by llEMail
        /// </summary>
        /// <param name="objectID"></param>
        /// <param name="address"></param>
        /// <param name="subject"></param>
        /// <param name="body"></param>
        /// <param name="scene">Can be null</param>
        public void SendEmail (UUID objectID, string address, string subject, string body, IScene scene)
        {
            //Check if address is empty
            if (address == string.Empty)
                return;

            bool isEMailStrictMatch = Utilities.IsValidEmail (address);
            if (!isEMailStrictMatch) {
                MainConsole.Instance.Error ("[Email]: REGEX Problem in EMail Address: " + address);
                return;
            }
            // Check if subject + body = max size (4096) Byte
            if ((subject.Length + body.Length) > m_MaxEmailSize) {
                MainConsole.Instance.Error ("[Email]: subject + body larger than limit of " + m_MaxEmailSize + " bytes");
                return;
            }

            string LastObjectName = string.Empty;
            string LastObjectPosition = string.Empty;
            string LastObjectRegionName = string.Empty;

            if (scene != null)
                resolveNamePositionRegionName (objectID, out LastObjectName, out LastObjectPosition,
                                              out LastObjectRegionName, scene);

            if (!address.EndsWith (m_InterObjectHostname, StringComparison.Ordinal)) {
                bool didError = false;
                if (!m_localOnly) {
                    // regular email, send it out
                    Thread threadSendMail;
                    threadSendMail = new Thread (delegate () {
                        try {
                            // Create EmailMessage
                            string fromEmailAddress;

                            if (scene != null && objectID != UUID.Zero)
                                fromEmailAddress = objectID + "@" + m_HostName;
                            else
                                fromEmailAddress = "no-reply@" + m_HostName;

                            var fromAddress = new MailAddress (fromEmailAddress);
                            var toAddress = new MailAddress (address);

                            if (scene != null) {
                                // If Object Null Don't Include Object Info Headers (Offline IMs)
                                if (objectID != UUID.Zero)
                                    body = body + "\nObject-Name: " + LastObjectName +
                                    "\nRegion: " + LastObjectRegionName + "\nLocal-Position: " +
                                    LastObjectPosition + "\n\n";
                            }

                            //Config SMTP Server
                            var smtpServer = new SmtpClient ();
                            smtpServer.Host = SMTP_SERVER_HOSTNAME;
                            smtpServer.Port = SMTP_SERVER_PORT;
                            smtpServer.EnableSsl = (SMTP_SERVER_PORT == 587);
                            smtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;
                            smtpServer.UseDefaultCredentials = false;
                            smtpServer.Credentials = new NetworkCredential (SMTP_SERVER_LOGIN, SMTP_SERVER_PASSWORD);
                            smtpServer.Timeout = 15000;

                            // Beware !! This effectively ignores the ssl validation and assumes that all is correct 
                            // For Mono, requires importation of the Google smtpd certificate (see SMTPEmail.ini)
                            // Possibly not needed for Windows
                            //ServicePointManager.ServerCertificateValidationCallback = 
                            //    delegate(object sim, X509Certificate certificate, X509Chain chain SslPolicyErrors sslPolicyErrors)
                            //{ return true; };

                            // if ((!SMTP_SERVER_MONO_CERT) && (Utilities.IsLinuxOs))
                            ServicePointManager.ServerCertificateValidationCallback = delegate {
                                return true;
                            };

                            // create the message
                            var emailMessage = new MailMessage (fromAddress, toAddress);
                            emailMessage.Subject = subject;
                            emailMessage.Body = body;

                            // sample for adding attachments is needed sometime :)
                            //if File(Exist(fullFileName))
                            //{
                            //    var mailAttactment = new Attachment(fullFileName);
                            //    emailMessage.Attachments.Add(mailAttactment);
                            //}

                            // send the message
                            try {
                                smtpServer.Send (emailMessage);
                            } catch (SmtpException ex) {
                                SmtpStatusCode status = ex.StatusCode;
                                if (status == SmtpStatusCode.Ok)
                                    MainConsole.Instance.Info ("[Email]: EMail sent to: " + address + " from object: " +
                                    fromEmailAddress);
                                else
                                    MainConsole.Instance.Info ("[Email]: EMail error sending to: " + address + " from object: " +
                                    fromEmailAddress + " status: " + ex.Message);
                            }
                            smtpServer.Dispose ();
                        } catch (Exception e) {
                            MainConsole.Instance.Error ("[Email]: DefaultEmailModule Exception: " + e.Message);
                            didError = true;
                        }
                    });

                    threadSendMail.IsBackground = true;
                    threadSendMail.Start ();

                }
                if (((didError) || (m_localOnly)) && (scene != null)) {
                    // Notify Owner
                    ISceneChildEntity part = findPrim (objectID, out LastObjectRegionName, scene);
                    if (part != null) {
                        IScenePresence sp = scene.GetScenePresence (part.OwnerID);
                        if ((sp != null) && (!sp.IsChildAgent)) {
                            sp.ControllingClient.SendAlertMessage ("llEmail: email module not configured for outgoing emails");
                        }
                    }
                }
            } else {
                // inter object email, keep it in the family
                string guid = address.Substring (0, address.IndexOf ("@", StringComparison.Ordinal));
                UUID toID = new UUID (guid);

                if (IsLocal (toID, scene)) {
                    // object in this region
                    InsertEmail (toID, new Email {
                        time =((int)((DateTime.UtcNow - new DateTime (1970, 1, 1, 0, 0, 0)).TotalSeconds)).ToString (CultureInfo.InvariantCulture),
                        subject = subject,
                        sender = objectID + "@" + m_InterObjectHostname,
                        message = "Object-Name: " + LastObjectName + "\nRegion: " + LastObjectRegionName + "\nLocal-Position: " +
                            LastObjectPosition + "\n\n" + body,
                        toPrimID = toID
                    });
                } else {
                    // object on another region

                    Email email = new Email {
                        time =((int)((DateTime.UtcNow - new DateTime (1970, 1, 1, 0, 0, 0)).TotalSeconds)).ToString (CultureInfo.InvariantCulture),
                        subject = subject,
                        sender = objectID + "@" + m_InterObjectHostname,
                        message = body,
                        toPrimID = toID
                    };
                    IEmailConnector conn = Framework.Utilities.DataManager.RequestPlugin<IEmailConnector> ();
                    conn.InsertEmail (email);
                }
            }
        }
        public void InsertEmail(Email email)
        {
            object remoteValue = DoRemote(email);
            if (remoteValue != null || m_doRemoteOnly)
                return;

            GenericUtils.AddGeneric(email.toPrimID, "Emails", UUID.Random().ToString(),
                                    email.ToOSD(), GD);
        }