Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }