Microsoft Flow

Pracując nad moim rozwiązaniem umożliwiającym wysyłanie wiadomości e-mail z informacji tworzonych i przechowywanych w SharePoint doszedłem do wniosku, iż dobrym pomysłem byłoby, aby obrazy w takich e-mailach nie były osadzane w postaci adresu URL prowadzącego do pliku, umieszczonego w bibliotece SharePoint (takie podejście opisałem tutaj), ponieważ w takim rozwiązaniu użytkownik, nie mający dostępu do SharePoint lub nie będący zalogowanym, zwyczajnie tych obrazów nie zobaczy.

Jak osadzić obrazy w treści e-maila?

Istnieją w zasadzie trzy podejścia:

  1. Atrybut „src” wskazujący absolutny adres URL pliku, przechowywanego na jakimś serwerze;
  2. Atrybut „src=cid:” (Content-ID) – tzw. wewnętrzne linkowanie w e-mailu, pomiędzy fizycznie dołączonym załącznikiem i jego wystąpieniem w treści, gdzie jest wyświetlany, korzystając z parametru „cid” (źródło);
  3. Osadzanie obrazu korzystając z ciągu znaków zakodowanych base64 wstawionych jako wartość atrybutu „src=data:image/jpeg;base64,<base64-encoded-image>” (albo png, albo gif), w tym podejściu cały obraz jest po prostu wstawiony do treści wiadomości (źródło).

Ad. 1 – działa wspaniale tak długo, jak użytkownik ma dostęp do pliku…

Ad. 2 – Microsoft Flow aktualnie pozwala na dołączenie tylko jednego pliku. Nie istnieje możliwość wstawienia wielu załączników (można na to głosować tutaj). Także podejście, w którym obrazy są dołączone, a następnie wyświetlane przy użyciu „cid” niestety nie jest zbytnio przydatne.

Ad. 3 – wydawało się dość proste, jednak miałem na uwadze fakt, iż w zasadzie większość klientów poczty elektronicznej nie wspiera wyświetlania obrazów wstawionych jako zakodowane ciągi base64. Ten stary, jednak wciąż na czasie post pokazuje, jak wygląda kwestia wsparcia dla tej metody: https://www.campaignmonitor.com/blog/email-marketing/2013/02/embedded-images-in-html-email/

Podejście z użyciem base64

Z uwagi na największe szanse powodzenia, wybrałem to podejście. Udało mi się je zrealizować w kilku krokach (jest ich więcej, ponieważ Flow nie obsługuje żadnych wyrażeń regularnych. Można na tę funkcję głosować tutaj):

  1. Najpierw przetwarzam treść maila, by poznać wszystkie adresy URL obrazów. Robię to, używając najpierw akcji „split”, podając jako separator token ‚ src=” ‚ (tak, wraz z cudzysłowem).
  2. Następnie, dla każdego elementu z listy sprawdzam, czy bieżący element zaczyna się od ciągu „http”. Jeśli tak, oznacza to, że mam do czynienia z adresem URL obrazu.
  3. Następnie wyodrębniam adres URL obrazu, korzystając z poniższego wyrażenia (od początku, do zamykającego cudzysłowu):
    substring(item(), 0, indexOf(item(), '"'))
  4. Następnie używam akcji SharePoint do pobrania zawartości pliku korzystając ze ścieżki (rozbita na bezwzględny adres URL do witryny, w której znajduje się obraz i adresu względnego do witryny, dla samego pliku).
  5. W odpowiedzi otrzymuję obiekt, z którego chcę uzyskać wartość atrybutu „$contents” i następnie zamienić nim wartość atrybutów „src” w treści e-maila. W tym celu korzystam z poniższego wyrażenia:
    replace(variables('var_Body_Str'), outputs('Image_Path'), concat('data:image/png;base64,', body('Get_file_content_using_path')?['$content']))

I w zasadzie to wszystko. Podglądając treść maila w trakcie wykonywania się przepływu pracy widziałem poprawnie budowany HTML. Następnie, gdy otworzyłem otrzymaną wiadomość korzystając z Outlook Web Access, obrazki wyświetliły się prawidłowo:

Microsoft Flow insert base64 encoded images to the e-mail

 

Dzięki za lekturę! A może masz inne pomysły na rozwiązanie tego problemu? Podziel się nimi w komentarzach! 🙂

Cześć! Nazywam się Tomasz. Jestem wielkim fanem automatyzacji procesów i analizy biznesowej. Skupiam się na rozwijaniu moich umiejętności w pracy z produktami Nintex i Microsoft: w szczególności Office 365, SharePoint. Posiadam ponad 8 lat doświadczenia w pracy z SharePoint.