public static void Run(string myBlob, string filename, Order ordersRow, TraceWriter log, out SendGridMessage message)
        {
            var email = ordersRow.Email;

            log.Info($"Order from Email: {email}\n License file name: {filename} ");

            var byteText  = System.Text.Encoding.UTF8.GetBytes(myBlob);
            var initiator = new EmailAddress("*****@*****.**", "Paycor");

            var attachments = new List <SendGrid.Helpers.Mail.Attachment>
            {
                new SendGrid.Helpers.Mail.Attachment
                {
                    Content     = System.Convert.ToBase64String(byteText),
                    Type        = "text/plain",
                    Filename    = "license.lic",
                    Disposition = "attachment",
                    ContentId   = "License File"
                }
            };

            var recipientEmailAddresses = new List <EmailAddress> {
                new EmailAddress(email, "Ashif Anwar")
            };

            message = MailHelper.CreateSingleEmailToMultipleRecipients(initiator, recipientEmailAddresses,
                                                                       "Thank you for your order", "Your license file is attached", "Your license file is attached");
            message.AddAttachments(attachments);
        }
        private async Task <Response> SendEmail()
        {
            var apiKey = ConfigurationManager.AppSettings["SENDGRID_API_KEY"];
            var client = new SendGridClient(apiKey: apiKey);

            var             from    = new EmailAddress(this.FromEmail, this.FromName);
            var             subject = this.Subject;
            var             to      = new EmailAddress(this.ToEmail, this.ToName);
            SendGridMessage message = null;

            if (IsBodyHtml)
            {
                message = MailHelper.CreateSingleEmail(from, to, subject, "", this.Body);
            }
            else
            {
                message = MailHelper.CreateSingleEmail(from, to, subject, this.Body, "");
            }

            if (Attachments != null && Attachments.Length > 0)
            {
                message.AddAttachments(Attachments.ToList());
            }

            var response = await client.SendEmailAsync(message);

            return(response);
        }
        /// <summary>
        /// Semd email
        /// </summary>
        /// <param name="subject"></param>
        /// <param name="toEmail"></param>
        /// <param name="toName"></param>
        /// <param name="data"></param>
        /// <param name="attachments"></param>
        /// <returns></returns>
        public async Task <bool> SendEmail(
            string subject,
            string toEmail,
            string toName,
            IEmail data,
            IEnumerable <Attachment> attachments
            )
        {
            if (data == null)
            {
                throw new Exception("Please define data for email");
            }
            if (string.IsNullOrEmpty(toEmail))
            {
                logger.LogDebug($"Message {data.TemplateId} not delivered because email is not defined");
                return(false);
            }
            logger.LogInformation($"Sending {data.TemplateId} email to {toEmail}");
            if (!Name2Id.ContainsKey(data.TemplateId))
            {
                System.Console.WriteLine($"Template not found: {data.TemplateId}: {subject} {Newtonsoft.Json.JsonConvert.SerializeObject(data)}");
                return(false);
            }
            var msg = new SendGridMessage()
            {
                TemplateId       = Name2Id[data.TemplateId],
                Personalizations = new List <Personalization>()
                {
                    new Personalization()
                    {
                        TemplateData = data
                    }
                }
            };

            msg.AddTo(new EmailAddress(toEmail, toName));

            msg.From = new EmailAddress(fromEmail, fromName);
            if (attachments.Any())
            {
                msg.AddAttachments(attachments);
            }
            var serialize = msg.Serialize();
            var response  = await client.RequestAsync(SendGridClient.Method.POST, requestBody : serialize, urlPath : "mail/send");

            if (response.StatusCode == System.Net.HttpStatusCode.Accepted)
            {
                return(true);
            }

            logger.LogError(await response.Body.ReadAsStringAsync());
            logger.LogError(serialize);
            return(false);
        }
