概要
VBAでGmailのメールを作成する方法を記載していきますが、このやり方は、以下に該当する方におすすめです。
- ちょっとしたメールを送信するのにわざわざAPIを使えるようにするのはめんどくさい。
- 自分で送信ボタンを押して確実に送信されたことを確認したい。
いや、自分で送信ボタンを押す自体めんどくさい、マクロ実行したらもう勝手に送ってくれという方は、このやり方はおすすめしません。
またVBAでメールを作成と書きましたが、実際に作るのはURLです。
VBAでURLを作成し、
そのURLをブラウザで表示させるという仕組みになります。
VBAでGmailのメール作成画面表示
宛先、件名、本文を元にメールを作成していきます。
手順としては、URL作成→URLを開く→送信ボタンをユーザがクリックする、という流れです。
URL作成
https://mail.google.com/mail/?view=cm
このURLに、パラメータを連結させます。
パラメータは以下の通り(ほぼまんまです)
パラメータ | 意味 |
---|---|
&to= | To |
&cc= | Cc |
&bcc= | Bcc |
&su= | 件名 |
&body= | 本文 |
本文、件名、To、Cc、Bccを渡して、URLを返すプロシージャを作成します。 |
Private Function getUrl(body As String, Optional subj As String = "", Optional addr As String = "", Optional cc As String = "", Optional bcc As String = "") As String
Dim url As String: url = "https://mail.google.com/mail/?view=cm"
Dim prams(4) As String
prams(0) = IIf(Len(addr) > 0, "&to=" & addr, "")
prams(1) = IIf(Len(cc) > 0, "&cc=" & cc, "")
prams(2) = IIf(Len(bcc) > 0, "&bcc=" & bcc, "")
prams(3) = IIf(Len(subj) > 0, "&su=" & subj, "")
prams(4) = "&body=" & encodeText(body)
getUrl = url & Join(prams, "")
End Function
'文字列エンコード
Private Function encodeText(text As String) As String
Dim enc As Variant: enc = Split("[-]-%-\-#-'-|-`-^-""-<->-{-}-;-?-:-@-&-=-+-$-,", "-")
Dim e As Variant
For Each e In enc
text = Replace(text, e, Application.WorksheetFunction.EncodeURL(e))
Next e
encodeText = Replace(text, vbLf, "%0D%0A")
End Function
文字列エンコードは、URLで使用できないもののみをエンコードし、
最後にvbLf
を%0D%0A
に置換しています。
件名は、なぜかエンコードした文字がそのまま表示されるのでエンコードしてません。
(エンコードしないとエラーになる文字もあるかも)
URLを開く
VBAからコマンドラインを実行し、URLを開きます。
Private Sub openUrl(url As String)
CreateObject("WScript.shell").Run "cmd /c start" & " " & String(2, Chr(34)) & " " & Chr(34) & url & Chr(34), 0, True
End Sub
ちなみにコマンドは結果的に以下になります。
cmd /c start "" https://mail.google.com/mail/?view=cm...
メール作成
Public Sub main()
Dim addr As String: addr = Range("C2").Value
Dim cc As String: cc = Range("C3").Value
Dim subj As String: subj = Range("C5").Value
Dim body As String: body = Range("C6").Value
Dim url As String: url = getUrl(body, subj, addr, cc)
Call openUrl(url)
End Sub
おまけ
このURLを作成してメール送信画面を表示させる方法は、Web版のOutlookでもできます。
ただ、Outlookでは、件名と本文をURLに連結させることはできましたが、宛先はToのみしか連結できませんでした。
CC、BCCは対応していないみたいです。
URL:https://outlook.office365.com/mail/deeplink/compose?
パラメータ | 意味 |
---|---|
subject= | 件名 |
body= | 本文 |
to= | To |
Private Function getUrl(body As String, Optional subj As String, Optional addr As String) As String
Dim url As String: url = "https://outlook.office365.com/mail/deeplink/compose?"
Dim prams(2) As String
prams(0) = "&body=" & encodeText(body)
prams(1) = IIf(Len(subj) > 0, "&subject=" & subj, "")
prams(2) = IIf(Len(addr) > 0, "&to=" & addr, "")
getUrl = url & Join(prams, "")
end Function