トップ回答者
メール送信について

質問
-
いつも大変参考にさせていただいております。
ASP.NET+VB.NETでSmtpClient(SMTPサーバーを指定してインスタンスを作成しております。)を使用してメール送信しているのですがSend実行後、一定時間経過しないと実際には送信されません。
メール設定周りを調べてた時に規定では送信サーバーに負荷を掛けないように1分間隔でしかメールを送信しませんといったような記述をヘルプで見かけた気がしたのですがヘルプの場所が分からなくなってしまいました。
ご存知の方が居られましたらご教授をお願いいたします。(または勘違いということであればご指摘をお願いいたします。)
やりたいこととしてはメール送信自体は頻繁には発生しないのでSend実行後、すぐに送信したいと思っております。
回答
-
System.Net.Mail.SmtpClient で Send に Delay がかかる問題は、
http://msdn2.microsoft.com/en-us/library/system.net.servicepoint.maxidletime.aspx
ServicePoint.MaxIdleTime Property
を調整することで解決できるようです。同じような問題が
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=164793&SiteID=1&PageID=1
で議論されていました。jptros さんの発言です。URLの先を見に行くのが一番なのですが、一応引用します。
jptros wrotes:
The ServicePoint member contains a member called MaxIdleTime. Setting this value to 0 seems to have the same affect as Timeout.Infinite (which I assume is also 0). Setting it to 1 caused my email to be sent out immediately.
See this link:
http://msdn2.microsoft.com/en-us/library/system.net.servicepoint.maxidletime.aspx
Example code:
SmtpClient smtp = new SmtpClient();
// setup the mail message
smtp.ServicePoint.MaxIdleTime = 1;
smtp.Send(myMailMessage);
ということだそうです。
-
余談だけど、日本語(iso-2022-jp)で送信するとメールヘッダの Content-Transfer-Encoding: sevenbit ってやってくれちゃったりしますので、HTML メール以外だと Content-Transfer-Encoding を厳格にチェックしているメールサーバやメーラで勝手に変換されて文字化けする可能性があるので、注意してください。
実はこの件、QFE を出せとサポートインシデント使ってねじ込んで、現在最終調整というか 64/32bit の両方で最終テスト中です。
32bit 版でテストしましたが、とりあえず直っていましたので、あとは正式な QFE の出るのを待ってくださいまし。iso-2022-jp メールを送るサンプルなんですが、C# で Content-Transfer-Encoding の件を目をつぶっていいのなら(正式な QFE まともに使えます)、下記のコードがそのまま使えます。
#MSDN などのサンプルは役立たずなんで。using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.IO;namespace ContentTransferEncodingTest
{
class Program
{
private static string SMTP_SERVER = "xxx.xxx.xxx.xxx";
private static int SMTP_PORT = 25;
private static string MAIL_SUBJECT = "日本語テストメール";
private static string MAIL_BODY = "日本語テストメール\n文字化けは大丈夫?\nABC\n123?-/\\";
private static string MAIL_TO = "xxxxxx@xxxxxxxxxx";
private static string MAIL_FROM = "xxxxxx@xxxxxxx";
private static string MAIL_SUBJECT_FORMAT = "=?{0}?B?{1}?=";
static void Main(string[] args)
{
SmtpClient smtpClient = new SmtpClient(Program.SMTP_SERVER, Program.SMTP_PORT);
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
MailMessage mailMessage = new MailMessage(Program.MAIL_FROM, Program.MAIL_TO);
Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
mailMessage.BodyEncoding = encoding;
byte[] body = encoding.GetBytes(Program.MAIL_BODY);
MemoryStream memoryStream = new MemoryStream(body);
AlternateView alternateView = new AlternateView(memoryStream, new ContentType("text/plain; charset=iso-2022-jp"));
alternateView.TransferEncoding = TransferEncoding.SevenBit;
mailMessage.AlternateViews.Add(alternateView);
byte[] subject = encoding.GetBytes(Program.MAIL_SUBJECT);
string subjectText = String.Format(Program.MAIL_SUBJECT_FORMAT,
"ISO-2022-JP", Convert.ToBase64String(subject, Base64FormattingOptions.None));
mailMessage.Subject = subjectText;
mailMessage.IsBodyHtml = false;
mailMessage.Body = "";
smtpClient.Send(mailMessage);
mailMessage.Dispose();
if (memoryStream != null)
{
memoryStream.Dispose();
}
if (alternateView != null)
{
alternateView.Dispose();
}
Console.WriteLine("メール送信完了!");
}
}
} -
お手軽にWankuma.Net.Mailというコンポーネントを公開しています。
これに差し替えてもよろしいかと。
http://naka.wankuma.com/site/soft/WankumaNetMail/default.htm
BatchSendオプションで、SMTPにだだだっと流し込んでくれます。(^^
すべての返信
-
System.Net.Mail.SmtpClient で Send に Delay がかかる問題は、
http://msdn2.microsoft.com/en-us/library/system.net.servicepoint.maxidletime.aspx
ServicePoint.MaxIdleTime Property
を調整することで解決できるようです。同じような問題が
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=164793&SiteID=1&PageID=1
で議論されていました。jptros さんの発言です。URLの先を見に行くのが一番なのですが、一応引用します。
jptros wrotes:
The ServicePoint member contains a member called MaxIdleTime. Setting this value to 0 seems to have the same affect as Timeout.Infinite (which I assume is also 0). Setting it to 1 caused my email to be sent out immediately.
See this link:
http://msdn2.microsoft.com/en-us/library/system.net.servicepoint.maxidletime.aspx
Example code:
SmtpClient smtp = new SmtpClient();
// setup the mail message
smtp.ServicePoint.MaxIdleTime = 1;
smtp.Send(myMailMessage);
ということだそうです。
-
余談だけど、日本語(iso-2022-jp)で送信するとメールヘッダの Content-Transfer-Encoding: sevenbit ってやってくれちゃったりしますので、HTML メール以外だと Content-Transfer-Encoding を厳格にチェックしているメールサーバやメーラで勝手に変換されて文字化けする可能性があるので、注意してください。
実はこの件、QFE を出せとサポートインシデント使ってねじ込んで、現在最終調整というか 64/32bit の両方で最終テスト中です。
32bit 版でテストしましたが、とりあえず直っていましたので、あとは正式な QFE の出るのを待ってくださいまし。iso-2022-jp メールを送るサンプルなんですが、C# で Content-Transfer-Encoding の件を目をつぶっていいのなら(正式な QFE まともに使えます)、下記のコードがそのまま使えます。
#MSDN などのサンプルは役立たずなんで。using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.IO;namespace ContentTransferEncodingTest
{
class Program
{
private static string SMTP_SERVER = "xxx.xxx.xxx.xxx";
private static int SMTP_PORT = 25;
private static string MAIL_SUBJECT = "日本語テストメール";
private static string MAIL_BODY = "日本語テストメール\n文字化けは大丈夫?\nABC\n123?-/\\";
private static string MAIL_TO = "xxxxxx@xxxxxxxxxx";
private static string MAIL_FROM = "xxxxxx@xxxxxxx";
private static string MAIL_SUBJECT_FORMAT = "=?{0}?B?{1}?=";
static void Main(string[] args)
{
SmtpClient smtpClient = new SmtpClient(Program.SMTP_SERVER, Program.SMTP_PORT);
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
MailMessage mailMessage = new MailMessage(Program.MAIL_FROM, Program.MAIL_TO);
Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
mailMessage.BodyEncoding = encoding;
byte[] body = encoding.GetBytes(Program.MAIL_BODY);
MemoryStream memoryStream = new MemoryStream(body);
AlternateView alternateView = new AlternateView(memoryStream, new ContentType("text/plain; charset=iso-2022-jp"));
alternateView.TransferEncoding = TransferEncoding.SevenBit;
mailMessage.AlternateViews.Add(alternateView);
byte[] subject = encoding.GetBytes(Program.MAIL_SUBJECT);
string subjectText = String.Format(Program.MAIL_SUBJECT_FORMAT,
"ISO-2022-JP", Convert.ToBase64String(subject, Base64FormattingOptions.None));
mailMessage.Subject = subjectText;
mailMessage.IsBodyHtml = false;
mailMessage.Body = "";
smtpClient.Send(mailMessage);
mailMessage.Dispose();
if (memoryStream != null)
{
memoryStream.Dispose();
}
if (alternateView != null)
{
alternateView.Dispose();
}
Console.WriteLine("メール送信完了!");
}
}
} -
お手軽にWankuma.Net.Mailというコンポーネントを公開しています。
これに差し替えてもよろしいかと。
http://naka.wankuma.com/site/soft/WankumaNetMail/default.htm
BatchSendオプションで、SMTPにだだだっと流し込んでくれます。(^^