Microsoft365からメール送信を行う場合はOutlookを利用して、Power AutomateやPowerAppsから送信が可能です。ただし、あくまでも個人のアカウントからのメール送信となるとめ、お客様への案内メールなど送信する場合は別途専用アカウント用意する必要などがあります。今回は外部のSMTPリレーサービスとPower Automateを組み合わせてお客様への案内メールを送信する方法を紹介します。
ゴールイメージ
今回のゴールとして、”[email protected]”という送信者アドレスからお客様へ案内メールを送信できること。加えて、“[email protected]”宛てに送られたメールを、MIcrosft365の個人アカウント“[email protected]”で受信するまでを目指します。
※正確にはメールの受信はSMTPでメールサーバーに送られてきたものをPOP3やIMAP、MAPIで受信します。
SendGrid
インターネットサービスの中にはお客様向けの案内メールなどを送信するためのサービスが数多く提供されています。その中で、今回利用するサービスは「SendGrid(https://sendgrid.kke.co.jp/)」を選択しました。こちらのサービスは検証用に個人で利用する程度であれば無料で利用可能なメール配信サービスです。こちらのサービスを利用できるようにセットアップを行います。まずはTopページの「無料ではじめる」から新期会員登録を行います。
差出人情報の登録
アカウントが発行されたら、差出人情報の登録を行います。サインイン後、ダッシュボードの左メニューから「Marketing」-「Sendars」-「Create Sender」を選択します。
From Nameメール送信者として表示される名前From Email Address送信者メールアドレスReply To返信先メールアドレスCompany Address会社(個人)住所Nickname差出人情報を管理するための名前
こちらの情報を登録します。
登録したメールアドレス宛に確認メールが届きますので承認します。
「VERIFIED」にチェックマークが付けば差出人情報の登録は完了です。
APIキーの取得
SendGridのサービスを利用するためのAPIキーを取得します。ダッシュボードの左メニューから「Settings」-「Create API Key」を選択します。キーの名前を入力して、「Full Access」を選択して「Create & View」を選択します。
発行されたキーを保存しておきます。
メール送信テスト
ここまでの設定で、SendGridのSMTPサービスが利用できるか、メールを送信して確認します。PowerShellからAPIキーを設定してメール送信を行ってみましょう。
$Smtp = "smtp.sendgrid.net"
$Port = 2525
$Encode = [System.Text.Encoding]::UTF8
$Account = "apikey"
$Password = "<取得したAPIキー>" | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential $ Account,$ Password
$FromAddress = "[email protected]"
$ToAddress = " [email protected]"
$Subject = "SGTestMail"
$Body = @"
メールテストです。
"@
Send-MailMessage `
-To $ToAddress `
-From $FromAddress `
-SmtpServer $Smtp `
-Credential $Credential `
-UseSsl `
-Encoding $Encode `
-Port $Port `
-Subject $Subject `
-Body $Body
自分から自分宛てに送信したメールですが、無事届いています。最初の設定としてはOKです。
Power Automateでクラウドフローの作成
SendGridにはメールが届いたタイミングで任意のWebhookを利用する機能が提供されています。これを利用して、お客様から返信されたメールの宛先アドレスを実際に受信できるメールアドレスに変換する仕組みをPower Automateのクラウドフローで実装します。具体的には、お客さまからの返信メールの受信者アドレス [email protected] を [email protected] に変換した後、メールをSendGridのAPIを利用して送信します。この機能をSendGridからWebhookで呼び出すことになります。フロー全体は以下となります。
フロー内のいくつかポイントを解説しておきます。
呼び出されるWebhookのUrlを提供する「HTTP要求の受信時」トリガーはプレミアムコネクタとなります。件名、本文、送信者、受信者はそれぞれ変数を作成して格納しています。取得するパラメーターはSendGridの解説ページ「Setting Up The Inbound Parse Webhook(https://docs.sendgrid.com/for-developers/parsing-email/setting-up-the-inbound-parse-webhook)」内の「Default Parameters」を参考に、それぞれ「triggerFormDataValue」関数を使って以下のように取得しています。
Subject triggerFormDataValue('subject')BodytriggerFormDataValue('text')FromtriggerFormDataValue('from')TotriggerFormDataValue('to')
「HTTP」アクションでは、SendGridのWebAPIを利用してメール送信を行います。「トランザクションメールを送信する」を参考に、URI,、jsonデータを設定します。jsonデータには宛先として”[email protected]”を指定しています。authorizationには、“Bearer <取得したAPIキー>”という書式で指定します。
以上で、クラウドフローが完成したので、「HTTP要求の受信時」トリガーに表示されている「HTTP POST の URL」の値を取得しておきます。こちらがWebhookの呼び出しUrlとなります。
MXレコードの登録
SendGridでお客様の返信メールを受け取るには、返信アドレスとなる ”[email protected]" のドメイン”sg..win1.wok”のMXレコードを”mx.sendgrid.net”としてDNSに登録する必要があります。お名前.comを例にするとこのようになります。この設定によって、”[email protected]” のメールがSendGridのサーバーに送られることになります。
ドメインの登録
SendGridで“sg.win1.work”このドメインのメールを受信できるようにドメインの登録を行います。ダッシュボードの左メニューから「Settings」-「Sender Authentication」-「Get Started」を選択します。
お名前.com利用の場合は、「DNShost」は“Other Host(Not Listed)”、「Wichi DNS Host」はお名前.comのDNSサーバーのホスト名“01.dnsv.jp”を入力します。
認証するドメインには“win1.work”を入力します。
画面上にCNAMEの一覧が表示されますので、こちらすべてをDNSサーバーに登録します。
お名前.comを例にするとこのようになります。
DNSの登録が完了したら、「Verfy」ボタンを選択します。この画面が表示されればドメインの登録完了となります。
Inbound Parse Webhookの設定
SendGridでメールが届いたタイミングで任意のWebhookを利用するために「Inbound Parse Webhook」の設定を行います。ダッシュボードの左メニューから「Settings」-「Inbound Parse」-「Add Host & URL」を選択します。
テスト実行
全ての設定が完了したとこをで、今回の目的となる動作を一通り実行してみましょう。まずはお客様へ案内メールを送信します。送信元"[email protected]"からお客様アドレスの" [email protected]"へSendGrid経由でメールを送信します。
$Smtp = "smtp.sendgrid.net"
$Port = 2525
$Encode = [System.Text.Encoding]::UTF8
$Account = "apikey"
$Password = "<取得したAPIキー>" | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential $ Account,$ Password
$FromAddress = "[email protected]"
$ToAddress = "[email protected]”
$Subject = "お客様へのご案内"
$Body = @"
お客様へのご案内メールのテスト送信です。
よろしくお願いいたします。
"@
Send-MailMessage `
-To $ToAddress `
-From $FromAddress `
-SmtpServer $Smtp `
-Credential $Credential `
-UseSsl `
-Encoding $Encode `
-Port $Port `
-Subject $Subject `
-Body $Body
お客様にメールが配信されました。このメールに返信します。返信先は"[email protected]"です。
SendGridからPower Automateのクラウドフローが呼び出され、"[email protected]"へメールが転送され受信ができました。
以上、Power Automateと SendGridの機能を組み合わせたメール転送サービスの構築方法となります。WebhookやWeb APIをフル活用することで、単体では機能不足なサービスも、色々と組み合わせて機能補強が図れるようになります。今回は最初のメール送信部分をPowerShellのコードで記載していますが、こちらもローコード開発が当然可能です。プラグラムを一行も書かずにメール転送サービスが構築可能ということです。Microsoft365やSendGrid以外にも数えきれないくらいのWebサービスが提供されていますので、組み合わせ次第では最強のシステムの開発ができそうです。