Example #4
0
        /// <summary>
        /// Sends asynchronously.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <returns>
        /// A task returning a boolean indicating
        /// whether or not the send was successful.
        /// </returns>
        public async Task SendAsync(EmailMessage message)
        {
            _logger.LogDebug($"Sending email: {JsonConvert.SerializeObject(message)}");

            var to  = message.To.Split(';', StringSplitOptions.RemoveEmptyEntries);
            var cc  = string.IsNullOrWhiteSpace(message.CC) ? new List <string>() : message.CC.Split(';', StringSplitOptions.RemoveEmptyEntries).Except(to, StringComparer.OrdinalIgnoreCase).ToList();
            var bcc = string.IsNullOrWhiteSpace(message.BCC) ? new List <string>() : message.BCC.Split(';', StringSplitOptions.RemoveEmptyEntries).Except(to, StringComparer.OrdinalIgnoreCase).ToList();

            var sendGridMessage = new SendGridMessage();

            sendGridMessage.SetFrom(string.IsNullOrWhiteSpace(message.From) ? _emailConfiguration.SupportEmail : message.From);
            sendGridMessage.AddTos(to.Select(t => new EmailAddress(t)).ToList());

            if (cc.Count > 0)
            {
                sendGridMessage.AddCcs(cc.Select(t => new EmailAddress(t)).ToList());
            }
            if (bcc.Count > 0)
            {
                sendGridMessage.AddBccs(bcc.Select(t => new EmailAddress(t)).ToList());
            }

            if (message.Attachments != null && message.Attachments.Count > 0)
            {
                sendGridMessage.AddAttachments(message.Attachments.Select(attachment => new Attachment()
                {
                    Filename = attachment.Key, Content = attachment.Value.ToBase64()
                }).ToList());
            }

            if (message is TemplateEmailMessage templateEmailMessage)
            {
                sendGridMessage.SetTemplateId(templateEmailMessage.TemplateId);
                sendGridMessage.SetTemplateData(templateEmailMessage.TemplateData);
            }
            else if (message is HtmlEmailMessage htmlEmailMessage)
            {
                sendGridMessage.SetSubject(htmlEmailMessage.Subject);
                sendGridMessage.AddContent(MimeType.Html, htmlEmailMessage.Body);
            }

            var response = await _sendGridClient.SendEmailAsync(sendGridMessage);

            _logger.LogDebug($"Sendgrid response: {await response.Body?.ReadAsStringAsync()}");

            if (response.StatusCode < HttpStatusCode.OK || response.StatusCode >= HttpStatusCode.Ambiguous)
            {
                throw new PasswordlessException($"Unable to send email : {await response.Body?.ReadAsStringAsync()}");
            }
        }
Example #5
0
        protected override void ConfigurarMensaje(string asunto, string contenido)
        {
            _message.Subject     = asunto;
            _message.HtmlContent = contenido;

            if (_message.Attachments != null)
            {
                _message.Attachments.Clear();
            }

            if (_adjuntos != null && _adjuntos.Count > 0)
            {
                _message.AddAttachments(_adjuntos);
            }
        }
Example #6
0
        public void SendGridMessage_AddAttachments_Adds_All_Attachments()
        {
            // Arrange
            var sut = new SendGridMessage();

            var attachments = new[]
            {
                new Attachment(),
                new Attachment()
            };

            // Act
            sut.AddAttachments(attachments);

            // Assert
            Assert.Equal(attachments.Length, sut.Attachments.Count);
        }
Example #7
0
        protected override async Task SendEmailInternalAsync(EmailModel emailModel)
        {
            var msg = new SendGridMessage
            {
                From = emailModel.From != null
                ? new EmailAddress(emailModel.From.Email, emailModel.From.Name)
                : new EmailAddress(_config.EmailAddress, _config.Name),
                Subject          = emailModel.Subject,
                HtmlContent      = emailModel.HtmlBody,
                PlainTextContent = emailModel.TextBody // TODO: convert html to plain text?
            };

            msg.AddTos(emailModel.Recipients.Select(a => new EmailAddress(a.Email, a.Name)).ToList());

            if (emailModel.Cc?.Any() == true)
            {
                msg.AddCcs(emailModel.Cc.Select(a => new EmailAddress(a.Email, a.Name)).ToList());
            }

            if (emailModel.Bcc?.Any() == true)
            {
                msg.AddBccs(emailModel.Bcc.Select(a => new EmailAddress(a.Email, a.Name)).ToList());
            }

            if (emailModel.Attachments?.Any() == true)
            {
                msg.AddAttachments(emailModel.Attachments.Select(a => new global::SendGrid.Helpers.Mail.Attachment
                {
                    Filename    = a.Filename,
                    Content     = Convert.ToBase64String(a.Bytes),
                    Type        = a.ContentType,
                    Disposition = a.ContentDisposition,
                    ContentId   = a.ContentId
                }));
            }

            var client   = new SendGridClient(_config.Key);
            var response = await client.SendEmailAsync(msg);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                var responseBody = await response.Body.ReadAsStringAsync();

                throw new EmailSenderException($"SendGrid returned {response.StatusCode} status code ({responseBody})");
            }
        }
