/// <summary> /// Forwards the email to the relay email address. /// </summary> /// <param name="mimeMessage">The MIME message.</param> public void ForwardEmail(MimeMessage mimeMessage) { Metadata metadata = MetadataFactory.GenerateFrom(mimeMessage); // Add tags to the subject string subject = mimeMessage.Subject; IEmailEntry emailEntry = emailEntryCache.Get(toCache.Get(mimeMessage)); if (!string.IsNullOrEmpty(emailEntry?.Tag)) { metadata.Tag = emailEntry.Tag; subject = $"[{emailEntry.Tag}] {subject}"; } Email email = new Email( new System.Net.Mail.MailAddress(_options.GetSender()), new System.Net.Mail.MailAddress(_options.RelayEmail)) { Subject = subject, }; foreach (MimeEntity mimeEntity in mimeMessage.BodyParts) { if (mimeEntity.IsAttachment) { if (!(mimeEntity is MimePart mimePart)) { continue; } Attachment temporaryAttachment; using (MemoryStream memoryStream = new MemoryStream()) { mimePart.Content.DecodeTo(memoryStream); memoryStream.Seek(0, SeekOrigin.Begin); temporaryAttachment = new TemporaryAttachment(memoryStream) { DisplayFileName = mimePart.FileName, ContentType = mimePart.ContentType.MimeType, Encoding = mimePart.ContentTransferEncoding.GetRaw(), }; } email.Attachments.Add(temporaryAttachment); } else if (mimeEntity is TextPart textPart) { string text = textPart.Text; if (textPart.ContentType.MimeType == Constants.TextMimeType) { text = MetadataSerializer.SerializeForText(metadata, text); } else if (textPart.ContentType.MimeType == Constants.HtmlMimeType) { text = MetadataSerializer.SerializeForHtml(metadata, text); } email.TextContents.Add( new Text() { RawText = text, MimeType = textPart.ContentType.MimeType, Charset = textPart.ContentType.Charset, }); } } _sender.SendEmail(email); emailEntryCache.Clear(); toCache.Clear(); }