1

.NET 4 では、電子メールの送信に問題がありますか? 私は.NET 3.5ソリューションを持っていて、それは機能していましたが、ソリューションを.NET 4に移行しましたが、機能しません。何も変わっていません!

注: 次の例外が発生します。

System.Net.Mail.SmtpException: SMTP サーバーがセキュリティで保護された接続を必要とするか、クライアントが認証されませんでした。サーバーの応答は次のとおりです。5.5.1 認証が必要です。詳細については、System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)
at System.Net.Mail.SmtpTransportを参照してください。 .SendMail(MailAddress 送信者、MailAddressCollection 受信者、文字列 deliveryNotify、SmtpFailedRecipientException& 例外)
System.Net.Mail.SmtpClient.Send(MailMessage メッセージ)
で ...

そして、これは私のコードです:

public static void SendEmail(
    this Email email)
{
    if (email.MailingSettings == null) throw new ArgumentNullException("email.MailingSettings", "specify email.MailingSettings");

    var settings = email.MailingSettings;

    if (string.IsNullOrEmpty(email.Sender)) throw new ArgumentException("email.Sender", "specify a sender");
    if (email.Recipients == null) throw new ArgumentNullException("email.Recipients", "specify at least a recipient");
    if (email.Recipients.Length == 0) throw new ArgumentNullException("email.Recipients", "specify at least a recipient");
    if (string.IsNullOrEmpty(settings.SMTPHost)) throw new ArgumentException("email.SMTPHost", "specify email.SMTPHost");

    var mail = new MailMessage();

    if (string.IsNullOrEmpty(email.SenderDisplayName))
        mail.From = new MailAddress(email.Sender);
    else
        mail.From = new MailAddress(email.Sender, email.SenderDisplayName);

    if (!string.IsNullOrEmpty(email.ReplyTo))
    {
        if (string.IsNullOrEmpty(email.ReplyToDisplayName))
        {
            mail.ReplyToList.Add(new MailAddress(email.ReplyTo));
        }
        else
        {
            mail.ReplyToList.Add(new MailAddress(email.ReplyTo, email.ReplyToDisplayName));
        }
    }

    foreach (string recipient in email.Recipients)
        mail.To.Add(new MailAddress(recipient));

    mail.Subject = email.Subject;
    mail.Body = email.Body;
    mail.IsBodyHtml = settings.IsBodyHtml;

    if (email.CC != null && email.CC.Length > 0)
        foreach (string cci in email.CC)
            mail.CC.Add(cci);

    if (email.BCC != null && email.BCC.Length > 0)
        foreach (string bcci in email.BCC)
            mail.Bcc.Add(bcci);

    if (email.Attachments != null)
        foreach (var ifn in email.Attachments)
            mail.Attachments.Add(
                new Attachment(
                    new MemoryStream(
                        ifn.Content),
                    ifn.FileName));

    var smtpPort = settings.SMTPPort > 0 ? settings.SMTPPort : 25;

    var smtpClient = new SmtpClient(settings.SMTPHost, smtpPort);
    smtpClient.EnableSsl = settings.EnableSsl;

    if (!string.IsNullOrEmpty(settings.SMTPUser))
    {
        smtpClient.UseDefaultCredentials = false;

        var smtpPassword = settings.SMTPPassword == null ? string.Empty : settings.SMTPPassword;

        NetworkCredential netCred;
        if (string.IsNullOrEmpty(settings.SMTPDomain))
            netCred = new NetworkCredential(settings.SMTPUser, smtpPassword);
        else
            netCred = new NetworkCredential(settings.SMTPUser, smtpPassword, settings.SMTPDomain);

        smtpClient.Credentials = netCred;
    }
    else
        smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;

    smtpClient.Timeout = 180 * 1000;
    smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;

    ServicePointManager.ServerCertificateValidationCallback =
        delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        { return true; };

    smtpClient.Send(mail);
}
4

3 に答える 3

0

すべてが投稿されたコードとコメントどおりであれば、Google アカウントの2 段階認証が有効になっていると言えます。その場合、アプリケーション固有のパスワードを生成する必要があります。

于 2012-07-15T10:03:45.183 に答える
0

このコードは正しく、機能します。問題は GMail 側にあり、解決されました (理由と方法は検出されませんでした)。

于 2012-07-18T11:07:20.413 に答える
0

これを使用してみてください:

try
{
    string smtpAddress = "smtp.gmail.com";
    int portNumber = 587;
    bool enableSSL = true;
    string emailFrom = "senderemail@gmail.com";
    string password = "password";
    string emailTo = "receiver@gmail.com";
    string subject = "Halo!";
    string body = "Halo, Mr. SMTP";
    MailMessage mail = new MailMessage();
    mail.From = new MailAddress(emailFrom);
    mail.To.Add(emailTo);
    mail.Subject = subject;
    mail.Body = body;
    mail.IsBodyHtml = true;

    using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
    {
        smtp.Credentials = new NetworkCredential(emailFrom, password);
        smtp.EnableSsl = enableSSL;
        smtp.Send(mail);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

*これをアクティブ化する必要がある前に注意してください: https://myaccount.google.com/lesssecureapps

安全性の低いアプリ

そして、コードをビルドして実行します..それは素晴らしいです.. :)

于 2018-05-22T04:01:08.807 に答える