質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

解決済

2回答

3382閲覧

VBAからOutlookでHTMLメール送る際に、元のコードから改変されるのを防ぎたい

furumototatsuya

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

1クリップ

投稿2019/08/06 14:04

前提・実現したいこと

VBAからOutlookを通して送るHTMLメールが、元のコードのままで送られるようにしたい。
(Outlook側の設定で解決できるのであれば、その設定をお教えいただきたいです。)

発生している問題

<iOSでメールを見た場合> デフォルトメールアプリだけでなくGmailアプリなどで見ても、font-familyが効いておらず、iOSデフォルトの明朝体で表示される。 その他にも、幅100%を指定していても左右にmarginが発生する。それ以外のスタイルは反映している。 <WindowsやMacOSで見た場合> 上記のような問題は見られない。 <送信確認画面で送信ファイルをhtml形式で保存してソースを見てみる> 元のコードはスタイルをすべてインラインにしたもので、font-familyは*にあてていたのに、送信時のhtmlファイルはfont-familyの一部が消えていたりする。(font-family自体は一部残っている)

Outlookを起動するVBAコード

Sub sendMailByOutlook_UTF8() Dim objOutlook As Outlook.Application Set objOutlook = New Outlook.Application Dim objMail As Outlook.MailItem Set objMail = objOutlook.CreateItem(olMailItem) Dim oAccount As Outlook.Account Set oAccount = Session.accounts("メールアカウント") Dim mailBody As String, Target As String Target = メール本文になるHTMLファイルのパス With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Open .LoadFromFile Target mailBody = .ReadText .Close End With With objMail .To = "宛先アドレス" .Subject = "メールタイトル" .HTMLBody = mailBody .BodyFormat = olFormatHTML .SendUsingAccount = oAccount End With '送信画面の確認 objMail.Display End Sub

試したこと

・発送元メールアドレスがGmailなので、CDOで送った場合は上記の問題は起こらなかったため、Outlookを通して送ることで問題が発生しているのではと予想している(CDOはセキュリティ上、使いたくない)
・HTML本文の設定(スタイルや文字コード、宣言など)を数々試したが、どれも同じ結果になった。

補足情報(FW/ツールのバージョンなど)

Office 365を使用しています。

Google APIを使用するしかないのかと考えているのですが、それはそれで骨が折れる方法なようなので、Outlookの設定やVBAで回避できる方法があるようでしたらご教示いただきたくご質問をさせていただきます。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Outlookで一度メールを作成して、「名前を付けて保存」でmsgファイルを出力した後、VBAでそのファイルを開いて送れば、そのままの状態で送信することが可能ですよ。

プラス、簡単に修正も出来きるので便利ですよ。

VBA

1Dim application As Object 2Dim mailItem As Object 3 4Set application = CreateObject("Outlook.Application") 5Set mailItem = application.Session.OpenSharedItem(FileName)'FileNameは任意

投稿2019/08/07 00:11

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

furumototatsuya

2019/08/07 02:59

ありがとうございます!早速試してみます!!
stdio

2019/08/07 06:19

ただ、この方ではmsgファイルのなかの中のHTMLをガチ読みしなければ、VBAでの変更や追加は難しいですよ。
furumototatsuya

2019/08/09 12:41

ご丁寧にありがとうございます。
guest

0

自己解決

#原因
私が記述したコードで言うと、次の部分が原因でした。

VBA

1objMail.Display 'Outlookで送信画面を開く

#解決方法
Outlookで送信画面を開くプロセスでHTMLコードが改変されてしまっているので、.Displayで開いた送信画面から送らないことが回避策となり、objMail.SendでOutlookを開かず送信することで記述通りのHTMLコードを送ることができました。

ちなみに、送信前にやはり一度送信メールを確認したかったので、次のような形にすることでVBAを途切れさせずに送信することができました。

VBA

1 With objMail 'これより前は最初に書いたものと同じコードです。(上記参照) 2 .Subject = "メールタイトル" 3 .HTMLBody = mailBody 4 .BodyFormat = olFormatHTML 5 .SendUsingAccount = oAccount 6 .Display '送信画面の確認 7 Dim whetherToSend As Long 8 whetherToSend = MsgBox("この内容でメール送信してOKですか?", vbOKCancel, "送信確認") 9 If whetherToSend = 2 Then 10 Exit Sub 'キャンセルの場合はここでプロシージャを抜ける 11 Else 12 .Close (olDiscard) '保存せずにOutlookを閉じる 13 .To = "宛先のメールアドレス" '確認画面でご送信しないように、ここで宛先を代入 14 .Send 'Outlookを開かずに送信 15 End If 16 End With

Gmailを使っていて、CDO経由での送信は送信内容に異常は出なかったのですが、セキュリティが問題だったので、GoogleAPIを使わないといけないのかと悩んでいましたが。。
簡単な部分で解決できてよかったです。

ご助言いただいた方、ありがとうございました。

投稿2019/08/09 13:31

furumototatsuya

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問