C#でGmail SMTPサーバーを介してメールを送信する


242

何らかの理由で、「Gmailを介して.NETでメールを送信する」ことについて、受け入れられた回答も他の回答も機能しません。なぜ彼らは働かないのでしょうか?

更新:私は他の質問のすべての回答(受け入れられたものもそうでないものも)を試しましたが、どれも機能しません。

私はそれが他の誰かのために働くかどうか知りたいだけです、さもなければ、Googleは何かを変更したかもしれません(以前に起こった)。

を使用するコードを試してみると、SmtpDeliveryMethod.NetworkSend(message)でSmtpExceptionをすぐに受け取ります。メッセージは

SMTPサーバーは安全な接続を必要とするか、クライアントが認証されませんでした。

サーバーの応答は次のとおりです。

5.5.1認証が必要です。詳細については、「<-真剣に、それで終わりです。

更新:

これはずっと前に私が尋ねた質問であり、受け入れられた答えは、さまざまなプロジェクトで何度も何度も使用したコードです。

この投稿と他のEmailSenderプロジェクトのアイデアをいくつか取り入れて、CodeplexでEmailSenderプロジェクトを作成しました。テストしやすいように設計されており、GoDaddyやGmailなどのお気に入りのSMTPサービスをサポートしています。


別の言語で同様の方法を使用してこれを試みました。同じタイプの問題に遭遇しました:以前に機能した古い文書化されたメソッドは、私には機能しませんでした。だから、あなたはグーグルが何かを変更したのか、それとも何か間違ったことをしたのか疑問に思うままです。
AaronLS 2009

2
@aaronlsの最近の唯一の変更は、465ポートに関連しているようです。私は解決策を探しながらそれを試しました(私は同じものに取り組んでいました)、465ポートは常にタイムアウトします。その場合は、587ポートで試してください。
eglasius 2009

2
この問題は「単語の確認」(キャプチャ)が原因です。Webインターフェースを介して手動でサインインし、キャプチャを入力すると、SMTPが機能し始めます。
Robert Koritnik

4
FWIW、私のために働く。587と.EnableSSL trueを使用する必要があります。c#4 / .NET 4は現在、代替の465 / SSLをサポートしていません。Gmailは他のメールクライアントの設定を要求します
gerryLowry

1
@eglasiusの回答に従い、Gmailの[安全性の低いアプリを許可する]設定をオンにして、Gmailがアカウントを認証できるようにします。
user2713706 2018年

回答:


290

CVertex、コードを確認してください。何も明らかにならない場合は、投稿してください。私が取り組んでいたテスト用のASP.NETサイトでこれを有効にしただけで、動作しました。

実際、ある時点でコードに問題がありました。コンソールプログラムでよりシンプルなバージョンを作成し、それが機能していることを確認するまで気付きませんでした(心配されていたGmail側では変更はありませんでした)。以下のコードは、参照したサンプルと同じように機能します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

また、web.config、http: //msdn.microsoft.com/en-us/library/w355a94k.aspx、およびコードの組み合わせを使用して機能させEnableSslました(構成ファイル:()に一致するものがないため)。


1
C#winformsアプリケーションで私のために見事に働いた。ありがとう、フレディ。
Andrew

13
このようなコードがGmailの資格情報をプレーンテキストでユーザーに効果的に送信していることを忘れないでください
Chris Marisic

3
実際にはweb.configのenableSslに一致する設定があります。以下の回答を参照してください
Wiebe Tijsma

4
4.0で追加された@Zidad。
eglasius

