MQLの解説記事でよく見かける「\nで改行する」というサンプルコードを、日本語入力環境でそのままコピペすると、実際には改行されず「¥nat」のような余計な文字列がメール本文にそのまま出力されてしまうことがあります。バックスラッシュ(\)と円記号(¥)が日本語フォントでは見分けづらく、コピペ元と貼り付け先で文字が変わってしまうためです。

この記事では、インジケーターやEAからメールを送るSendMail関数の書式・引数の意味に加えて、この改行文字の落とし穴と、送信前に必要なMT4側の設定漏れしやすいポイントまで解説します。

SendMail関数

SendMail関数とは、インジケーターやEAにメールを送る関数になります。

よくインジケーターなどのシグナルなどをメールアドレスに飛ばしたいという人が活用する関数になります。

SendMail関数の書式

SendMail関数の書式は以下のようになります。

bool SendMail(
string subject,
string some_text
);

SendMail関数の引数の説明

SendMail関数の引数を説明します。

string subject

subjectは送信するe-mailのタイトルを指定します。

日本語文字を使用すると文字化けする場合があるのでアルファベットを使用することをおすすめします。

string some_text

some_textは送信するe-mailの本文を指定します。改行にはバックスラッシュ+n(\n)を使用します。

日本語入力環境でコードをコピペすると、この「バックスラッシュ+n」が全角の円記号+n(¥n)に化けてしまうことがあります。見た目はよく似ていますが、MQL4のコンパイラは¥nを改行として扱わず、そのまま「¥nat」のような文字列として本文に出力してしまいます。コードエディタに貼り付けたら、必ず半角のバックスラッシュ(\)になっているか確認してください。

SendMail関数を使う前の準備

送信先のメールアドレスなどはMT4上で行います。

MT4の上部メニューにある「ツール→オプション」を選択すると、オプション画面が開きます。

その中の「Eメール」タブが設定画面です。

SMTPサーバーと送信元・宛先のメールアドレス・SMTP認証のログイン情報を入力したら、画面上部の「メールを有効にする」のチェックボックスを必ずオンにしてください。ここのチェックが入っていないと、コード側にエラーがなくてもSendMail関数はメールを送信できません。

SendMail関数ではこの設定されたメールを送信します。

設定完了後に「テスト」ボタンを押すとテストメールを送信できるので、

テストメールを受信できればSendMail関数によるメール送信も正常に行うことが可能になります。

SendMail関数の使い方

SendMail関数の使い方は以下のようになります。

string title = Symbol() + ", M" + IntegerToString(Period()) + ": Buy!!.";
string text = "Open Buy\nat " + TimeToString(TimeCurrent());
SendMail(title, text);
Copy

"Open Buy\nat "の部分は、半角のバックスラッシュ(\)とnを組み合わせた改行コードです。これで「Open Buy」の後に改行が入り、次の行に約定時刻が表示されます。

実際のEAやインジケーターに組み込む場合は、この処理をOnTick()などの毎ティック呼ばれる場所にそのまま置かないよう注意してください。エントリー条件が成立している間、毎ティックSendMailが呼ばれ続けると、短時間に大量のメールが送信され、メールサーバー側からスパム扱いされて以降の送信がブロックされることがあります。エントリーやシグナル発生など「状態が変わった瞬間」だけ送信されるように、フラグ管理や重複チェックと組み合わせて使ってください。

まとめ

今回は、SendMail関数について解説しました。

SendMail関数はメールを活用したインジケーターやEAを使う場合は必須ですが、改行コード(\n)の文字化けと「メールを有効にする」チェックボックスの入れ忘れの2つで動かないケースがほとんどです。この2点さえ押さえておけば、あとは書式通りに書くだけで使いこなせます。

関連記事