public async Task PublishAsync(ExportDeployment deployment, ExportDeploymentContext context, CancellationToken cancellationToken)
        {
            var emailAddresses = deployment.EmailAddresses
                                 .SplitSafe(",")
                                 .Where(x => x.IsEmail())
                                 .ToArray();

            if (!emailAddresses.Any())
            {
                return;
            }

            var emailAccount = await _db.EmailAccounts.FindByIdAsync(deployment.EmailAccountId, false, cancellationToken);

            var fromEmailAddress = emailAccount.ToMailAddress();
            var files            = await context.GetDeploymentFilesAsync(cancellationToken);

            var canStreamBlob = _db.DataProvider.CanStreamBlob;
            var num           = 0;

            foreach (var emailAddress in emailAddresses)
            {
                var queuedEmail = new QueuedEmail
                {
                    From           = fromEmailAddress,
                    SendManually   = false,
                    To             = emailAddress,
                    Subject        = deployment.EmailSubject.NaIfEmpty(),
                    Body           = deployment.EmailSubject.NaIfEmpty(),
                    CreatedOnUtc   = DateTime.UtcNow,
                    EmailAccountId = deployment.EmailAccountId
                };

                foreach (var file in files)
                {
                    var name       = file.Name;
                    var attachment = new QueuedEmailAttachment
                    {
                        StorageLocation = EmailAttachmentStorageLocation.Blob,
                        Name            = name,
                        MimeType        = MimeTypes.MapNameToMimeType(name)
                    };

                    using var item = MediaStorageItem.FromFile(file);
                    await _dbMediaStorageProvider.ApplyBlobAsync(attachment, item, false);

                    queuedEmail.Attachments.Add(attachment);
                }

                _db.QueuedEmails.Add(queuedEmail);

                // Blob data could be large, so better not bulk commit here.
                num += await _db.SaveChangesAsync(cancellationToken);
            }

            context.Log.Info($"{num} email(s) created and queued for deployment.");
        }
Beispiel #2
0
        public virtual void DeleteQueuedEmailAttachment(QueuedEmailAttachment qea)
        {
            if (qea == null)
            {
                throw new ArgumentNullException("qea");
            }

            _queuedEmailAttachmentRepository.Delete(qea);

            _services.EventPublisher.EntityDeleted(qea);
        }
Beispiel #3
0
        public virtual byte[] LoadQueuedEmailAttachmentBinary(QueuedEmailAttachment attachment)
        {
            Guard.NotNull(attachment, nameof(attachment));

            if (attachment.StorageLocation == EmailAttachmentStorageLocation.Blob)
            {
                return(_storageProvider.Value.Load(attachment.ToMedia()));
            }

            return(null);
        }
Beispiel #4
0
        public virtual byte[] LoadQueuedEmailAttachmentBinary(QueuedEmailAttachment attachment)
        {
            Guard.NotNull(attachment, nameof(attachment));

            if (attachment.StorageLocation == EmailAttachmentStorageLocation.Blob)
            {
                return(attachment.MediaStorage?.Data ?? new byte[0]);
            }

            return(null);
        }
Beispiel #5
0
        public virtual void DeleteQueuedEmailAttachment(QueuedEmailAttachment attachment)
        {
            Guard.NotNull(attachment, nameof(attachment));

            // delete from storage
            if (attachment.StorageLocation == EmailAttachmentStorageLocation.Blob)
            {
                _storageProvider.Value.Remove(attachment.ToMedia());
            }

            _queuedEmailAttachmentRepository.Delete(attachment);
        }
        /// <summary>
        /// Converts a queued email attachment entity into a media storage item
        /// </summary>
        /// <param name="attachment">Queued email attachment</param>
        /// <returns>Media storage item</returns>
        public static MediaItem ToMedia(this QueuedEmailAttachment attachment)
        {
            Guard.NotNull(attachment, nameof(attachment));

            var media = new MediaItem
            {
                Entity        = attachment,
                MimeType      = attachment.MimeType,
                FileExtension = Path.GetExtension(attachment.Name),
                Path          = "QueuedEmailAttachment"
            };

            return(media);
        }
 public void CreateListAttachmentForEmail(QueuedEmail queuedEmail,
                                          List <string> listQueuedEmailAttachments)
 {
     if (listQueuedEmailAttachments == null)
     {
         return;
     }
     foreach (var attach in listQueuedEmailAttachments)
     {
         var newAttachment = new QueuedEmailAttachment()
         {
             FilePath      = attach,
             QueuedEmailId = queuedEmail.Id
         };
         _attachmentRepositoryAsync.Insert(newAttachment);
     }
 }
        public void Can_cascade_delete_attachment()
        {
            var account = new EmailAccount
            {
                Email    = "*****@*****.**",
                Host     = "127.0.0.1",
                Username = "******",
                Password = "******"
            };

            var file = new MediaFile
            {
                Extension    = "txt",
                Name         = "file.txt",
                MimeType     = "text/plain",
                MediaStorage = new MediaStorage {
                    Data = new byte[10]
                }
            };

            // Add attachment
            var attach = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.FileReference,
                Name            = "file.txt",
                MimeType        = "text/plain",
                MediaFile       = file
            };

            var qe = new QueuedEmail
            {
                Priority     = 1,
                From         = "From",
                To           = "To",
                Subject      = "Subject",
                CreatedOnUtc = DateTime.UtcNow,
                EmailAccount = account
            };

            qe.Attachments.Add(attach);

            var fromDb = SaveAndLoadEntity(qe);

            fromDb.ShouldNotBeNull();

            Assert.AreEqual(fromDb.Attachments.Count, 1);
            attach = fromDb.Attachments.FirstOrDefault();
            attach.ShouldNotBeNull();

            file = attach.MediaFile;
            file.ShouldNotBeNull();

            var attachId = attach.Id;
            var fileId   = file.Id;

            // delete Attachment.Download
            context.Set <MediaFile>().Remove(file);
            context.SaveChanges();
            base.ReloadContext();

            attach = context.Set <QueuedEmailAttachment>().Find(attachId);
            attach.ShouldBeNull();

            // add new attachment
            attach = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.FileReference,
                Name            = "file.txt",
                MimeType        = "text/plain"
            };

            qe = context.Set <QueuedEmail>().FirstOrDefault();
            qe.Attachments.Add(attach);

            fromDb = SaveAndLoadEntity(qe);
            fromDb.ShouldNotBeNull();

            // delete QueuedEmail
            context.Set <QueuedEmail>().Remove(fromDb);
            context.SaveChanges();
            base.ReloadContext();

            // Attachment should also be gone now
            attach = context.Set <QueuedEmailAttachment>().FirstOrDefault();
            attach.ShouldBeNull();
        }
