Exemple #1
0
        private static void HandleDequeue()
        {
            if (_StartedThreads >= STAGING_DEQUEUE_THREADS)
            {
                return;
            }

            _StartedThreads++;

            while (true)
            {
                BasicDeliverEventArgs ea = RabbitMq.RabbitMqManager.Dequeue(RabbitMqManager.RabbitMqQueue.InboundStaging, 1, 100).FirstOrDefault();
                if (ea == null)
                {
                    Thread.Sleep(1000);
                    continue;
                }

                MtaQueuedMessage qmsg = Serialisation.Deserialise <MtaQueuedMessage>(ea.Body);
                MtaMessage       msg  = new MtaMessage(qmsg.ID, qmsg.VirtualMTAGroupID, qmsg.InternalSendID, qmsg.MailFrom, qmsg.RcptTo, string.Empty);

                RabbitMqManager.Publish(msg, RabbitMqManager.RabbitMqQueue.Inbound, true);
                RabbitMqManager.Publish(qmsg, RabbitMqManager.RabbitMqQueue.OutboundWaiting, true);
                RabbitMqManager.Ack(RabbitMqManager.RabbitMqQueue.InboundStaging, ea.DeliveryTag, false);
            }
        }
Exemple #2
0
        private void HandleDequeue()
        {
            while (!IsStopping)
            {
                BasicDeliverEventArgs ea = RabbitMq.RabbitMqManager.Dequeue(RabbitMqManager.RabbitMqQueue.InboundStaging, 1, 100).FirstOrDefault();
                if (ea == null)
                {
                    //await Task.Delay(1000);
                    System.Threading.Thread.Sleep(1000);
                    continue;
                }

                MtaQueuedMessage qmsg = Serialisation.Deserialise <MtaQueuedMessage>(ea.Body).Result;
                MtaMessage       msg  = new MtaMessage
                {
                    ID                = qmsg.ID,
                    InternalSendID    = qmsg.InternalSendID,
                    MailFrom          = qmsg.MailFrom,
                    RcptTo            = qmsg.RcptTo,
                    VirtualMTAGroupID = qmsg.VirtualMTAGroupID
                };

                RabbitMqManager.Publish(msg, RabbitMqManager.RabbitMqQueue.Inbound, true, qmsg.RabbitMqPriority).Wait();
                RabbitMqManager.Publish(qmsg, RabbitMqManager.RabbitMqQueue.OutboundWaiting, true, qmsg.RabbitMqPriority).Wait();
                RabbitMqManager.Ack(RabbitMqManager.RabbitMqQueue.InboundStaging, ea.DeliveryTag, false);
            }
        }
Exemple #3
0
        /// <summary>
        /// Logs an MTA Transaction to the database.
        /// </summary>
        public static async Task <bool> LogTransactionAsync(MtaMessage msg, TransactionStatus status, string svrResponse, VirtualMTA ipAddress, MXRecord mxRecord)
        {
            using (SqlConnection conn = MantaDB.GetSqlConnection())
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
BEGIN TRANSACTION 
INSERT INTO man_mta_transaction (mta_msg_id, ip_ipAddress_id, mta_transaction_timestamp, mta_transactionStatus_id, mta_transaction_serverResponse, mta_transaction_serverHostname)
VALUES(@msgID, @ipAddressID, GETUTCDATE(), @status, @serverResponse, @serverHostname)";

                switch (status)
                {
                case TransactionStatus.Discarded:
                case TransactionStatus.Failed:
                case TransactionStatus.TimedOut:
                    cmd.CommandText += @"UPDATE man_mta_send
								SET mta_send_rejected = mta_send_rejected + 1
								WHERE mta_send_internalID = @sendInternalID"                                ;
                    break;

                case TransactionStatus.Success:
                    cmd.CommandText += @"UPDATE man_mta_send
								SET mta_send_accepted = mta_send_accepted + 1
								WHERE mta_send_internalID = @sendInternalID"                                ;
                    break;
                }

                cmd.CommandText += " COMMIT TRANSACTION";
                cmd.Parameters.AddWithValue("@sendInternalID", msg.InternalSendID);

                cmd.Parameters.AddWithValue("@msgID", msg.ID);
                if (ipAddress != null)
                {
                    cmd.Parameters.AddWithValue("@ipAddressID", ipAddress.ID);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@ipAddressID", DBNull.Value);
                }

                if (mxRecord != null)
                {
                    cmd.Parameters.AddWithValue("@serverHostname", mxRecord.Host);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@serverHostname", DBNull.Value);
                }

                cmd.Parameters.AddWithValue("@status", (int)status);
                cmd.Parameters.AddWithValue("@serverResponse", svrResponse);
                await conn.OpenAsync();

                await cmd.ExecuteNonQueryAsync();

                return(true);
            }
        }
