簡體   English   中英

C#SMTP郵件發送

[英]C# SMTP mail sending

我希望通過C#控制台應用程序發送電子郵件。 我找到了源代碼-大部分看起來都差不多。但是我想我的問題是,我不知道該問題的用法。

  • 我認為,應該在某處安裝了一個smtp服務器。 我給了一個服務器IP地址,並告訴它一個交換服務器。 因此,我嘗試將其用作源代碼中的服務器地址。
  • 我使用了與此服務器相關的給定密碼。 但是每次我收到“郵箱不可用。服務器響應是:5.7.1無法中繼錯誤”。
  • 然后,我嘗試了如何在Windows 7上設置SMTP服務器,但我認為對於客戶端而言,沒有必要安裝smtp層。

那么,我該如何克服這個問題呢?

謝謝 ..

這正是我發送電子郵件的方式。 這里的代碼(您必須使用正確的值替換portServerenablesl

    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 )。 它具有各種類,例如標准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;

如果此消息發送給您自己(或您可以從中獲得幫助的人)托管的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

在調查您的日志記錄時(通常在/var/log/mail.info ),不要讓SmtpClient發出新請求。
成功的會話將顯示傳入的( <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響應將僅包含PLAIN ,並且SmtpClient將不進行身份驗證。
如前所述,這很可能導致您的郵件被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
#...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM