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."); }
public virtual void DeleteQueuedEmailAttachment(QueuedEmailAttachment qea) { if (qea == null) { throw new ArgumentNullException("qea"); } _queuedEmailAttachmentRepository.Delete(qea); _services.EventPublisher.EntityDeleted(qea); }
public virtual byte[] LoadQueuedEmailAttachmentBinary(QueuedEmailAttachment attachment) { Guard.NotNull(attachment, nameof(attachment)); if (attachment.StorageLocation == EmailAttachmentStorageLocation.Blob) { return(_storageProvider.Value.Load(attachment.ToMedia())); } return(null); }
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); }
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(); }
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); }