Yahoo Mail にメールを送る時は、改行に注意する。

Yahoo Mail 関係で困っていた人がいらっしゃったので、メモを残しておきます。
この話は、だいぶ昔に他のブログで話題になっていたので目新しい話ではありません...。


まず、Yahoo Mail 用に設定します。Gmail の時のような苦労は無いので簡単です。


以下のように、\n で改行されたメールを送るスクリプトを用意します。

int start()
{
   string msg = " Hello \n This is test \n";
   SendMail("MailTest 1 ",msg);
   return(0);
}


このスクリプトを実行してもメールが届かないので、まずはログを確認します。
ログには以下のようなエラーが記録されています。

See http://pobox.com/~djb/docs/smtplf.html 
と書いてあるので、実際にそのサイトを確認してみると LF( \n ) 単独で使うのは駄目で、CR LF( \r\n ) を使うように と書いてあります。


これで全ての謎は解けた!!と以下のように正しく書き換えます。

int start()
{
   string msg = " Hello \r\n This is test \r\n";
   SendMail("MailTest 2 ",msg);
   return(0);
}

これで送信できるはず…と、実行してみると、全く同じエラーが繰り返されてしまいます。

↑ログを良く見てみると、エラーが起きているのは、修正したスクリプト( =メールのタイトルが MailTest 2 ) ではなく、最初のスクリプトが送信したメール( =MailTest 1 ) が原因となっているようです。



…このように、一度送信に失敗してしまうと、過去に送信に失敗したメールを何度も再送しようとする為に、その後の正常なメールすらも送れなくなるのです。



(この段階で思考停止してしまうと、\r\n でもダメ…と錯覚してしまうんですね…。
もっとも、このサンプルではメールのタイトルを修正前後でわざわざ変えているので、気がつけています。
ログファイルに何が出力されているのか注意して、上手く利用することが重要です..。



原因が分かったところで、一旦、MetaTrader4 を再起動してから、MailTest 2 を送ってみると問題なく送られます。


Yahoo Mailで確認してみると…

正しく改行できています。


今日の教訓:メールの送信に失敗したら再起動すべし。