C# SMTP 邮件发送

本文关键字:SMTP | 更新日期: 2023-09-27 18:30:16

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

  • 我认为,应该有一个安装在某处的smtp服务器。我已经给出了一个服务器IP地址,并告诉它一个交换服务器。所以我尝试将其用作源代码中的服务器地址。
  • 我使用了与此服务器相关的给定 cridentals。但是每次我得到"邮箱不可用。服务器响应为:5.7.1 无法中继错误"。
  • 然后我尝试了如何在Windows 7上设置SMTP服务器,但我认为对于客户端来说,安装smtp层是不必要的。

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

谢谢。。

C# SMTP 邮件发送

这正是我发送电子邮件的方式。这里是代码(您必须用正确的值替换端口服务器启用 sssl

    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);
    }

我在 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);
我现在

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

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;

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

博士

通过在后缀

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

debug_peer_list = 81.82.83.84

让您的SmtpClient发出新请求,同时调查您的日志记录(通常在 /var/log/mail.info 中)。
成功的会话将显示传入 ( <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、客户端、中继、发件人或收件人限制阻止。

如果您的后缀使用 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
#...