Exemple #4
0
        /// <summary>
        /// Enqueues the Email that we are going to relay in RabbitMQ.
        /// </summary>
        /// <param name="messageID">ID of the Message being Queued.</param>
        /// <param name="ipGroupID">ID of the Virtual MTA Group to send the Message through.</param>
        /// <param name="internalSendID">ID of the Send the Message is apart of.</param>
        /// <param name="mailFrom">The envelope mailfrom, should be return-path in most instances.</param>
        /// <param name="rcptTo">The envelope rcpt to.</param>
        /// <param name="message">The Email.</param>
        /// <returns>True if the Email has been enqueued in RabbitMQ.</returns>
        public static bool Enqueue(Guid messageID, int ipGroupID, int internalSendID, string mailFrom, string[] rcptTo, string message)
        {
            // Create the thing we are going to queue in RabbitMQ.
            MtaMessage recordToSave = new MtaMessage(messageID,
                                                     ipGroupID,
                                                     internalSendID,
                                                     mailFrom,
                                                     rcptTo,
                                                     message);

            return(RabbitMqManager.Publish(MtaQueuedMessage.CreateNew(recordToSave), RabbitMqManager.RabbitMqQueue.InboundStaging, true));
        }
        /// <summary>
        /// Enqueues the Email that we are going to relay in RabbitMQ.
        /// </summary>
        /// <param name="messageID">ID of the Message being Queued.</param>
        /// <param name="ipGroupID">ID of the Virtual MTA Group to send the Message through.</param>
        /// <param name="internalSendID">ID of the Send the Message is apart of.</param>
        /// <param name="mailFrom">The envelope mailfrom, should be return-path in most instances.</param>
        /// <param name="rcptTo">The envelope rcpt to.</param>
        /// <param name="message">The Email.</param>
        /// <param name="priority">Priority of message.</param>
        /// <returns>True if the Email has been enqueued in RabbitMQ.</returns>
        public static async Task <bool> Enqueue(Guid messageID, int ipGroupID, int internalSendID, string mailFrom, string[] rcptTo, string message, RabbitMqPriority priority)
        {
            // Create the thing we are going to queue in RabbitMQ.
            var recordToSave = new MtaMessage
            {
                ID                = messageID,
                InternalSendID    = internalSendID,
                MailFrom          = mailFrom,
                Message           = message,
                RcptTo            = rcptTo,
                VirtualMTAGroupID = ipGroupID,
                RabbitMqPriority  = priority
            };

            return(await RabbitMqManager.Publish(MtaQueuedMessage.CreateNew(recordToSave), RabbitMqManager.RabbitMqQueue.InboundStaging, true, priority));
        }
Exemple #6
0
        /// <summary>
        /// Dequeues a collection of inbound messages from RabbitMQ.
        /// </summary>
        /// <param name="maxItems">The maximum amount of messages to dequeue.</param>
        /// <returns>The dequeue messages.</returns>
        public static MtaMessageCollection Dequeue(int maxItems)
        {
            List <BasicDeliverEventArgs> items    = RabbitMqManager.Dequeue(RabbitMqManager.RabbitMqQueue.Inbound, maxItems, 1 * 1000);
            MtaMessageCollection         messages = new MtaMessageCollection();

            if (items.Count == 0)
            {
                return(messages);
            }

            foreach (BasicDeliverEventArgs ea in items)
            {
                MtaMessage msg = Serialisation.Deserialise <MtaMessage>(ea.Body);
                msg.RabbitMqDeliveryTag = ea.DeliveryTag;
                messages.Add(msg);
            }

            return(messages);
        }
        private static async Task HandleDequeue()
        {
            if (_StartedThreads >= STAGING_DEQUEUE_THREADS)
            {
                return;
            }

            _StartedThreads++;

            while (true)
            {
                BasicDeliverEventArgs ea = RabbitMq.RabbitMqManager.Dequeue(RabbitMqManager.RabbitMqQueue.InboundStaging, 1, 100).FirstOrDefault();
                if (ea == null)
                {
                    await Task.Delay(1000);

                    continue;
                }

                MtaQueuedMessage qmsg = await Serialisation.Deserialise <MtaQueuedMessage>(ea.Body);

                MtaMessage msg = new MtaMessage
                {
                    ID                = qmsg.ID,
                    InternalSendID    = qmsg.InternalSendID,
                    MailFrom          = qmsg.MailFrom,
                    RcptTo            = qmsg.RcptTo,
                    VirtualMTAGroupID = qmsg.VirtualMTAGroupID
                };

                await RabbitMqManager.Publish(msg, RabbitMqManager.RabbitMqQueue.Inbound, true, (RabbitMqPriority)qmsg.RabbitMqPriority);

                await RabbitMqManager.Publish(qmsg, RabbitMqManager.RabbitMqQueue.OutboundWaiting, true, (RabbitMqPriority)qmsg.RabbitMqPriority);

                RabbitMqManager.Ack(RabbitMqManager.RabbitMqQueue.InboundStaging, ea.DeliveryTag, false);
            }
        }
Exemple #8
0
 /// <summary>
 /// Logs an MTA Transaction to the database.
 /// </summary>
 public static void LogTransaction(MtaMessage msg, TransactionStatus status, string svrResponse, VirtualMTA ipAddress, MXRecord mxRecord)
 {
     LogTransactionAsync(msg, status, svrResponse, ipAddress, mxRecord).Wait();
 }