/// <summary> /// SMTPサーバーと接続する /// </summary> private SmtpCommData SmtpConnect(MailParameters mailParams) { this.IsServerCertValidate = mailParams.IsServerCertValidate; smtpcom = new SmtpCommData(); smtpcom.socket = new TcpClient(); // SMTPサーバーと接続する smtpcom.socket.Connect(mailParams.SmtpServer, mailParams.SmtpPort); logs.AppendLine("SMTP: Connected."); X509CertificateCollection clientCertificateCollection = new X509CertificateCollection(); if (mailParams.IsClientCertValidate) { var clientCertificate = Cert.GetCert(mailParams.ClientCertSerialNo); clientCertificateCollection.Add(clientCertificate); } // サーバーとデータの送受信を行うストリームを取得する // 通信開始(SSL有り) switch (mailParams.SmtpSecureMode) { case SecureMode.SSL2: // SSL2で運用しているサーバは存在しないはずだが、一応対応しておく smtpcom.stream = new System.Net.Security.SslStream(smtpcom.socket.GetStream(), false, ServerCertificateValidation); ((System.Net.Security.SslStream)smtpcom.stream).AuthenticateAsClient(mailParams.SmtpServer, clientCertificateCollection, SslProtocols.Ssl2, false); logs.AppendLine("SMTP: socket is over SSL2."); break; case SecureMode.SSL3: // SSL3で運用しているサーバはあるかもしれない smtpcom.stream = new System.Net.Security.SslStream(smtpcom.socket.GetStream(), false, ServerCertificateValidation); ((System.Net.Security.SslStream)smtpcom.stream).AuthenticateAsClient(mailParams.SmtpServer, clientCertificateCollection, SslProtocols.Ssl3, false); logs.AppendLine("SMTP: socket is over SSL3."); break; case SecureMode.TLS: // TLSは現状では主流 case SecureMode.STARTTLS: smtpcom.stream = new System.Net.Security.SslStream(smtpcom.socket.GetStream(), false, ServerCertificateValidation); ((System.Net.Security.SslStream)smtpcom.stream).AuthenticateAsClient(mailParams.SmtpServer, clientCertificateCollection, SslProtocols.Tls, false); logs.AppendLine("SMTP: socket is over TLS."); break; case SecureMode.None: smtpcom.stream = smtpcom.socket.GetStream(); logs.AppendLine("SMTP: socket unsecure."); break; } smtpcom.stream.ReadTimeout = 5000; smtpcom.stream.WriteTimeout = 500; smtpcom.reader = new System.IO.StreamReader(smtpcom.stream, _encoding); smtpcom.writer = new System.IO.StreamWriter(smtpcom.stream, _encoding); //サーバーからのはじめのメッセージを受信 var ret = ReceiveData(); if (ret != 220) { throw new SmtpException(smtpcom.received); } return(smtpcom); }
/// <summary> /// 指定されたパラメータの内容でメールを送信する(エンコードはISO-2022-JPのみをサポート) /// </summary> /// <param name="mailParams">メール送信パラメータ</param> /// <returns>送信結果(true:正常、false:失敗)</returns> public bool SendMail(MailParameters mailParams) { // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ // ■ System.Net.Mail.SmtpClient は、SMTP.SSLに対応していないため使用不可なので、 // ■ いろんなパターンに対応するため、TcpClientを使ってプロトコルを実装する。 // ■ // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ bool result = false; mailParams.logs = string.Empty; try { // ISO-2022-JPでエンコードする _encoding = System.Text.Encoding.GetEncoding(50220); if (mailParams.IsPopBeforeSmtp) { // POP before SMTP 指定の場合 PopBeforeSmtp(mailParams); if (mailParams.PopDelayTime > 0) { System.Threading.Thread.Sleep(mailParams.PopDelayTime); } } // SMTPサーバーと接続する smtpcom = SmtpConnect(mailParams); // EHLO SendHeloCommand(System.Net.Dns.GetHostName()); if (mailParams.SmtpSecureMode == SecureMode.STARTTLS) { // TLSの実装------------------------------------------------------------------ // STARTTLSの送信 var rcode = SmtpSendAndReceive("STARTTLS" + "\r\n"); if ((rcode / 100) != 2) { throw new SmtpException("エラー:" + rcode); } // SSLの開始 smtpcom.stream = new System.Net.Security.SslStream(smtpcom.socket.GetStream()); ((System.Net.Security.SslStream)smtpcom.stream).AuthenticateAsClient(mailParams.SmtpServer); smtpcom.stream.ReadTimeout = 5000; smtpcom.stream.WriteTimeout = 500; smtpcom.reader = new System.IO.StreamReader(smtpcom.stream, _encoding); smtpcom.writer = new System.IO.StreamWriter(smtpcom.stream, _encoding); } // AUTH Authenticate(mailParams.SmtpAuth, mailParams.SmtpUserId, mailParams.SmtpPasswd); // MAIL FROM(RCPTより先に送信する) SendMailFromCommand(mailParams.From); // RCPT TO SendRcptToCommand(mailParams.To, mailParams.Cc, mailParams.Bcc); // DATA(メールヘッダ&ボディ) SendDataCommand(mailParams); // QUIT SendQuitCommand(); result = true; mailParams.status = "OK"; } catch (Exception ex) { mailParams.status = "NG : " + ex.Message + ((ex.InnerException == null) ? "" : ("\r\n" + ex.InnerException.Message)); result = false; } finally { if (smtpcom != null) { if (smtpcom.socket != null) { smtpcom.socket.Close(); } } } mailParams.logs = logs.ToString(); return(result); }