//subscription pulls from the topic(queue) and send email with info gathered from the topic to the recepient. public void DownloadEmailFromQueueAndSend() { SubscriberServiceApiClient client = SubscriberServiceApiClient.Create(); Subscription s = CreateGetSubscription(); //you must getSubscription before being able to read messages from Topic/Queue PullResponse pullResponse = client.Pull(s.SubscriptionName, true, 1); //Reading the message on top (You can read more than just 1 at a time) KeyRepository kr = new KeyRepository(); if (pullResponse != null) { if (pullResponse.ReceivedMessages.Count > 0) { //extracting the first message since in the previous line it was specified to read one at a time. (Loop required to read more than 1 item(The amount set in maxMessages from the Pull method)) string encryptedData = pullResponse.ReceivedMessages[0].Message.Data.ToStringUtf8(); string decryptedData = kr.Decrypt(encryptedData); File deserialized = JsonSerializer.Deserialize <File>(decryptedData); //Deserializing since it was serialized when added to the queue string htmlString = $"<html><b>{deserialized.FileOwner}</b> is sharing the file <b>{deserialized.FileTitle}</b> with you.<br/> <a href=\"{deserialized.Link}\">Click me to access file</a> </html>"; string encryptedRecepient = pullResponse.ReceivedMessages[0].Message.Attributes["recepient"]; string recepient = kr.Decrypt(encryptedRecepient); //Dummy email was created to act as a "Company email which will send emails to users." //Send Email with deserialized. Documentation: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8 MailMessage message = new MailMessage(); SmtpClient smtp = new SmtpClient(); message.From = new MailAddress("*****@*****.**"); message.To.Add(new MailAddress(recepient)); message.Subject = "File"; message.IsBodyHtml = true; //to make message body as html message.Body = htmlString; smtp.Port = 587; smtp.Host = "smtp.gmail.com"; //for gmail host smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = new NetworkCredential("*****@*****.**", "passForpfc1234"); //go on googleaccount > Security > search for lesssecureapps > turn it to on //Note: Google will automatically turn this setting OFF lesssecureapps if it’s not being used smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.Send(message); List <string> acksIds = new List <string>(); //after the email is sent successfully you acknolwedge the message so it is confirmed that it was processed. (Message will be removed after acknowledge.) acksIds.Add(pullResponse.ReceivedMessages[0].AckId); client.Acknowledge(s.SubscriptionName, acksIds.AsEnumerable()); } } }
//Publish method: uploads a message to the queue. public void AddToEmailQueue(File f, string recepient) { PublisherServiceApiClient client = PublisherServiceApiClient.Create(); Topic t = CreateGetTopic(); KeyRepository kr = new KeyRepository(); string serialized = JsonSerializer.Serialize(f, typeof(File)); // this list is used so that the method can take more than 1 message/item/file at a time. List <PubsubMessage> messagesToAddToQueue = new List <PubsubMessage>(); PubsubMessage msg = new PubsubMessage(); //Encripting data and recepient values string encryptedData = kr.Encrypt(serialized); string encryptedRecepient = kr.Encrypt(recepient); msg.Data = ByteString.CopyFromUtf8(encryptedData); //Stores email content. msg.Attributes["recepient"] = encryptedRecepient; //stores recepient as a key-value attribute. messagesToAddToQueue.Add(msg); client.Publish(t.TopicName, messagesToAddToQueue); //committing to queue }