Как получить КОРРЕКТНУЮ ссылку на файл/папку для дальнейшей отправки по почте?

Автор Тема: Как получить КОРРЕКТНУЮ ссылку на файл/папку для дальнейшей отправки по почте?  (Прочитано 635 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • Skype: pashin.evgeniy
Добрый день, коллеги.

Нужно получить ссылку на файл/папку, что затем выслать её в почтовом уведомлении.

Есть решение получения ссылки, но когда высылаю её на почту, то при нажатии на неё мышкой ничего не происходит.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. using Autodesk.Connectivity.WebServices;
  11.  
  12. namespace LinkMaestro
  13. {
  14.     public partial class SettingsDialog : Form
  15.     {
  16.         private bool m_isVaultPro;
  17.         private Dictionary<LinkFormat, string> m_linkFormatMap = new Dictionary<LinkFormat, string>()
  18.         {
  19.             {LinkFormat.VaultExplorer, "Vault Explorer"},
  20.             {LinkFormat.VaultPath, "Vault Path"},
  21.             {LinkFormat.WebClient, "Web Browser"}
  22.         };
  23.  
  24.         public Settings Settings
  25.         {
  26.             get
  27.             {
  28.                 Settings settings = new Settings()
  29.                 {
  30.                     FileLinkFormat = ConvertLinkFormat(m_fileLinkComboBox.Text),
  31.                     FolderLinkFormat = ConvertLinkFormat(m_folderLinkComboBox.Text),
  32.                     ItemLinkFormat = ConvertLinkFormat(m_itemLinkComboBox.Text),
  33.                     ChangeOrderLinkFormat = ConvertLinkFormat(m_coLinkComboBox.Text),
  34.                     MultiWorkgroups = m_multiCheckBox.Checked,
  35.                     HTMLFormat = m_htmlFormatCheckBox.Checked
  36.                 };
  37.  
  38.                 return settings;
  39.             }
  40.  
  41.             set
  42.             {
  43.                 m_fileLinkComboBox.Text = ConvertLinkFormat(value.FileLinkFormat);
  44.                 m_folderLinkComboBox.Text = ConvertLinkFormat(value.FolderLinkFormat);
  45.                 m_itemLinkComboBox.Text = ConvertLinkFormat(value.ItemLinkFormat);
  46.                 m_coLinkComboBox.Text = ConvertLinkFormat(value.ChangeOrderLinkFormat);
  47.                 m_multiCheckBox.Checked = value.MultiWorkgroups;
  48.                 m_htmlFormatCheckBox.Checked = value.HTMLFormat;
  49.             }
  50.         }
  51.  
  52.         public SettingsDialog(Settings settings, bool isVaultPro)
  53.         {
  54.             InitializeComponent();
  55.  
  56.             m_isVaultPro = isVaultPro;
  57.  
  58.             if (!m_isVaultPro)
  59.             {
  60.                 m_itemLinkComboBox.Enabled = false;
  61.                 m_coLinkComboBox.Enabled = false;
  62.             }
  63.  
  64.             this.Settings = settings;
  65.  
  66.             m_okButton.Select();
  67.             m_descriptionLabel.Text = String.Empty;
  68.         }
  69.  
  70.  
  71.  
  72.         private string ConvertLinkFormat(LinkFormat format)
  73.         {
  74.             string debug = m_linkFormatMap[format];
  75.             return m_linkFormatMap[format];
  76.         }
  77.  
  78.         private LinkFormat ConvertLinkFormat(string format)
  79.         {
  80.             return m_linkFormatMap.First(n => n.Value == format).Key;
  81.         }
  82.  
  83.         private void m_okButton_Click(object sender, EventArgs e)
  84.         {
  85.             DialogResult = DialogResult.OK;
  86.         }
  87.  
  88.         private void m_cancelButton_Click(object sender, EventArgs e)
  89.         {
  90.             DialogResult = DialogResult.Cancel;
  91.         }
  92.  
  93.         private void m_siteListButton_Click(object sender, EventArgs e)
  94.         {
  95.             if (!UserUtil.IsAdmin(GlobalManager.WebServices))
  96.             {
  97.                 MessageBox.Show("This command can only be run by administrators");
  98.                 return;
  99.             }
  100.  
  101.             SiteList sitelist = SiteList.Load();
  102.  
  103.             ConfigSiteListDialog dialog = new ConfigSiteListDialog(sitelist);
  104.  
  105.             DialogResult result = dialog.ShowDialog();
  106.             if (result != DialogResult.OK)
  107.                 return;
  108.  
  109.             sitelist = dialog.SiteList;
  110.             sitelist.Save();
  111.         }
  112.  
  113.         private void m_ComboBox_SelectedIndexChanged(object sender, EventArgs e)
  114.         {
  115.             ComboBox combo = sender as ComboBox;
  116.             SetDescriptionText(combo);
  117.         }
  118.  
  119.         private void SetDescriptionText(ComboBox combo)
  120.         {
  121.             if (combo != null)
  122.             {
  123.                 string value = combo.Text;
  124.                 LinkFormat linkFormat = ConvertLinkFormat(value);
  125.  
  126.                 if (linkFormat == LinkFormat.VaultExplorer)
  127.                 {
  128.                     m_descriptionLabel.Text =
  129.                         "A link to an object inside Vault Explorer.  Following the " +
  130.                         "link will cause Vault Explorer to open and navigate to the " +
  131.                         "object.";
  132.                 }
  133.                 else if (linkFormat == LinkFormat.VaultPath)
  134.                 {
  135.                     m_descriptionLabel.Text =
  136.                         "The full Vault path.  Technically this is not a link.";
  137.                 }
  138.                 else if (linkFormat == LinkFormat.WebClient)
  139.                 {
  140.                     m_descriptionLabel.Text =
  141.                         "A link to a page inside the Vault web client.  Following " +
  142.                         "the link will cause the default web browser to navigate to " +
  143.                         "the object in the web browser." + Environment.NewLine +
  144.                         "NOTE: This will link to a specific version, so the link may go out of date over time.";
  145.                 }
  146.                 else
  147.                 {
  148.                     m_descriptionLabel.Text = String.Empty;
  149.                 }
  150.             }
  151.         }
  152.  
  153.         private void m_ComboBox_Enter(object sender, EventArgs e)
  154.         {
  155.             ComboBox combo = sender as ComboBox;
  156.             SetDescriptionText(combo);
  157.         }
  158.     }
  159. }

Оффлайн Дмитрий Емельянов

  • Administrator
  • Сообщений: 35
  • Карма: 4
Евгений, вы можете сравнить ссылку, которую получаете при помощи своего кода, с ссылкой, которую можно получить из интерфейса Vault?
Есть два типа ссылок: URL и та, которая запускает клиент Vault с переходом к файлу.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • Skype: pashin.evgeniy
Добрый день, Дмитрий.

Есть два типа ссылок: URL и та, которая запускает клиент Vault с переходом к файлу.
Мне нужен второй вариант - с переходом к файлу/папке.
И да, действительно содержание ссылок отличаются... Подправил!
« Последнее редактирование: 31-05-2017, 11:51:16 от Пашин Евгений »

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • Skype: pashin.evgeniy
Дмитрий, тут такое дело: при нажатии на ссылку происходит загрузка файла с расширением *.acr, при двойном нажатии на который происходит желанный переход в хранилище Vault к указанному файлу. ОДНАКО это не совсем тот эффект, который я пытаюсь достичь.

На самом деле хочется, чтобы вызов происходил при нажатии на ссылку внутри сообщения.

Может есть какое-нибудь решение, как это сделать (без скачивания *.acr-файла)?

Сама ссылка получается в таком виде:
http://vault01/AutodeskDM/Services/EntityDataCommandRequest.aspx?Vault=%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%B0%D1%8F%20%D0%B1%D0%B0%D0%B7%D0%B0&ObjectId=%24%2f%D0%9F%D0%B0%D1%88%D0%B8%D0%BD+%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9+-+%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC+Email+Notification%2fReset+Parameters+in+AutoCAD+2017.bat&ObjectType=File&Command=Select

Сам *.acr-файл выглядит так:
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ADM xmlns="http://schemas.autodesk.com/msd/plm/ExplorerAutomation/2004-11-01">
  3.   <Server>vault01</Server>
  4.   <Vault>Контентная база</Vault>
  5.   <Operations>
  6.     <Operation ObjectType="File">
  7.       <ObjectID>$/Пашин Евгений - тестируем Email Notification/Reset Parameters in AutoCAD 2017.bat</ObjectID>
  8.       <Command>Select</Command>
  9.     </Operation>
  10.   </Operations>
  11. </ADM>

И ещё, есть ли возможность получить ссылку на папку? А то я что-то её не увидел в Vault.

Оффлайн Дмитрий Емельянов

  • Administrator
  • Сообщений: 35
  • Карма: 4
Нет, можно только путём скачивания файла, так как приложением по-умолчанию (обработчиком расширения) для открытия таких файлов является Vault. Это особенность Windows. Возможно, ссылку можно получить для Vault Office (или тонкий клиент), который работает как раз через браузер.

На папку получить ссылку возможности не было (в 2014 версии, под которую я ещё писал). Сомневаюсь, что она появилась сейчас.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • Skype: pashin.evgeniy
Сомневаюсь, что она появилась сейчас.

В Vault 2017 пока не появилась.

Нет, можно только путём скачивания файла, так как приложением по-умолчанию (обработчиком расширения) для открытия таких файлов является Vault.

А что если формировать *.acr-файл где-то на сервере (в доступном для всех месте НА ЧТЕНИЕ), а в сообщении указывать гиперссылку к этому файлу, тогда запуск получается из самой почты.

Вручную получилось, теперь надо сделать автоматически.

Отмечено как Решение Пашин Евгений 26-06-2017, 14:50:50

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 620
  • Карма: 8
  • Skype: pashin.evgeniy
Три варианта получения ссылок:
1. В виде большой ссылки на скачивание *.acr-файла. Код показан выше.
2. В виде ссылки на сам *.acr-файл. Содержание файла показано выше.
3. В виде вложенного *.acr-файл. - оптимально. Сохраняем  файл куда-нибудь во временную папку, а затем отправляем файл, как вложение.

В моём случае я провожу отправку сообщения через Outlook:

Создайте *.acr-файл:
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ADM xmlns="http://schemas.autodesk.com/msd/plm/ExplorerAutomation/2004-11-01">
  3.   <Server>Имя_сервера</Server>
  4.   <Vault>Имя_хранилища</Vault>
  5.   <Operations>
  6.     <Operation ObjectType="File">
  7.       <ObjectID>$/Тестовая_папка/Имя_файла.txt</ObjectID>
  8.       <Command>Select</Command>
  9.     </Operation>
  10.   </Operations>
  11. </ADM>

Отправьте сообщение так:
Код - vb.net [Выбрать]
  1.        ' Формируем полное имя *.acr-файла
  2.        Dim LinkName As String = "Link" & Format(Now(), "yyyyMMddHHmmssffff") & ".acr"
  3.        ' Создаём процедуру создания сообщения на отправку
  4.        Dim oApp As Microsoft.Office.Interop.Outlook._Application
  5.        oApp = New Microsoft.Office.Interop.Outlook.Application
  6.        Dim oMsg As Microsoft.Office.Interop.Outlook._MailItem
  7.        oMsg = oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
  8.        ' Получаем параметры для отправки
  9.        ' Тема сообщения
  10.        oMsg.Subject = "Тема сообщения"
  11.        ' Ссылка в формате HTML
  12.        Dim RealLink As String = Replace(LinkName, Chr(32), "%20")
  13.        ' Ссылка в формате HTML в виде тега
  14.        Dim Url As String = "<a href='" & "Папка_где_лежит_файл_acr\" & LinkName & "'>кликните, чтобы перейти к файлу в хранилище</a>" ' Если захочется вставить как ссылку в тексте сообщения
  15.        ' Подготовка содержимого письма
  16.        ' Содержимое письма
  17.        oMsg.HTMLBody += "Автоматическое уведомление об изменении состояния жизненного цикла файла:" + VbCrLf
  18.        ' Содержимое письма формируете строки
  19.        ' ****************
  20.        oMsg.HTMLBody += "Текст с тегами"
  21.        oMsg.Attachments.Add ("Путь к файлу acr")
  22.        ' Формат содержимого в виде HTML
  23.        oMsg.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML
  24.        oMsg.To = "Кому"
  25.        oMsg.CC = "Копия кому"
  26.        ' Отправка сообщения
  27.        oMsg.Send()

Также можно выполнить это с помощью SMTP, но так как это вариант не сработал - его не выкладываю.