Я создаю пакетное задание для чтения электронной почты из папки «Входящие» с помощью API Microsoft Graph и публикации содержимого электронной почты с помощью служебной шины. Я поместил обнаружение дубликатов в свою служебную шину Azure на основе назначенного идентификатора сообщения. Чтобы предотвратить публикацию одного и того же электронного письма, я поместил идентификатор сообщения электронной почты в идентификатор сообщения служебной шины Azure.
Однако кажется, что длина идентификатора сообщения электронной почты слишком велика, и я не могу использовать его в качестве идентификатора сообщения служебной шины Azure. Любое решение о том, как поместить идентификатор сообщения электронной почты в качестве идентификатора сообщения служебной шины Azure? (Мне не разрешено хранить идентификатор сообщения электронной почты в каком-либо постоянном хранилище, я могу опубликовать его только через служебную шину Azure)
Спасибо
Длина идентификатора сообщения служебной шины не может превышать 128 символов. Как правило, значение идентификаторы электронной почты, полученные из API Microsoft Graph, выглядят следующим образом:
AAMkADU1NzNkY2I2LWIxY2QtNGFhOC1iYmE5LWEzODA2ZjJkMjQxNwBGAAAAAABRRlt89urpT62rDl3o5R1RBwCSQ84srYEXTY2slhDtcrhrAAAAAAEMAACSQ84srYEXTY2slhDtcrhrAABlQp2FAAA=
Как правило, его длина составляет 188 символов, что и вызывает эту проблему.
Чтобы решить эту проблему, вы можете попробовать использовать MD5 для создания единого идентификатора для идентификатора электронной почты, по умолчанию его длина будет 32 символа, хотя это значение имеет возможность коллизии с хэшем, который из другой строки, но его вероятность низкая (около 2^-128).
Если вы используете C#, просто попробуйте следующий код:
using Azure.Messaging.ServiceBus;
using System;
using System.Security.Cryptography;
using System.Text;
namespace serviceBusTest
{
class Program
{
static void Main(string[] args)
{
string connectionString = "";
string queueName = "";
var client = new ServiceBusClient(connectionString);
ServiceBusSender sender = client.CreateSender(queueName);
ServiceBusMessage message = new ServiceBusMessage();
var emailID = "AAMkADU1NzNkY2I2LWIxY2QtNGFhOC1iYmE5LWEzODA2ZjJkMjQxNwBGAAAAAABRRlt89urpT62rDl3o5R1RBwCSQ84srYEXTY2slhDtcrhrAAAAAAEMAACSQ84srYEXTY2slhDtcrhrAABlQp2FAAA = ";
message.MessageId = GetMd5Hash(MD5.Create(), emailID);
sender.SendMessageAsync(message).GetAwaiter().GetResult();
ServiceBusReceiver receiver = client.CreateReceiver(queueName);
ServiceBusReceivedMessage receivedMessage = receiver.ReceiveMessageAsync().GetAwaiter().GetResult();
Console.WriteLine(receivedMessage.MessageId);
}
static string GetMd5Hash(MD5 md5Hash, string input)
{
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
}
}
Результат:
Идентификатор сообщения используется внутри служебной шины Azure и не предназначен для отправки электронных писем с помощью API Microsoft Graph, поскольку это не стандартный адрес электронной почты. Он используется только для маршрутизации сообщений и корреляции со служебной шиной Azure. Вот документация к нему.