Example #8
0
        public void SendGridMessage_AddAttachments_Doesnt_Use_Provided_List_As_Property()
        {
            // Arrange
            var sut = new SendGridMessage();

            var attachments = new List <Attachment>
            {
                new Attachment(),
                new Attachment()
            };

            // Act
            sut.AddAttachments(attachments);

            // Assert
            Assert.Equal(attachments.Count(), sut.Attachments.Count);
            Assert.NotSame(attachments, sut.Attachments);
        }
        /// <summary>
        ///     Adds the attachment streams.
        /// </summary>
        /// <param name="mail">The mail object to which the attachments should be added.</param>
        /// <param name="attachments">The attachments.</param>
        /// <param name="token">The cancellation token.</param>
        /// <returns>Task.</returns>
        protected virtual async Task AddAttachmentStreamsAsync(SendGridMessage mail,
                                                               IDictionary <string, Stream> attachments, CancellationToken token = default(CancellationToken))
        {
            if (attachments != null && attachments.Any())
            {
                var sgAttachments = new List <Attachment>();
                foreach (var stream in attachments)
                {
                    sgAttachments.Add(new Attachment
                    {
                        Content     = await stream.Value.ToBase64StringAsync(),
                        Filename    = stream.Key,
                        Disposition = "attachment"
                    });
                }

                mail.AddAttachments(sgAttachments);
            }
        }
Example #10
0
        public Task SendAsync(MailMessageDTO message)
        {
            var web = new SendGridClient(apiKey);

            var msg = new SendGridMessage()
            {
                From    = ConvertMailAddress(message.From),
                ReplyTo = message.ReplyTo.Select(ConvertMailAddress).FirstOrDefault(),
                Subject = message.Subject
            };

            msg.AddTos(message.To.Select(ConvertMailAddress).ToList());

            if (message.Cc.Count > 0)
            {
                msg.AddCcs(message.Cc.Select(ConvertMailAddress).ToList());
            }

            if (message.Bcc.Count > 0)
            {
                msg.AddBccs(message.Bcc.Select(ConvertMailAddress).ToList());
            }

            if (message.Attachments.Count > 0)
            {
                msg.AddAttachments(message.Attachments.Select(ConvertAttachment).ToList());
            }

            if (string.IsNullOrWhiteSpace(message.BodyHtml))
            {
                msg.PlainTextContent = message.BodyText;
            }
            else
            {
                msg.HtmlContent = message.BodyHtml;
            }

            ProcessTemplate(msg, message.MailingTemplate);

            OnMessageSending(msg);
            return(web.SendEmailAsync(msg));
        }
