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