次のコードを使ってメールを送信しています。コードは私のローカルマシンでは正常に機能します。しかし、本番サーバーではエラーメッセージが表示されます。
var fromAddress = new MailAddress("[email protected]");
var fromPassword = "xxxxxx";
var toAddress = new MailAddress("[email protected]");
string subject = "subject";
string body = "body";
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
smtp.Send(message);
そして私のGmailのA/Cに私は本番サーバーからコードを実行した後、私は次のメールを受信しました
こんにちは 、
最近、誰かがあなたのパスワードを使ってあなたのGoogleアカウント[email protected]にログインしようとしました。この人は、電子メール、クライアント、モバイルデバイスなどのアプリケーションを使用していました。
これがアカウントへのアクセスを試みるハイジャック犯である場合に備えて、サインインの試みを阻止しました。サインイン試行の詳細を確認してください。
2014年1月3日、金曜日13:56:08 UTCのIPアドレス:xxx.xx.xx.xxx(abcd.net。)場所:Philadelphia PA、フィラデルフィア、PA、アメリカ
このサインインの試みを認識しない場合は、他の誰かがあなたのアカウントにアクセスしようとしている可能性があります。あなたはあなたのアカウントにサインインしてそしてあなたのパスワードをすぐにリセットするべきです。
パスワードを再設定する
これであなたのアカウントにアクセスできない場合は、 http://support.google.com/mail?p=client_login に記載されているトラブルシューティング手順を実行してください。
よろしくお願い申し上げます。Googleアカウントチーム
これは通常、別のタイムゾーンまたはIPアドレスコンピュータからログインしようとしたときに発生します。本番サーバーとあなたが使用したメールIDは異なるタイムゾーンにあります。これら2つの解決策のどちらかを選択してください。
1)リモートアクセスで本番サーバーにログインし、自分の資格情報を使用してgmailに一度ログインします。確認を求め、確認してログアウトします。
または2)ローカルコンピュータにgmailでログインし、 リンク の順に選択し、 このアクティビティを確認します を選択して適切な処置を取ります。
コードからメールを送信しようとしたときに、「SMTPサーバーはセキュリティで保護された接続を必要とするかクライアントが認証されませんでした。サーバーの応答:5.5.1 Authentication Required」というエラーが表示される以下の場合
ケース1: パスワードが間違っている場合
ケース2: あなたがあるアプリケーションからログインしようとしたとき
ケース3: 自分のタイムゾーン/ domain/computer 以外のドメインからログインしようとした場合(これは、ほとんどのシナリオでコードからメールを送信する場合です)
それぞれに解決策があります
ケース1の解決策: 正しいパスワードを入力してください。
ケース2の解決策1 :次のリンクのセキュリティ設定https://www.google.com/settings/security/lesssecureappsにアクセスして、安全性の低いアプリを有効にします。あなたはすべてのアプリからログインできるようになります。
ケース2の解決策2 :( https://stackoverflow.com/a/9572958/52277 を参照)2要素認証(別名2段階認証)を有効にしてからアプリケーションを生成する - 特定のパスワード:SMTPで認証するために、新しく生成されたパスワードを使用します。
ケース3の解決策1: (これは役に立つかもしれません)あなたはアクティビティをレビューする必要があります。しかし、最新のセキュリティ標準のため、リンクを使用しても意味がないため、アクティビティを確認しても役に立ちません。それで、以下のケースを試してください。
ケース3の解決策2 :本番サーバー上のどこかにコードをホストしていて本番サーバーにアクセスできる場合は、本番サーバーへのリモートデスクトップ接続を使用してブラウザから1回ログインします。プロダクションサーバこれはグーグルへのログインのためのexcpetioonを加えるでしょう、そしてあなたはコードからログインすることを許されるでしょう。
しかし、本番サーバーにアクセスできない場合はどうなりますか。解決策を試す3
ケース3の解決策3:あなたのグーグルアカウントのために他のタイムゾーン/ ipからのログインを有効にする必要があります。
これを行うには、リンクhttps://g.co/allowaccessをたどり、[続行]ボタンをクリックしてアクセスを許可します。
以上です。どうぞ。これで、あなたは自分のgoogleアカウントにどのコンピュータからでも、そしてどんな方法でもログインできるようになります。
そのセキュリティ上の問題、Gmailはデフォルトでカスタムアプリケーションからあなたの電子メールアカウントへのアクセスを防ぎます。アプリケーションからのログインを受け入れるように設定できます。
あなたのEメールにログインした後、 ここをクリック
これはあなたを次のページに連れて行きます
今日ここで数時間かけてここですべての解決策を試してみた後、私はまだこの正確なエラーを乗り越えることができませんでした。私はこのようにして何度もGmailを使ったことがあるので、それが愚かなものであることを知っていましたが、私は何も問題を解決しませんでした。私はついに自分のケースで解決策を見つけましたので、私は共有すると思いました。
まず、上記の答えのほとんども必要ですが、私の場合は、SmtpClientクラスを作成しながらコードを順序付けるという単純な問題でした。
以下のこの最初のコードスニペットで、 "Credentials = creds"行がどこにあるかに注目してください。この実装では、他にすべて適切に設定されている場合でも、この質問で参照されているエラーが発生します。
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
Credentials = creds,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
}
ただし、認証情報設定コールを下に移動すると、電子メールはエラーなしで送信されます。私は周囲のコードに変更を加えませんでした...すなわち...ユーザ名/パスワードなど。明らかに、EnableSSL、UseDefaultCredentials、またはDeliveryMethodは最初に設定されている資格に依存します。それがどれであるかを理解するためのすべて。
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
Credentials = creds
}
これが将来他の誰かの頭痛の種を救うのに役立つことを願っています。
こんにちは私は同じ問題を抱えていた、
それを解決するために私がしたこと安全性の低いアプリを起動することです。私のGmailアカウントに接続した後。私はこのリンクを入力しました: https://www.google.com/settings/security/lesssecureapps
それから私は安全なアプリをオンにして、そしてそれはうまくいった。それはまた上で言われました
私は今このエラーを投げる以前に機能したコードを持っています。パスワードに問題はありません。メッセージをbase64に変換する必要もありません。結局のところ、私は次のことを行う必要があります。
作業コード
public static void SendEmail(string emailTo, string subject, string body)
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("[email protected]", "secretpassword"),
EnableSsl = true
};
client.Send("[email protected]", emailTo, subject, body);
}
Googleの電子メールの手順に従って、安全性の低いアプリを有効にするだけです。
ここから「安全性の低いアプリを許可する」を有効にする必要があります https://myaccount.google.com/lesssecureapps
私は同じ問題に直面しました。 2 Step Verification(MFA)をオンにすると発生します。 2ステップ検証をオフにするだけで、問題は解決します。
以下は私のcode.Iです。私も同じエラーがありましたが、問題は私が間違った私のパスワードを与えたということでした。以下のコードは完璧に動作します。
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
mail.To.Add("[email protected]");
mail.Subject = "Password Recovery ";
mail.Body += " <html>";
mail.Body += "<body>";
mail.Body += "<table>";
mail.Body += "<tr>";
mail.Body += "<td>User Name : </td><td> HAi </td>";
mail.Body += "</tr>";
mail.Body += "<tr>";
mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
mail.Body += "</tr>";
mail.Body += "</table>";
mail.Body += "</body>";
mail.Body += "</html>";
mail.IsBodyHtml = true;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
私のブログ でそれを参照することができます
私にとってうまくいったのは、安全性の低いアプリのオプションを有効にすることでした(私はVB.NETを使用しています)。
Public Shared Sub enviaDB(ByRef body As String, ByRef file_location As String)
Dim mail As New MailMessage()
Dim SmtpServer As New SmtpClient("smtp.gmail.com")
mail.From = New MailAddress("[email protected]")
mail.[To].Add("[email protected]")
mail.Subject = "subject"
mail.Body = body
Dim attachment As System.Net.Mail.Attachment
attachment = New System.Net.Mail.Attachment(file_location)
mail.Attachments.Add(attachment)
SmtpServer.Port = 587
SmtpServer.Credentials = New System.Net.NetworkCredential("user", "password")
SmtpServer.EnableSsl = True
SmtpServer.Send(mail)
End Sub
アカウントにログインしてから google.com/settings/security/lesssecureapps にアクセスしてください。
Microsoft Azureにデプロイされたアプリケーションについても同じ問題がありました。
SmtpException:SMTPサーバーに安全な接続が必要か、クライアントが認証されていません。サーバーの応答は次のとおりです。5.5.1認証が必要です。
まず、次のページですべての不明なデバイス(アイルランドから発信されたIPアドレス)を承認しました(/ Gmailユーザーとしてログイン): https://security.google.com/settings/u/1/security/secureaccount
クライアントには以下の設定を使用しました。
var client = new SmtpClient("smtp.gmail.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("[email protected]", "my_password");
Smtp-clientで次のプロパティを設定した後にのみ機能し始めました。
client.TargetName = "STARTTLS/smtp.gmail.com";
安全性の低いアプリの有効化からポート587の試用まで、ここで見つかったすべての提案を試してみました。最後に、UseDefaultCredentials = false
という行をコメントアウトしました。そのブール値に触れなければ、すべてうまくいきました。
NOVEMBER 2018、 上記のすべてを試したが成功しなかった。
以下がようやく解決した解決策です。残念ながら、SSLは使用していませんが、動作します。
var fromAddress = new MailAddress([email protected], "From Name");
var toAddress = new MailAddress("[email protected]", "To Name");
const string subject = "Subject";
const string body = "Body";
var smtp = new SmtpClient
{
Host = "aspmx.l.google.com",
Port = 25,
EnableSsl = false
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
Tomasz Madeyskiからのコメントは私の問題を解決したものです...彼はそれがSetDefaultCredentialのバグであると言います、と彼は言います:
「問題は、UseDefaultCredentialsセッターにこのコードがあることです。this.transport.Credentials = value?(ICredentialsByHost)CredentialCache.DefaultNetworkCredentials:(ICredentialsByHost)null;これは、Credentialsセッターによって設定された資格情報を上書きします。SmtpClientのバグのように見えます」
認証情報を設定した後にsmtpClient.UseDefaultCredentials = false
を入力すると...この行は認証情報をnullに設定します。
あなたはgmailから特定のAPPパスワードを作成/生成する必要があるかもしれません。あなたのアプリやスクリプトは通常のパスワードの代わりにこの新しいパスワードを使用します。あなたの通常のパスワードはまだあなたのためにうまくいくでしょう。
それが私のためにしたことです。私はまだ同じ電子メールアカウントを使用しましたが、新しいアプリ固有のパスワードを生成する必要がありました。
https://support.google.com/accounts/answer/185833?hl=ja
基本的にここでそれを行うことができます: https://security.google.com/settings/security/apppasswords
私は本当にたくさんのアイデアを見てきました、唯一の解決策はこの方法でした(異なるEメールプロバイダーで動作します):
try
{
ViewProgressbar("Try to connect mail-server...", progressBar1.Value = 20);
string Host = dsProvider.Rows[y]["POP_hostOut"].ToString();
int port = int.Parse(dsProvider.Rows[y]["POP_portOut"].ToString()); //587
string[] email = von1.Split('@');
string userName = (dsProvider.Rows[y]["login"].ToString() == "email[0]@email[1]")? email[0]+"@"+email[1] : email[0];
string password = layer.getUserPassword(listSender.SelectedValue.ToString());
SmtpClient client = new SmtpClient(Host, port);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
//A idea from MSDN but it not works. You got the "The server response was: 5.5.1 Authentication Required."
//System.Net.NetworkCredential myCreds = new System.Net.NetworkCredential(userName, password, Host);
//System.Net.CredentialCache cache = new System.Net.CredentialCache();
//cache.Add(Host, port, "NTLM", myCreds);
///cache.GetCredential(Host, port, "NTLM"); //NTLM
client.Credentials = new System.Net.NetworkCredential(userName, password);
client.Host = Host;
client.Port = port;
client.EnableSsl = true;
client.Send(message);
ViewProgressbar();
}
catch (SmtpException ex)...
私はビジネス加入者向けのGoogleアプリです。最後の数時間は、すべての正しい設定(smtp、port、enableSSLなど)を設定した後でも、これに対処するだけです。これが私と電子メールを送信しようとしたときに5.5.1エラーを投げていたウェブサイトのために働いたものです:
これをした後、ウェブサイトからの私の電子メールフォームは再び働いていました。がんばろう!
smtp.SendMailAsync(mail)を待つ前にブレークポイントを置かないでください。
:)
私はそれが働いているブレークポイントを削除するときにそれがこのエラーを与えるブレークポイントで待機するとき