Example #11
0
        public async Task SendNotification(List <Documents> documents,
                                           string destination,
                                           string subject,
                                           string content)
        {
            var client    = SendGridConfig.Instance();
            var myMessage = new SendGridMessage();

            myMessage.HtmlContent = content;

            List <Attachment> attachments = new List <Attachment>();

            foreach (var item in documents)
            {
                byte[] imageArray           = File.ReadAllBytes(item.Path);
                string base64Representation = Convert.ToBase64String(imageArray);

                attachments.Add(new Attachment()
                {
                    Content     = base64Representation,
                    Type        = item.Type,
                    Filename    = item.Filename,
                    Disposition = item.Disposition,
                    ContentId   = item.ContentId
                });
            }

            if (attachments.Any())
            {
                myMessage.AddAttachments(attachments);
            }

            myMessage.AddTo(destination);
            myMessage.From    = new EmailAddress("*****@*****.**", "Daniel Vasquez");
            myMessage.Subject = subject;
            myMessage.SetClickTracking(false, false);

            await client.SendEmailAsync(myMessage);
        }
        public static void Run([TimerTrigger("0 */3 * * * *")] TimerInfo myTimer,
                               [Blob("images", Connection = "AzureWebJobsStorage")] CloudBlobContainer images,
                               [Blob("thumbnails", Connection = "AzureWebJobsStorage")] CloudBlobContainer thumbnails,
                               [SendGrid(ApiKey = "SendgridConfiguration", From = "*****@*****.**", To = "*****@*****.**", Subject = "Azure Cleanup process")] out SendGridMessage message,
                               ILogger log)
        {
            message = new SendGridMessage();
            var listAttachment = new List <Attachment>();

            listAttachment.AddRange(CleanUp(images, log).ConfigureAwait(false).GetAwaiter().GetResult());
            listAttachment.AddRange(CleanUp(thumbnails, log).ConfigureAwait(false).GetAwaiter().GetResult());
            if (listAttachment.Count > 0)
            {
                message.AddAttachments(listAttachment);
                message.AddContent("text/html", "Please find the attached list of files after cleanup.");
            }
            else
            {
                message.AddContent("text/html", "No file foud for cleanup.");
            }
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }
Example #13
0
        public void SendGridMessage_AddAttachments_Doesnt_Touch_Attachments_Passed_In()
        {
            // Arrange
            var sut = new SendGridMessage();

            var content     = "content";
            var contentId   = "contentId";
            var disposition = "disposition";
            var filename    = "filename";
            var type        = "type";

            var attachment = new Attachment
            {
                Content     = content,
                ContentId   = contentId,
                Disposition = disposition,
                Filename    = filename,
                Type        = type
            };

            var attachments = new[] { attachment };

            // Act
            sut.AddAttachments(attachments);

            // Assert
            Assert.Single(sut.Attachments);

            var addedAttachment = sut.Attachments.First();

            Assert.Same(attachment, addedAttachment);
            Assert.Equal(attachment.Content, addedAttachment.Content);
            Assert.Equal(attachment.ContentId, addedAttachment.ContentId);
            Assert.Equal(attachment.Disposition, addedAttachment.Disposition);
            Assert.Equal(attachment.Filename, addedAttachment.Filename);
            Assert.Equal(attachment.Type, addedAttachment.Type);
        }
        public async Task <Response> SendEmail(EmailAddress from, IEnumerable <EmailAddress> tos, string templateId, object dynamicTemplateData, IEnumerable <Attachment> attachments = null, IEnumerable <EmailAddress> ccList = null)
        {
            var emailMessage = new SendGridMessage();

            emailMessage.SetFrom(from);
            emailMessage.AddTos(tos.ToList());

            if (ccList != null && ccList.Count() > 0)
            {
                emailMessage.AddCcs(ccList.ToList());
            }

            emailMessage.SetTemplateId(templateId);
            emailMessage.SetTemplateData(dynamicTemplateData);

            if (attachments != null)
            {
                emailMessage.AddAttachments(attachments);
            }

            var response = await _sendGridClient.SendEmailAsync(emailMessage);

            return(response);
        }
        public async Task <ResponseMessage> SendAsync(EmailMessage message)
        {
            // Message
            var msg = new SendGridMessage();

            msg.Subject          = message.Subject;
            msg.From             = new EmailAddress(message.From);
            msg.PlainTextContent = message.Body;
            msg.AddTos(message.To.Select(s => new EmailAddress(s)).ToList());

            if (message.CC.Count > 0)
            {
                msg.AddCcs(message.CC.Select(s => new EmailAddress(s)).ToList());
            }

            if (message.BCC.Count > 0)
            {
                msg.AddBccs(message.BCC.Select(s => new EmailAddress(s)).ToList());
            }

            if (message.Attachments.Count > 0)
            {
                msg.AddAttachments(message.Attachments.Select(s => new Attachment
                {
                    Filename = s,
                    Content  = Convert.ToBase64String(System.IO.File.ReadAllBytes(s))
                }).ToList());
            }

            // Send
            var client   = new SendGridClient(this.settings.ApiKey);
            var response = await client.SendEmailAsync(msg);

            // Return
            return(new ResponseMessage(response.StatusCode.ToString()));
        }
Example #16
0
        /// <summary>
        /// Rabbit MQ Email sender
        /// </summary>
        /// <param name="subject"></param>
        /// <param name="toEmail"></param>
        /// <param name="toName"></param>
        /// <param name="data"></param>
        /// <param name="attachments"></param>
        /// <returns></returns>
        public async Task <bool> SendEmail(string subject, string toEmail, string toName, IEmail data, IEnumerable <Attachment> attachments)
        {
            try
            {
                try
                {
                    var msg = new SendGridMessage()
                    {
                        TemplateId       = data.TemplateId,
                        Personalizations = new List <Personalization>()
                        {
                            new Personalization()
                            {
                                TemplateData = data
                            }
                        }
                    };

                    if (!string.IsNullOrEmpty(subject))
                    {
                        msg.Subject = subject;
                    }

                    msg.AddTo(new EmailAddress(toEmail, toName));

                    msg.From = new EmailAddress(settings.Value.FromEmail, settings.Value.FromName);
                    if (!string.IsNullOrEmpty(settings.Value.ReplyToEmail))
                    {
                        if (!string.IsNullOrEmpty(settings.Value.ReplyToName))
                        {
                            msg.ReplyTo = new EmailAddress(settings.Value.ReplyToEmail, settings.Value.ReplyToName);
                        }
                        else
                        {
                            msg.ReplyTo = new EmailAddress(settings.Value.ReplyToEmail);
                        }
                    }
                    if (attachments.Any())
                    {
                        msg.AddAttachments(attachments);
                    }
                    var serialize = Encoding.UTF8.GetBytes(msg.Serialize());

                    var factory = new ConnectionFactory()
                    {
                        HostName    = settings.Value.HostName,
                        UserName    = settings.Value.RabbitUserName,
                        Password    = settings.Value.RabbitPassword,
                        VirtualHost = settings.Value.VirtualHost
                    };
                    using var connection = factory.CreateConnection();
                    using var channel    = connection.CreateModel();
                    channel.BasicPublish(exchange: settings.Value.Exchange,
                                         routingKey: settings.Value.QueueName,
                                         body: serialize);
                    logger.LogInformation($"Sent {data.TemplateId} email to {Helpers.Hash.GetSHA256Hash(settings.Value.CoHash + toEmail)}");

                    return(true);
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, $"Failed to PostMessagesAsync to rabbit sms queue. Exception: {ex.Message}");
                    throw;
                }
            }
            catch (Exception exc)
            {
                logger.LogError(exc, $"Failed to PostMessagesAsync to rabbit sms queue. Exception: {exc.Message}");
                return(false);
            }
        }