Beispiel #9
0
        public virtual void DeleteQueuedEmailAttachment(QueuedEmailAttachment attachment)
        {
            Guard.NotNull(attachment, nameof(attachment));

            _queuedEmailAttachmentRepository.Delete(attachment);
        }
        public void Can_convert_email()
        {
            var qe = new QueuedEmail
            {
                Bcc          = "[email protected];[email protected]",
                Body         = "Body",
                CC           = "[email protected];[email protected]",
                CreatedOnUtc = DateTime.UtcNow,
                From         = "*****@*****.**",
                FromName     = "FromName",
                Priority     = 10,
                ReplyTo      = "*****@*****.**",
                ReplyToName  = "ReplyToName",
                Subject      = "Subject",
                To           = "*****@*****.**",
                ToName       = "ToName"
            };

            // load attachment file resource and save as file
            var asm       = typeof(QueuedEmailServiceTests).Assembly;
            var pdfStream = asm.GetManifestResourceStream("{0}.Messages.Attachment.pdf".FormatInvariant(asm.GetName().Name));
            var pdfBinary = pdfStream.ToByteArray();

            pdfStream.Seek(0, SeekOrigin.Begin);
            var path1 = "~/Attachment.pdf";
            var path2 = CommonHelper.MapPath(path1, false);

            Assert.IsTrue(pdfStream.ToFile(path2));

            var attachBlob = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.Blob,
                Data            = pdfBinary,
                Name            = "blob.pdf",
                MimeType        = "application/pdf"
            };
            var attachPath1 = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.Path,
                Path            = path1,
                Name            = "path1.pdf",
                MimeType        = "application/pdf"
            };
            var attachPath2 = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.Path,
                Path            = path2,
                Name            = "path2.pdf",
                MimeType        = "application/pdf"
            };
            var attachFile = new QueuedEmailAttachment
            {
                StorageLocation = EmailAttachmentStorageLocation.FileReference,
                Name            = "file.pdf",
                MimeType        = "application/pdf",
                File            = new Download
                {
                    ContentType    = "application/pdf",
                    DownloadBinary = pdfBinary,
                    Extension      = ".pdf",
                    Filename       = "file"
                }
            };

            qe.Attachments.Add(attachBlob);
            qe.Attachments.Add(attachFile);
            qe.Attachments.Add(attachPath1);
            qe.Attachments.Add(attachPath2);

            var msg = _queuedEmailService.ConvertEmail(qe);

            Assert.IsNotNull(msg);
            Assert.IsNotNull(msg.To);
            Assert.IsNotNull(msg.From);

            Assert.AreEqual(msg.ReplyTo.Count, 1);
            Assert.AreEqual(qe.ReplyTo, msg.ReplyTo.First().Address);
            Assert.AreEqual(qe.ReplyToName, msg.ReplyTo.First().DisplayName);

            Assert.AreEqual(msg.Cc.Count, 2);
            Assert.AreEqual(msg.Cc.First().Address, "*****@*****.**");
            Assert.AreEqual(msg.Cc.ElementAt(1).Address, "*****@*****.**");

            Assert.AreEqual(msg.Bcc.Count, 2);
            Assert.AreEqual(msg.Bcc.First().Address, "*****@*****.**");
            Assert.AreEqual(msg.Bcc.ElementAt(1).Address, "*****@*****.**");

            Assert.AreEqual(qe.Subject, msg.Subject);
            Assert.AreEqual(qe.Body, msg.Body);

            Assert.AreEqual(msg.Attachments.Count, 4);

            var attach1 = msg.Attachments.First();
            var attach2 = msg.Attachments.ElementAt(1);
            var attach3 = msg.Attachments.ElementAt(2);
            var attach4 = msg.Attachments.ElementAt(3);

            // test file names
            Assert.AreEqual(attach1.Name, "blob.pdf");
            Assert.AreEqual(attach2.Name, "file.pdf");
            Assert.AreEqual(attach3.Name, "path1.pdf");
            Assert.AreEqual(attach4.Name, "path2.pdf");

            // test file streams
            Assert.AreEqual(attach1.ContentStream.Length, pdfBinary.Length);
            Assert.AreEqual(attach2.ContentStream.Length, pdfBinary.Length);
            Assert.Greater(attach3.ContentStream.Length, 0);
            Assert.Greater(attach4.ContentStream.Length, 0);

            // cleanup
            msg.Attachments.Each(x => x.Dispose());
            msg.Attachments.Clear();

            // delete attachment file
            File.Delete(path2);
        }