SmtpClient
クラスを用いて、メールを送信するプログラムがあるのだが、
どうもgmailをホストに指定した場合に動作しない。
設定値は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
using System; using System.Collections.Generic; using System.Net; using System.Net.Mail; using System.Threading; namespace SendMail { class MailClient { static void Main(string[] args) { SmtpClient mailClient = new SmtpClient(); mailClient = new SmtpClient("smtp.gmail.com", 465); mailClient.DeliveryMethod = SmtpDeliveryMethod.Network; mailClient.EnableSsl = true; mailClient.Timeout = 30000; mailClient.UseDefaultCredentials = false; mailClient.Credentials = new NetworkCredential(@"user", "password", ""); MailClient mc = new MailClient(); string fromAddress = @"user@gmail.com"; string toAddress = @"SendTo@xxx.co.jp"; using (MailMessage msg = new MailMessage()) { msg.From = new MailAddress(fromAddress); msg.BodyEncoding = System.Text.Encoding.UTF8; msg.SubjectEncoding = System.Text.Encoding.UTF8; msg.Subject = "テスト"; msg.To.Clear(); msg.To.Add(toAddress); msg.Body = "これはテストです"; mailClient.Send(msg); } } } } |
最初は何かしら設定が間違っているのだろうと思ったが、
下記のVBScriptでは問題なく送信ができる。
なので、設定値に間違いはなく、C#コードのコーディングミスと判断し、調査していた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Option Explicit Dim mFrom Dim mTo Dim SmtpSvr mFrom = "user@gmail.com" mTo = "SendTo@gmail.com" SmtpSvr = "smtp.gmail.com" Dim Subject Dim TextBody Subject = "テスト" TextBody = "これはテストです" Dim oMsg Set oMsg = CreateObject("CDO.Message") oMsg.From = mFrom oMsg.To = mTo oMsg.Subject = Subject oMsg.TextBody = TextBody oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendusing")= 2 oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpserver")= SmtpSvr oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpserverport")=465 oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpusessl")=True oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpauthenticate")=1 oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendusername")="user@gmail.com" oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendpassword")="password" oMsg.Configuration.Fields.Update oMsg.Send |
しかし、どうもミスらしき場所が見つからない。
エラーも「送信できませんでした」以上のことがでず、八方ふさがりとなった。
色々調べて、以下で解決した。
・ポートを465でなく587を用いる。
つまり、18行目あたりを以下のように修正し、問題は解消した。
1 |
mailClient = new SmtpClient("smtp.gmail.com", 587); |
どうやらこれは.NETの仕様で、
SmtpClient
クラスはポート465をサポートしていないのだ。
SmtpClient.EnableSsl プロパティ
How can I send emails through SSL SMTP with the .NET Framework?
言われれば「なんだぁ」だが、VBScriptで送信できたことで、設定値を疑うことが遅れてしまった。
こういうことがあるから、MSDNはよく確認しなくては。