Example #17
0
        public static async Task Run(
            [QueueTrigger("emails")] OutgoingEmail email,
            [SendGrid] IAsyncCollector <SendGridMessage> messageCollector, ILogger log)
        {
            try
            {
                if (email is null)
                {
                    throw new ArgumentNullException(nameof(email));
                }
                else if (email.Tos is null || !email.Tos.Any())
                {
                    throw new ArgumentException("There must be at least one recipient.", nameof(email.Tos));
                }
                else if (string.IsNullOrWhiteSpace(email.Body))
                {
                    throw new ArgumentNullException("There must be a body for the email.", nameof(email.Body));
                }

                log.LogInformation("Starting email process");

                var message = new SendGridMessage();

                message.SetFrom(new EmailAddress(Environment.GetEnvironmentVariable("FromEmail"), Environment.GetEnvironmentVariable("FromName")));
                message.SetSubject(email.Subject);
                message.HtmlContent = email.Body;

                var hardcodedToEmail = Environment.GetEnvironmentVariable("ToEmail");
                if (string.IsNullOrWhiteSpace(hardcodedToEmail))
                {
                    foreach (var toEmail in email.Tos)
                    {
                        log.LogInformation("email: {toEmail}", toEmail);
                        message.AddTo(toEmail);
                    }
                }
                else
                {
                    log.LogInformation("harcoded email: {email}", hardcodedToEmail);
                    message.AddTo(hardcodedToEmail);
                }

                if (email.Attachments != null && email.Attachments.Any())
                {
                    log.LogInformation("Have {count} attachment(s)", email.Attachments.Count);
                    var storageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));

                    var client    = storageAccount.CreateCloudBlobClient();
                    var container = client.GetContainerReference(Environment.GetEnvironmentVariable("Container_Name"));
                    await container.CreateIfNotExistsAsync();

                    foreach (var file in email.Attachments)
                    {
                        var dirRef      = container.GetDirectoryReference(file);
                        var isDirectory = dirRef.ListBlobs().Count() > 0;

                        if (isDirectory)
                        {
                            log.LogInformation("Processing folder: {file}", file);
                            var bag      = new ConcurrentBag <Attachment>();
                            var taskList = new List <Task>();

                            foreach (CloudBlob b in dirRef.ListBlobs(useFlatBlobListing: true))
                            {
                                taskList.Add(Task.Run(async() => bag.Add(await DownloadBlob(b, log))));
                            }

                            await Task.WhenAll(taskList);

                            if (bag.Any())
                            {
                                message.AddAttachments(bag.ToList());
                            }
                            else
                            {
                                log.LogWarning("There are no files in the {folder} folder", file);
                            }
                        }
                        else
                        {
                            log.LogInformation("Processing file: {file}", file);
                            var blobRef = container.GetBlobReference(file);
                            if (await blobRef.ExistsAsync())
                            {
                                message.Attachments.Add(await DownloadBlob(blobRef, log));
                            }
                            else
                            {
                                throw new ArgumentException($"The file {file} does not exists", nameof(file));
                            }
                        }
                    }
                }

                log.LogDebug("Sending an email with the subject: {subject}", email.Subject);

                await messageCollector.AddAsync(message);

                log.LogInformation("Finished sending email");
            }