Создать действие для изображения в C # windows serivce - PullRequest
0 голосов
/ 16 октября 2019

Я работаю с решением, которое содержит много разных проектов. В частности, мой проект отвечает за отправку уведомлений по электронной почте. Я создал EmailTemplate.cs, который используется для генерации электронной почты. В этом EmailTemplate.cs я использую 2 изображения при отправке электронного письма.

Эта Windows-служба развернута в различных средах, PROD, STG, DEV. Мы также используем Jenkins для нашего CI / CD.

Я столкнулся со сценарием, когда изображения загружались неправильно, потому что когда служба была развернута, изображения не были частью файла Jenkins для включения изображений в выходной каталог.

Я знаю, что могу обновить файл Jenkins, чтобы скопировать изображения в выходной каталог, и изменить действие «Создать» для изображения на «Содержимое» и «Копировать в выходной каталог: всегда копировать». Но я не решаюсь сделать это.

Мой вопрос заключается в том, что является идеальной / наилучшей практикой для этого сценария включения изображений в решение.

Я читал о встроенном ресурсе для изображения, но все статьи устарели / устарели и хочу знать, что лучше для этого возраста.

Я читал о встроенном ресурсе для изображения, но всестатьи устарели / стары и хотят знать, что лучше для этого возраста.

Я уже изменил действие «Создать действие» на «Содержимое» и «Копировать в выходной каталог» на «Всегда». Это работает, но мне не нравится идея копирования изображений в выходной каталог.

public struct EmailTemplate
    {
        public const string Html =
            @"
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset=""utf-8"" />
    <style>
        table, th, td {
            border: 1px solid black;
        }
    </style>

</head>
<body>
    <table width = ""650px"" height=""550px"" style=""border-color: #3399ff; border-width:4px"" cellspacing=""0"" border=""0"">
        <tr style = ""border-style: hidden"" >
            <td align=""center"" style=""background-color:white"">
               <span style = ""font-size:25px;"" >
                    <span>
                        <img id=""mediaShuttleLogo""src=""mediashuttleLogo"">
                    </span>
                </span>
            </td>
        </tr>
        <tr align=""center"" style=""border-style: hidden"">
            <td>
                <br />
                <span style=""color: #3399ff; font-family:Calibri"" > RequesterEmail has sent you content via Media Shuttle.</span>
                <br />
                <span>
                    <img id = ""downloadIcon""
                         src=""downloadImage""
                         style='border-bottom-width:0in;border-left-width:0in;border-right-width:0in;border-top-width:0in;padding-bottom:5px;padding-left:6px'>
                </span>
                <div class=""top-rectangle""></div>
                <div class=""arrow-down""></div>
                <br />
                <a href = ""EmailDownloadLink"" id=""EmailDownloadLink"" >
                    Click here to download
                </a>
                <br />
                <br />
                <span style = ""font-size:15px; font-family:Calibri"" > Download link will expire after first download. </span>
            </td>
        </tr>
    </table>
</body>
</html>
";

    }

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Разобрался, смог встроить оба изображения в exe.

<EmbeddedResource Include="MediaShuttleEmail\Images\email-download-button.png" />
<EmbeddedResource Include="MediaShuttleEmail\Images\mediashuttle-logo.png" />

Затем в EmailTemplate.cs я обновил способ чтения встроенных изображений.

Для значения "src" необходимо указать его наContent-Id изображения LinkedResource. Это делается с использованием синтаксиса. Часть "src = cid:" требуется для того, чтобы почтовый клиент мог распознать тег как внедренное изображение, тогда как часть "что угодно" является фактическим Content-Id изображения LinkedResource. Это даст указание почтовому клиенту найти встроенное изображение с именем «что угодно» и отобразить содержимое без запроса http: //.

Затем мне нужно прочитать встроенные изображения изсборка:

 private static Stream GetMSLogoAssembly()
    {
        Stream stream = null;
        Type typeOf = MethodBase.GetCurrentMethod().DeclaringType;
        Assembly assm = typeOf.Assembly;
        foreach (var resourceName in assm.GetManifestResourceNames())
        {
            if (resourceName.Contains("mediashuttle-logo.png"))
            {
                stream = assm.GetManifestResourceStream(resourceName);
            }
        }
        return stream;
    }

    private static Stream GetDownloadArrowAssembly()
    {
        Stream stream = null;
        Type typeOf = MethodBase.GetCurrentMethod().DeclaringType;
        Assembly assm = typeOf.Assembly;
        foreach (var resourceName in assm.GetManifestResourceNames())
        {
            if (resourceName.Contains("email-download-button.png"))
            {
                stream = assm.GetManifestResourceStream(resourceName);
            }
        }
        return stream;
    }

Затем мне нужно создать ресурс изображения из пути к изображению с помощью LinkedResource:

string htmlBody = MailText;
            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlBody, null, "text/html");

            // create image resource from image path using LinkedResource 
            // LinkedResource class represents an embedded external resource in email, ex: a image
            LinkedResource msLogoImageResource = new LinkedResource(GetMSLogoAssembly(), contentType)
            {
                ContentId = "msLogoImage",
                TransferEncoding = System.Net.Mime.TransferEncoding.Base64
            };
            LinkedResource downloadArrowImageResource = new LinkedResource(GetDownloadArrowAssembly(), contentType)
            {
                ContentId = "downloadArrowImage",
                TransferEncoding = System.Net.Mime.TransferEncoding.Base64
            };

            // adding the images linked to htmlView...
            htmlView.LinkedResources.Add(msLogoImageResource);
            htmlView.LinkedResources.Add(downloadArrowImageResource);

            string subjectMessage = $"Content available for download at MediaShuttle. {subject}";
            MailMessage emailMessage = new MailMessage(From, To)
            {
                Subject = subjectMessage,
                Body = MailText,
                Priority = MailPriority.Normal,
                IsBodyHtml = true
            };

            emailMessage.AlternateViews.Add(htmlView);

            SmtpClient smtpClient = new SmtpClient(emailServer);
            smtpClient.Send(emailMessage);

После всего этого мне больше не нужно беспокоиться о том, чтобы изображения копировалисьв любой каталог при развертывании.

0 голосов
/ 17 октября 2019

Для изображений в электронных письмах они действительно должны быть ссылками на изображения в Интернете. Многие почтовые клиенты не показывают изображения, которые необходимо «загрузить».

Использование изображений в Интернете также позволяет отслеживать число людей, которые читают электронную почту, отслеживая попадания к изображению.

Если бы вы создавали приложение Winforms / Service, я бы порекомендовал Copy To Output или в качестве встроенных ресурсов.

Если это веб-сайт, вы должны включить изображения «сжатых для веб-сайтов» вместе с сайтом или разместить их на CDN.

Для мобильных приложений, если это веб-изображения для приложений HTML. Если это собственное мобильное приложение (не для обмена фотографиями), вставьте изображения в exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...