毎日決まった時間にメールを送らなければならない、そんな状況はわりとよくあることだと思います。
でも毎日送る内容が違っていたりすると自動送信にもできないですし、忘れることもあるし大変だよなぁと思い、何かいい方法はないだろうかと考えました。
C#で時間になったらメール作成画面を出力するアプリを作れるとは思うけど。。。
それだと常にアプリが起動していて時間を見張っていないといけないし、、
電源再起動とかのあとそのアプリ起動するの忘れたら元も子もないし、、かといってパソコンを立ち上げた際に自動でアプリを起動させるようにスタートの設定をするのもなんだかめんどくさい。。
ということで結論タスクスケジューラで決まった時間にC#アプリを起動させて、そのC#アプリはメール送信画面を作成したら動作を終了させるようにさせました。
C#アプリケーション
今回C#アプリケーションはC#のフォームアプリケーションにて作成しました。
Visual Studio 2019を使用しました。
OutlookのメールをC#アプリで取り扱えるようにするためには「Microsoft Outlook 16.0 Object Library」を参照に追加します。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/reference.png)
参照を右クリックして参照の追加を選択します。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/outlook-1024x706.png)
Microsoft Outlook 16.0 Object Libraryを選択してOK
今回はメール作成画面だけ出てくれればよいので、FormのロードイベントにてHide関数でForm画面は見えないようにし、メール画面を作成したらClose関数でアプリを終了するようにします。
using Microsoft.Office.Interop.Outlook;
using System;
using System.Windows.Forms;
namespace MailSender
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Formを隠す
Hide();
// outlookメール作成
var application = new Microsoft.Office.Interop.Outlook.Application();
MailItem mailItem = application.CreateItem(OlItemType.olMailItem);
if (mailItem != null)
{
// To
Recipient to = mailItem.Recipients.Add("oaite@kaisha.co.jp");
to.Type = (int)Microsoft.Office.Interop.Outlook.OlMailRecipientType.olTo;
// Cc
Recipient cc = mailItem.Recipients.Add("senpai@kaisha.co.jp");
cc.Type = (int)Microsoft.Office.Interop.Outlook.OlMailRecipientType.olCC;
// アドレス帳の表示名で表示できる
mailItem.Recipients.ResolveAll();
// 件名
mailItem.Subject = "件名";
// 本文
mailItem.Body = "本文";
// 表示(Displayメソッド引数のtrue/falseでモーダル/モードレスウィンドウを指定して表示できる)
mailItem.Display(true);
}
// 終了
Close();
}
}
}
メールの送信処理については以下のサイトを参考にさせていただきました。コピペするだけですぐ実装できましたありがとうございます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9QyUyMyVFMyU4MSU4QiVFMyU4MiU4OU91dGxvb2slRTMlODMlQTElRTMlODMlQkMlRTMlODMlQUIlRTMlODIlOTIlRTYlOTMlOEQlRTQlQkQlOUMlRTMlODElOTklRTMlODIlOEIlRTMlODAlODImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTdjNGFmMWFlNGFmZGI3MmMwZmJkZDg3Y2I4NDNkYTUy&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwbWlub3VyYV9hJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0xYTA2ZGUyNjU3YzFiMGQ3MzA3YWRhNjdjZDRkODUzMw&blend-x=142&blend-y=491&blend-mode=normal&s=4adcf389128f77d7444368dd39327799)
コードを実行もしくはビルドしたらこれでアプリは完成です。
次はタスクスケジューラで決まった時間にこのアプリを実行できるように設定します。
タスクスケジューラにてこのアプリを起動するように設定しますので、実行ファイルをどこかわかりやすい場所に移動しておきます。
今回作成したアプリのフォルダ内のbin\Debug(私の場合MailSender\MailSender\bin\Debug)内の実行ファイルを任意の場所にコピーしておきます。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/sender.png)
タスクスケジューラ設定
windowsのパソコンはタスクスケジューラが標準搭載されています。
左下の検索窓にてタスクスケジューラと打ち込むと見つけることができます。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/scheduler.png)
タスクを作成する際にはタスクスケジューラライブラリを右クリックして、基本タスクの作成をクリックします。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/taskc_create.png)
任意の名前を設定→トリガーを毎日→時間を設定→プログラムの開始を選択→先ほどのアプリを指定という流れになります。
![](https://work-ikinuki.com/wp-content/uploads/2022/10/name.png)
![](https://work-ikinuki.com/wp-content/uploads/2022/10/trigger.png)
![](https://work-ikinuki.com/wp-content/uploads/2022/10/time.png)
![](https://work-ikinuki.com/wp-content/uploads/2022/10/ope.png)
![](https://work-ikinuki.com/wp-content/uploads/2022/10/start_prog.png)
最後に完了を押せば操作は完了です。
これで毎日決まった時間にメール画面が出てくるようになります。
最後に
ここまでお読みいただきありがとうございます。
今回の構成は簡単なテストではうまくいったのは確認していますが、長期の運用でのテストはしていません。。
今の設定ですと土曜や日曜も関係なく毎日処理が実行されますし、すでにメール送信画面がある状態でメール送信画面を出力しようとしたりするとエラーになったりもすると思います。
これについてはアプリ側で休日、祝日の判断ができる必要があるのかなと思います。
土日の判断だけだったらDatetimeでDayofWeekを観れば何曜日かはわかるので対応可能かと思われます。
Google Calendar APIを使うなど、おそらく手段はあると思いますので今後はそれを試してみたいと思っております。
ありがとうございました。
コメント