woman-closes-her-eyes-while-journalling-in-a-notebook

CDO(Microsoft Collaboration Data Objects)を使うと、
裏でOutlookのアプリを使わないで、VBAでMicrosoft365等から直接メールを送れます。


※2022.09.12追記
2022年10月1日に、Exchange Onlineでの基本認証が廃止されることになりました。
CDOを使うやり方が継続できるか怪しくなります。
代替手段としては以下がありますので、よろしければご参照ください。

関連記事:
スプレッドシートを読み取って個々に別内容のメールを送信する簡単な方法



ソースは↓みたいな感じです。
※詳細はネット上にたくさん情報あります。

Set objMessage = CreateObject("CDO.Message")
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "aaa@contoso.com"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxxxxxxxx"
objMessage.Configuration.Fields.Update
objMessage.Send

社員一人一人に、パスワードなど個別に知らせる必要がある情報を送りたいときに使っています。
メールを1件ずつ手で送るなんて悲しすぎます・・・

エラー発生

このマクロをふと実行してみると

実行時エラー '-2147220973 (80040213)':
転送においてサーバーに接続できませんでした


のエラーが・・・

CDOエラー

これがないと手で一人一人にメールを送らないといけない。辛い・・・

エラー解消

ポート番号を変えてみたり、
セキュリティ絡みのパラメータを変えてみたり、
「Microsoftめこっそり使えなくしたのか」と恨み言を言ってみたりw

1時間半くらい悩みました・・・





VPNで社内環境に接続したらあっさり送信できました。

そういえば今まで社内からしか実行したことがありませんでした。
在宅勤務で初めて実行した気がします。

在宅勤務もシステム環境としては大きな変化ですもんね。

意外とハマりポイントな気がするので、共有させていただきます。



Microsoftは会社のIPアドレスを把握して、ちゃんとチェックしているということなんですね。
確かにアカウントとパスワード漏洩したら、全然関係ない人がメールを送信できちゃいますからね。

会社が移転してグローバルIPアドレスが変わり、すぐこのマクロを使おうとするとエラーということなんですかね。