【问题标题】:C# SMTP mail sendingC# SMTP 邮件发送
【发布时间】:2019-07-10 17:20:36
【问题描述】:

我希望通过 C# 控制台应用程序发送电子邮件。我找到了源代码——它们大多看起来很相似。但我认为我的问题是,我不知道这个问题的方法。

  • 我想,应该有一个 smtp 服务器安装在某个地方。我给了一个服务器 IP 地址并告诉它一个交换服务器。所以我尝试将它用作源代码中的服务器地址。
  • 我使用了与此服务器相关的给定凭证。但每次我得到“邮箱不可用。服务器响应是:5.7.1 无法中继错误”..
  • 然后我尝试了How to set up SMTP server on Windows 7 这个但我认为对于客户端安装 smtp 层是没有必要的..

那么,我该如何克服这个问题呢?

谢谢..

【问题讨论】:

    标签: c# email smtp


    【解决方案1】:

    这正是我发送电子邮件的方式。这里的代码(您必须将 portServerenablessl 替换为正确的值)

        public static void SendMail(string addressTo, string addressFrom, string mailSubject, string mailBody)
        {
            NetworkCredential myCredential = new NetworkCredential(_userName, _passWord);
    
            SmtpClient client = new SmtpClient();
            client.Host = "99.99.127.233";
            client.Port = 417;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = myCredential;
            client.EnableSsl = true;
    
            MailAddress from = new MailAddress(addressFrom);
            MailAddress to = new MailAddress(addressTo);
            MailMessage message = new MailMessage(from, to);
            message.Body = mailBody;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.Subject = mailSubject;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            client.Send(message);
        }
    

    【讨论】:

      【解决方案2】:

      我在使用 smtp.gmail.com 时遇到了同样的问题。我启用了“访问安全性较低的应用”,并关闭了两步验证。它奏效了。

      试试这个代码

                      MailMessage message = new MailMessage("sender@gmail.com", "receiver@gmail.com");
                      message.Subject = "Subject";
                      string body = "Mail Body";
                      message.Body = body;
                      SmtpClient smtpClient = new SmtpClient();
                      smtpClient.Host = "smtp.gmail.com";
                      smtpClient.EnableSsl = true;
                      NetworkCredential networkCredentials = new NetworkCredential("sender@gmail.com", "<password>");
                      smtpClient.UseDefaultCredentials = false;
                      smtpClient.Credentials = networkCredentials;
                      smtpClient.Port = 587;
                      smtpClient.Send(message);
      

      【讨论】:

        【解决方案3】:

        我现在正在做类似的事情,只是在 Windows 窗体中。我使用图书馆 EASendMail (https://www.emailarchitect.net/easendmail)。它有各种类,例如您可以像这样使用的标准 Mail 类:

        void SmtpSend(string from, string to, string subject, string body)
            {
                // \/ Use
                EASendMail.SmtpMail testMail = new EASendMail.SmtpMail("test");
                testMail.From = from;
                testMail.To = to;
                testMail.Subject = subject;
                testMail.TextBody = body;
                // Alternatively, you can use HTML bodies with testMail.HtmlBody = "<html><head></head><body></body>" etc. 
                // Just play around with it.
                // \/ Use the SmtpClient class to send your SmtpMail objects \/
                EASendMail.SmtpClient smtpClient = new EASendMail.SmtpClient();
                smtpClient.Credentials = new NetworkCredentials("username", "password");
                smtpClient.SendMail(testMail);
            }
        
            void main()
            {
                SmtpSend("sender@yourapp.com", "reciever@yourapp.com", "Test Mail", "Test Body");
            }
        

        如果您想直接连接到服务器,也可以使用SmtpServer 对象:

                    SmtpServer smtpgm = new SmtpServer("smtp.gmail.com");
                    EASendMail.SmtpClient cln = new EASendMail.SmtpClient();
                    smtpgm.Port = 587;
                    smtpgm.User = Console.ReadLine();
                    smtpgm.Password = Console.ReadLine();
                    smtpgm.Alias = "W";
                    smtpgm.Protocol = ServerProtocol.SMTP;               
                    smtpgm.ConnectType = SmtpConnectType.ConnectSTARTTLS;
        

        【讨论】:

          【解决方案4】:

          如果此消息被发送到 postfix,由您自己(或您可以得到帮助的人)托管,请确保启用 login SASL 身份验证方案。默认情况下,通常只启用plain
          否则,您的请求将被视为匿名(无论您在 SmtpClient 上的凭据设置如何),其余配置可能会导致您的请求被阻止。

          TL;DR

          可以在 postfix 机器上进行故障排除,方法是在您的 postfix 配置中启用详细调试。 这通常可以在 /etc/postfix/main.cf 中完成,方法是添加以下行:(81.82.83.84 是运行 SmtpClient 代码的机器的(公共)IP 地址)

          debug_peer_list = 81.82.83.84
          

          比让您的SmtpClient 发出新请求,同时调查您的日志记录(通常在/var/log/mail.info)。
          成功的会话将显示传入 (&lt;) AUTH login 请求,从而导致成功回复 (Authentication successful)

          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-smtpserver.smtpdomain.com
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-PIPELINING
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-SIZE 20480000
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-VRFY
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-ETRN
          # Postfix tells SmtpClient that it can use AUTH "LOGIN" scheme
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-AUTH PLAIN LOGIN
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-AUTH=PLAIN LOGIN
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-ENHANCEDSTATUSCODES
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250-8BITMIME
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 250 DSN
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: watchdog_pat: 0x55c423dbbdd0
          # AUTH request
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: < unknown[81.82.83.84]: AUTH login b3JnYW5pbW1vQGZveGlubm9xxx
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: query milter states for other event
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: milter8_other_event: milter inet:localhost:8891
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: xsasl_dovecot_server_first: sasl_method login, init_response b3JnYW5pbW1vQGZveGlubm9xxx
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: xsasl_dovecot_handle_reply: auth reply: CONT?1?UGFzc3dv
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 334 UGFzc3dv
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: < unknown[81.82.83.84]: QXplcnR5MDE=
          # AUTH reply
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: xsasl_dovecot_handle_reply: auth reply: OK?1?user=authenticationuser
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: > unknown[81.82.83.84]: 235 2.7.0 Authentication successful
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: watchdog_pat: 0x55c423dbbdd0
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: < unknown[81.82.83.84]: MAIL FROM:<user@destinationdomain.com>
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: extract_addr: input: <user@destinationdomain.com>
          Jul 10 08:04:20 smtpserver postfix/submission/smtpd[13312]: smtpd_check_addr: addr=user@destinationdomain.com
          

          如果不启用login 身份验证方案,250-AUTH 响应将只包含PLAINSmtpClient 将不会进行身份验证。
          如前所述,这可能会导致您的消息被 helo、客户端、中继、发件人或收件人限制阻止。

          如果您的 postfix 使用 dovecot 进行 SASL 身份验证,则可以在 /etc/dovecot/conf.d/10-auth.conf 中启用 login SASL 身份验证方案:

          auth_mechanisms = plain login cram-md5
          

          (并确保您的配置文件中只存在一个这样的配置。)
          可以在此处找到更多信息:https://wiki2.dovecot.org/Authentication/Mechanisms(其中还显示了在plainlogin 旁边启用cram-md5

          如果您的邮件仍然被进一步阻止,您可以添加permit_sasl_authenticated 作为后缀限制设置的第一个限制 - 至少是暂时的 - 以进行进一步调查。 例如(就我而言,我选择将其放在permit_mynetwork 之后以允许从本地主机发送邮件)

          smtpd_helo_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_helo_hostname,reject_invalid_helo_hostname,permit
          smtpd_sender_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_sender,reject_unknown_sender_domain,permit
          #...
          

          【讨论】:

            猜你喜欢
            • 2017-06-26
            • 1970-01-01
            • 1970-01-01
            • 2021-03-28
            • 2010-11-22
            • 2021-05-30
            • 2017-06-08
            • 2016-04-17
            • 2019-01-09
            相关资源
            最近更新 更多