пытается принять фотографию в качестве вложения в чат-чат Microsoft и отправить ее в виде вложения электронной почты C# - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь принять фотографию в качестве вложения в диалоге чат-бота Microsoft waterFall ... затем отправляю ее как вложение или (даже в теле) функции электронной почты (которую я создал) ... функции электронной почты кажется, что работает .... однако я не могу передать вложение фотографии в электронном письме

это похоже на:

не может преобразовать из вложений схемы бота Microsoft в строку

это мой код: первый метод - попросить пользователя загрузить фотографию

  private static async Task<DialogTurnResult> UploadAttachmentAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        stepContext.Values["desc"] = (string)stepContext.Result;
        if (lang == "en")
        {
            lang = "en";
            return await stepContext.PromptAsync(

                attachmentPromptId,
                new PromptOptions
                {
                    Prompt = MessageFactory.Text($"Can you upload a ScreenShot of the Error?"),
                });
        }
        else if (lang == "ar")
        {
            lang = "ar";
            return await stepContext.PromptAsync(

               attachmentPromptId,
               new PromptOptions
               {
                   Prompt = MessageFactory.Text($"هل يمكنك تحميل لقطة شاشة للخطأ؟"),
               });
        }
        else return await stepContext.NextAsync(); 


    }

второй метод - сам код загрузки:

   private async Task<DialogTurnResult> UploadCodeAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {

         List<Attachment> attachments = (List<Attachment>)stepContext.Result;
         string replyText = string.Empty;
         foreach (var file in attachments)
         {
             // Determine where the file is hosted.
             var remoteFileUrl = file.ContentUrl;

             // Save the attachment to the system temp directory.
             var localFileName = Path.Combine(Path.GetTempPath(), file.Name);

             // Download the actual attachment
             using (var webClient = new WebClient())
             {
                 webClient.DownloadFile(remoteFileUrl, localFileName);
             }

             replyText += $"Attachment \"{file.Name}\"" +
                          $" has been received and saved to \"{localFileName}\"\r\n";
         }

         return await stepContext.NextAsync();                          
    }

, а третий - сохранить фотография как результат действия, чтобы передать его позже

  private static async Task<DialogTurnResult> ProcessImageStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        stepContext.Values["picture"] = ((IList<Attachment>)stepContext.Result)?.FirstOrDefault();
        await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Attachment Recieved...Thank you!!") }, cancellationToken);
        return await stepContext.EndDialogAsync();
    }

и, наконец, шаг, на котором я сохраняю значения, полученные из каждого шага, и должен быть передан в теле письма: (вложение должно быть сохранено в ticketProfile.screenShot)

 private static async Task<DialogTurnResult> SummaryStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        var ticketProfile = await _ticketDialogAccessor.GetAsync(stepContext.Context, () => new Ticket(), cancellationToken);

        ticketProfile.userType = (string)stepContext.Values["userType"];
        ticketProfile.staffType = (string)stepContext.Values["staffType"];
        ticketProfile.empIdInfo = (string)stepContext.Values["shareId"];
        ticketProfile.emailInfo = (string)stepContext.Values["shareEmail"];
        ticketProfile.helpType = (string)stepContext.Values["helpType"];
        ticketProfile.describeHelp = (string)stepContext.Values["desc"];
        ticketProfile.screenShot = (Attachment)stepContext.Values["picture"];

        string[] paths = { ".", "adaptiveCard.json" };
        var cardJsonObject = JObject.Parse(File.ReadAllText(Path.Combine(paths)));

        var userEmailValue = cardJsonObject.SelectToken("body[2].facts[0]");
        var userIdValue = cardJsonObject.SelectToken("body[2].facts[1]");
        var userTypeValue = cardJsonObject.SelectToken("body[2].facts[2]");
        var staffTypeValue = cardJsonObject.SelectToken("body[2].facts[3]");
        var helpTypeValue = cardJsonObject.SelectToken("body[2].facts[4]");
        var describeValue = cardJsonObject.SelectToken("body[2].facts[5]");


        userEmailValue["value"] = ticketProfile.emailInfo;
        userIdValue["value"] = ticketProfile.empIdInfo;
        userTypeValue["value"] = ticketProfile.userType;
        staffTypeValue["value"] = ticketProfile.staffType;
        helpTypeValue["value"] = ticketProfile.helpType;
        describeValue["value"] = ticketProfile.describeHelp;


        var attachment = new Attachment()
        {
            Content = cardJsonObject,
            ContentType = "application/vnd.microsoft.card.adaptive"
        };

         var reply = stepContext.Context.Activity.CreateReply();
        reply.Attachments = new List<Attachment>();

        reply.Attachments.Add(attachment);
        await stepContext.Context.SendActivityAsync(reply);
        Email($"Here you go{Environment.NewLine}{ticketProfile.screenShot}");



        return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
    }

функция электронной почты:

 public static void Email(string htmlString)
    {
        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient();
            mail.From = new MailAddress("hassanjarko55@gmail.com");

            mail.Subject = "New Ticket";

            mail.Body = htmlString;
            SmtpServer.Port = 587;
            SmtpServer.Host = "smtp.gmail.com";
            SmtpServer.EnableSsl = true;
            SmtpServer.UseDefaultCredentials = false;
            SmtpServer.Credentials = new NetworkCredential("user Name, "password");
            SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;
            mail.To.Add(new MailAddress("hassan.jarko@yahoo.com"));
            mail.IsBodyHtml = true;

            SmtpServer.Send(mail);
        }

        catch (Exception e)
        {

            e.ToString();

        }
    }



 public class Ticket
{
    public string userType { get; set; }

    public string staffType { get; set; }

    public string helpType { get; set; }

    public string helpWith { get; set; }


    public string describeHelp { get; set; }

    public Attachment screenShot { get; set; }

    public string emailInfo { get; set; }

    public string empIdInfo { get; set; }
}

любая помощь будет высоко ценится ... заранее спасибо

Ответы [ 2 ]

1 голос
/ 25 марта 2020

большое спасибо за @Alphonso ... ценим ваши усилия по оказанию помощи ... я сделал следующее, чтобы отправить изображение, полученное от моего чат-бота, в виде вложения в виде электронного письма: 1-переместил метод функциональности моей электронной почты в SummaryStepAsyn c метод. 2-скачал изображение, принятое от пользователя с помощью WebClient

 string contentURL = ticketProfile.screenShot.ContentUrl;
        string name = ticketProfile.screenShot.Name;
        using (var client = new WebClient())
        {
            client.DownloadFile(contentURL, name);
            client.DownloadData(contentURL);
            client.DownloadString(contentURL);
        }

3-передал его на мой электронный адрес

 try
        {
            HttpClient httpClient = new HttpClient();



            //Help Desk Email Settings
            MailMessage helpDeskMail = new MailMessage();
            if (ticketProfile.screenShot != null)
            {
                System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(ticketProfile.screenShot.Name);
                helpDeskMail.Attachments.Add(data);
            }

вот оно :)

0 голосов
/ 24 марта 2020

Вы пытались прикрепить имя файла вместо присоединения типа microsoft.bot.schema.attachment

также посмотрите @ это может помочь вам Как добавить вложение в электронное письмо используя System. Net .Mail?

Также в функцию электронной почты также необходимо добавить этот код, чтобы иметь вложение в вашей электронной почте

mail.Attachments.Add(new Attachment());

Примечание: Я не обладаю такими большими знаниями в C#, но мне нравится участвовать в таких вопросах, на которые нет ответов, чтобы помочь будущим программистам

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