21
Gmailの設定ページで「安全性の低いアプリ」へのアクセスを有効にする必要がある場合もあります:google.com/settings/security/lesssecureapps。あなたは、サーバーの応答だった`」例外を取得している場合、これは必要である:5.5.1認証が必要
Ravendarksky

73

以下は、WILL ほぼ確実に答えはあなたの質問TO ALLはELSE失敗した場合

まったく同じエラーが発生しました。Googleの新しいパスワード強度測定アルゴリズムが変更され、現在のパスワードが弱すぎると見なされ、それについて何も通知されていません(メッセージや警告でさえも)...どうしてこれを発見したのですか? ?まあ、私は自分のパスワードを変更してそれが役立つかどうかを確認することを選択しました(他のすべてを役に立たないように試みました)、パスワードを変更したとき、それはうまくいきました!

次に、実験のために、パスワードを以前のパスワードに戻して何が起こるかを確認しようとしましたが、Gmailでは実際にこれを行うことができませんでした。理由を「申し訳ありませんが、この変更を保存することはできません。パスワードが弱すぎます。」と以前のパスワードに戻すことはできません。このことから、エラーが発生していることがわかりました。理由は、a)xか月ごとにパスワードを変更する必要があるか、b)のいずれかです。前に言ったように、彼らのパスワード強度アルゴリズムが変更されたため、どこからでもログインしようとしたときに何も言わなかったとしても、私が持っていた弱いパスワードは受け入れられませんでした!私の弱いパスワードは約4か月前のものであり、Gmailで使用できるようになったため、これ(2番目)が最も可能性の高いシナリオです。

彼らがこれについて何も言わなかったことはかなり悪いですが、それは理にかなっています。ほとんどのハイジャックされたメールは、Gmail以外のソフトウェアを使用してログインしているため、Gmail環境以外でGmailを使用するには、より強力なパスワードが必要になると思います。

これが役に立てば幸いです!


2
ありがとう、あなたが言うように、パスワードを強力にしてすべてがうまくいくようにパスワードを変更してください。
Gavin

1
これはまさに私の問題でした-他のすべての提案は構成に関するものでしたが、私の構成は最初から正しいものでしたが、エラーが発生し続けました。、すべての違いを作ったパスワードを変更する
アンドレ・バーミューレン

おかげで、ようやくこの問題を解決できました。私のケースは実際にはさらに複雑で、開発マシン(ジョージア州、コーカサスにあります)からメールを送信できましたが、本番サーバー(イギリス)からメールが送信されませんでした。パスワードを複雑なものに変更すると、すべてが機能するようになります:)
Kirill Chilingarashvili '17

ありがとう。パスワード強度を所有していない私のGmailアカウントと同じ問題がありました。私はそれを強いもので更新しました、そして私のコードは機能しています。
Thomas.Benz、2015年

ありがとう、はい。最後に、パスワードを強力なパスワードに変更するだけです。
Misha Beskin

66

上記の他のトラブルシューティング手順に加えて、GMailアカウントで2要素認証(2段階認証とも呼ばれます)を有効にしている場合は、アプリケーション固有のパスワードを生成し、それを新たに使用する必要があることを追加しますSMTPを介して認証するために生成されたパスワード

アカウントを作成するには、https//www.google.com/settings/にアクセスし、[ アプリケーションとサイトの認証]を選択してパスワードを生成します。


1
私は2段階認証を有効にしていませんでした。パスワードをどの程度安全に作成してもかまいません。これが問題を解決できる唯一の方法でした。問題なく2段階の弱いパスワードなしで他のGmailアカウントを使用できました...本当に使用したいアカウントを使用するには、2段階を有効にし、アプリケーション固有のパスワードを使用する必要がありました。
Ian Robertson

まさに私がやっていること、それでも同じエラー:-/それは私のパスワードのように振る舞うのは十分ではありませんが、Gmailから与えられたアプリパスワードを使用しています!!!
ジェリーダッジ

54
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Gmail設定へのリンク

ここに画像の説明を入力してください


1
これでうまくいきました。さらに、上記の方法でメールを送信しようとすると、実際にはGoogleからメールが届き、安全性の低いアプリからこの試みをブロックしたと明示的に言われ、修正のためにこの方法が言及されました
Demarsch

1
私は他のすべての設定をセットアップしていて、それが機能していないようだったので、これはパズルの最も重要な鍵です。この設定をオンにするとすぐに、それは魅力のように機能しました。
ロスト

1
これでうまくいきました。アプリパスワード+ SSL + NetworkCredentials。(VB.NET)
CrazyIvan1974

30

上記の状況のいくつかが原因で、私のGmailアカウントからのメール送信にも問題がありました。これが私がそれをどのように機能させ、同時に柔軟に保つかについての要約です:

  • まず、GMailアカウントをセットアップします。
    • IMAPを有効にし、適切な最大メッセージ数をアサートします(ここで設定できます)。
    • パスワードが7文字以上で、強力であることを確認してください(Googleによると)
    • 最初にキャプチャコードを入力する必要がないことを確認してください。ブラウザからテストメールを送信することでそれを行うことができます。
  • web.config(またはapp.configに変更を加えます。まだ試していませんが、Windowsアプリケーションで機能させるのは同じくらい簡単だと思います):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

そして今、あなたが電子メールを送りたいときはいつでもあなたがする必要があるすべては電話をかけることですSSLMail.SendMail

たとえば、PasswordRecoveryコントロールを含むページで:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

または、コード内のどこでも呼び出すことができます。

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

これがこの投稿に遭遇したすべての人に役立つことを願っています!(私はVB.NETを使用しましたが、それを.NET言語に変換するのは簡単だと思います。)


+1 "enableSsl =" true "-これは、アセンブリを再コンパイルせずにSmtp.enableSslプロパティを明確に設定しないレガシーアプリで機能します。優れたヒント!
Metro Smurf

ファイアウォールを忘れないでください。ポート587は通常開くポートではありません。
ガイ・ロウ

13
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

「SMTPサーバーはセキュリティで保護された接続を必要とするか、クライアントが認証されませんでした。サーバーの応答は5.5.1認証が必要です。詳細はこちら」などのエラーが表示される場合SMTPClientObj.UseDefaultCredentials = Falseは、この行とこの行が含まれていることを確認してくださいの前にすべきSMTPClientObj.Credentialsです。

これらの2行を逆に切り替えようとしたところ、5.5.1 Authentication Requiredエラーが返されました。


これはまさに私に起こったことです。プロパティを設定する順序で問題が修正/解除されると思った人は誰ですか?
Bill Yang

これは私にとっても問題でした。提案どおりに順序を切り替えましたが、問題なく動作しました-頭痛、うーん!
eth0 2011年

13

ああ...すごい...まず、なんらかの理由でメールを送信できませんでした。しかし、これらの2行のシーケンスを以下のように変更した後、完全に機能します。

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

この助けを願っています!!! :)


1
はい、注文によって違いが生じます。特にプロパティCredentialsを設定し、デフォルトの資格情報を使用したくない場合。
Stefan Cvetanovski、2013

1
ドキュメントによると、資格情報を使用するには、UseDefaultCredentials = falseを設定する必要があります。ただし、これら2つの設定は密かに絡み合っているようです。UseDefaultCredentialsをtrueまたはfalseに設定すると、Credentialsをnullに設定するという副作用があります。また、資格情報を設定すると、副作用としてUseDefaultCredentials = falseが設定される可能性があります。ただし、これを行うものとして文書化されていないため、バグであるか、開発者が不完全な可能性があります。
アーロン

10

問題はGmailを介して送信する技術的な能力の1つではありません。これはほとんどの状況で機能します。マシンを送信できない場合は、通常、マシンがコントロールで少なくとも一度は人間の認証を受けていないことが原因です。

ほとんどのユーザーが直面する問題は、Googleが送信制限を常に変更することを決定することです。常に防御的なコードをソリューションに追加する必要があります。エラーが表示され始めたら、送信速度を下げて、しばらく送信を停止します。送信を続けようとすると、Googleが再送信するまでに遅延時間を追加することがあります。

現在のシステムで私が行ったことは、各メッセージの間に1.5秒の遅延で送信することです。その後、エラーが発生した場合は、5分間停止してから再開します。これは通常は機能し、アカウントの制限まで送信できます(最後に確認したのは、1日あたりの主要な顧客ログインでは2,000でした)。


1
これはまさに私の問題でした!プロダクションにデプロイすると問題が発生し、サーバー自体でGmailにログインした後、再び動作し始めました。
ThisGuy


9

私も同じ問題を抱えていましたが、私のウイルス対策が送信「スパム」メールをブロックしていたことがわかりました。これをオフにすると、ポート587を使用してGMail経由でSMTPメールを送信できます


Windows Defenderを無効にしたところ、機能し始めました。
MorioBoncz 14

9

ここで他に何も機能しない場合は、サードパーティのアプリケーションからGmailアカウントへのアクセスを許可する必要がある場合があります。これが私の問題でした。アクセスを許可するには、次の手順を実行します。

  1. Gmailアカウントにログインします。
  2. このページhttps://accounts.google.com/DisplayUnlockCaptchaにアクセスし、ボタンをクリックしてアクセスを許可します。
  3. このページhttps://www.google.com/settings/security/lesssecureappsにアクセスして、安全性の低いアプリへのアクセスを有効にします。

これは私にとってうまくいきました、他の誰かのために働くことを願っています!


8

eglasiusが一致するenableSsl設定がないと述べたため、これに必要な.NETバージョンはわかりません(.NET 4.0を使用していますが、.NET 2.0以降で機能するのではないかと思います)。私(プログラムによる構成を使用する必要はありません):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>

最初に、GmailアカウントでPOPまたはIMAPを有効にする必要がある場合があります。https//mail.google.com/mail/?shva = 1 #settings / fwdandpop

最初に通常のメールクライアントで試すことをお勧めします...


2
これは4.0の新機能です。バージョンを比較してください
eglasius

こんにちはEglasius ... OKありがとうございます!奇妙なことに、4.0より前のバージョンではプログラムによるアプローチしかありません。私たちは
時々

6

@Andres Pompiglio:はい、そうです。少なくとも一度はパスワードを変更する必要があります。このコードは問題なく機能します。

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

また、次を使用して関数を呼び出すことができます。

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))

SMTPサーバーは安全な接続を必要とするか、クライアントが認証されませんでした。サーバーの応答は次のとおりです。5.5.1認証が必要です。詳細については、
Savas Adar 2014年

6

企業のVPN接続を使用していました。アプリケーションからメールを送信できなかったのはこのためです。VPNから切断すると機能します。


5

また、ログインに使用したアカウントが何らかの理由でgoogleによって非アクティブ化されていることもわかりました。(以前と同じように)パスワードをリセットすると、問題なくメールを送信できました。5.5.1メッセージも表示されました。


5

私も多くの解決策を試してみましたが、それが機能するようにいくつかの変更を加えました

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true

上記のsmtpclientを使用すると、Gmailでパラメータが機能します


5

同じエラーが発生し、上記の解決策のいずれも役に立ちませんでした。

私の問題は、Gmailアカウントへのログインに使用されたことのないリモートサーバーからコードを実行していたことでした。

リモートサーバーでブラウザを開き、そこからGmailにログインしました。これは新しい場所だったので、自分であることを確認するためにセキュリティの質問をしました。セキュリティチェックを行った後、コードを通じて認証することができました。



4

私はこれと同じエラーに遭遇し(「SMTPサーバーは安全な接続を必要とするか、クライアントが認証されませんでした。サーバーの応答は5.5.1認証が必要です。詳細は」)、間違ったパスワードを使用していることがわかりました。ログイン認証情報を修正しましたが、正しく送信されました。

私はこれが遅いことを知っていますが、多分これは誰かを助けるでしょう。


4

私が見つけたもう1つのことは、パスワードを少なくとも1回は変更する必要があることです。安全なレベルのパスワードを使用してみてください(123456などのパスワードと同じユーザーを使用しないでください)。


4

あなたのためのさらに別の可能な解決策。IMAP経由でGmailに接続するときに同様の問題が発生していました。私が遭遇したすべての解決策を試した後、SOのここや他の場所で読みます(例:IMAPを有効にし、https://accounts.google.com/b/0/displayunlockcaptchaを使用して、メールへの安全性の低いアクセスを有効にします。など)、実際にもう一度新しいGmailアカウントを設定しました。

最初のテストでは、最初に作成したGmailアカウントで、メインのGmailアカウントに接続しました。これにより、Googleが間違ったアカウントを参照するという不規則な動作が発生しました。たとえば、https://accounts.google.com/b/0/displayunlockcaptchaを実行すると、目的で作成したアカウントではなく、メインアカウントが開かれました。

新しいアカウントを作成してメインアカウントに接続しなかった場合、上記の適切な手順をすべて実行した後、うまく機能することがわかりました。

私はまだこれを確認していません(つまり、再現されています)が、私にはそれが明らかになったようです。


4
  1. まずGmailアカウントの設定を確認し、[安全性の低いアプリのアクセス]からオンにします ここに画像の説明を入力してください

アカウントにアクセスするには、Gmailなどの安全なアプリを使用することを強くお勧めします。Googleが作成したすべてのアプリは、これらのセキュリティ基準を満たしています。一方、安全性の低いアプリを使用すると、アカウントが脆弱になる可能性があります。もっと詳しく知る。

  1. セットする

    smtp.UseDefaultCredentials = false;

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);

4

これらのエラーには1つ以上の理由があります。

  • ローカルシステムでGmail(またはその他の場合)を使用してログインします。

  • 安全性の低いアプリも確認して、「オン」に設定してください。こちらがGMAILのリンクです。 https://www.google.com/settings/security/lesssecureapps

  • 電子メールコードでEnableSslを確認し、trueに設定します。

    smtp.EnableSsl = true;
  • また、現在使用しているポートを確認してください。25はグローバルですが、587のように他の人もチェックできます。こちらをチェックしてください。すべてのSMTP通信は25を超えて行われますか?

  • リモートの場合:上記のVlad Tamasの回答を確認してください。


安全性の低いアプリの設定をオンにしたくない場合、他のメールクライアントはこれをどのように行うのですか?C#で同じことができないのはなぜですか?
user734028 2018年

3

ポート465経由で接続することもできますが、System.Net.Mail名前空間のいくつかの制限により、コードを変更する必要がある場合があります。これは、名前空間が暗黙のSSL接続を作成する機能を提供しないためです。これについては、http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspxで説明されています。別のディスカッションでCDO(Collaborative Data Object)を使用する方法の例を提供しています(すべてのポートでのGMail SMTP via C#.Netエラー)。


3

私はこの問題を解決してもらいました。どうやらそのメッセージは複数のエラータイプで使用されています。私の問題は、送信メールの最大数500に達したことでした。

アカウントにログインし、手動でメールを送信してみてください。制限に達した場合、それはあなたに通知します


2

Gmailアカウントで2段階認証プロセスを設定している場合は、アプリパスワードを生成する必要があります。 https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=ja&visit_id=636903322072234863-1319515789&rd=1 [アプリパスワードの生成方法]オプションを選択し、表示される手順に従います。生成されたアプリのパスワードをコピーしてどこかに貼り付けます。DONEをクリックすると復元できなくなります。


2
smtp.Host = "smtp.gmail.com"; //host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;

1

Gmailのパスワードを変更してもう一度お試しください。その後は機能します。

理由はわかりませんが、ホスティングを変更するたびにパスワードを変更する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.