web-dev-qa-db-ja.com

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

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

更新:私は他の質問の中ですべての答え(受け入れられたものとそうでないもの)を試したが、それらのどれもうまくいかない。

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

SmtpDeliveryMethod.Networkを使用するコードを試すと、送信時にすぐにSmtpExceptionが発生します(メッセージ)。メッセージは

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

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

5.5.1認証が必要です。 "<でもっと学ぶ - 真剣に、それはそれで終わる。

アップデート:

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

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

229
CVertex

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("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

また、web.configを組み合わせて使用​​することもできました。 http://msdn.Microsoft.com/ja-jp/library/w355a94k.aspx とコード(設定ファイルに一致するEnableSslがないため:()。

283
eglasius

次はほぼ確実に答えになる/ あなたの質問に答えるすべての失敗が失敗した場合

私は全く同じエラーを得ました、それはグーグルの新しいパスワード強度測定アルゴリズムが私の現在のパスワードを弱すぎるとみなして変更したこと、そしてそれについて私に話していないことを知っています。 ?さて、私はそれが助けになるかどうかを確認するために私のパスワードを変更することを選びました(他のすべてを試してみました)そして私が私のパスワードを変えたとき、それはうまくいきました!

それから実験のために、私は自分のパスワードを以前のパスワードに戻して何が起こるのか見てみました、そしてGmailは実際に私にこれをすることを許しませんでした。パスワードが弱すぎる "と私は私の古いパスワードに戻らせないでしょう。このことから、a)xヶ月に1回パスワードを変更する必要があるか、またはb)のいずれかが原因でエラーが発生していることがわかりました。私が前に言ったように、彼らがパスワードをどこにログインしようとしても何も言わなかったとしても、彼らのパスワード強度アルゴリズムは変わり、それゆえ私が持っていた弱いパスワードは受け入れられませんでした!私の弱いパスワードは約4ヶ月前のものであり、Gmailで使用できるようにするので、これ(番号2)が最も可能性の高いシナリオです。

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

これが役に立つことを願っています!

66

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

作成するには、 https://www.google.com/settings/ にアクセスして、アプリケーションの承認sitesでパスワードを生成します。

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

Gmail設定へのリンク

enter image description here

50

私のgmailアカウントからのメール送信にも問題がありましたが、それは前述の状況のいくつかが原因です。これがどのように機能し、同時に柔軟性を保っているかをまとめたものです。

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

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- 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

そして今、あなたがEメールを送りたいときはいつでもあなたがする必要があるのは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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

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

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

私はこれがこの記事に出くわす誰かに役立つことを願っています! (私はVB.NETを使用しましたが、それをあらゆる.NET言語に変換するのは簡単なことだと思います。)

29
Sebas
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

「SMTPサーバーには安全な接続が必要です。またはクライアントは認証されませんでした。サーバーの応答は次のとおりです。5.5.1認証が必要です。詳細」では、SMTPClientObj.UseDefaultCredentials = False行を含め行はSMTPClientObj.Credentialsの前にあるべきです。

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

13
Terry Chng

ああ、それはすごい...最初に私は何らかの理由で電子メールを送信できませんでした。しかし、この2行の順序を以下のように変更した後、それは完全に機能します。

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

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

12
Wirol

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

9
user464329

これを修正する簡単なステップ:

1)Gmailにログイン

2)このページに移動します https://www.google.com/settings/security/lesssecureapps &「有効にする」に設定

9
Kevin

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

ほとんどのユーザーが直面している問題は、Googleが送信制限を常に変更することにしているということです。あなたは常にあなたのソリューションに防御的なコードを追加するべきです。エラーが発生し始めたら、送信速度を下げてしばらく送信を停止してください。あなたが送信しようとし続けるならば、あなたが再び送信することができる前に時々あなたの遅延期間に余分な時間を加えるでしょう。

私の現在のシステムで私がしたことは各メッセージの間に1.5秒の遅れで送信することです。その後、エラーが発生した場合は、5分間停止してからやり直してください。これは通常うまくいき、あなたがアカウントの限度まで送ることを可能にします(私が最後に私がそれをチェックしたのは1日当たりの最高の顧客ログインのための2,000です)。

9
Jason Short

Eglasiusが一致するenableSsl設定がないと言っていたので私はこれにどの.NETバージョンが必要かわからない(私は.NET 4.0を使っているが、.NET 2.0以降で動くと思う)が、この設定はうまくいった私のために(そしてプログラム的な設定を使う必要はありません):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

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

まず普通のメールクライアントで試してみることをお勧めします。

8
Wiebe Tijsma

他に何もうまくいっていない場合は、サードパーティ製アプリケーションからあなたのgmailアカウントへのアクセスを許可する必要があるかもしれません。これは私の問題でした。アクセスを許可するには、次の手順に従います。

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

これは私のために働いたそれが他の人のために働くことを願っています!

8
Celt

企業のVPN接続を使用していました。アプリケーションからメールを送信できなかったのはそのためです。 VPNから切断すれば動作します。

6
Ned

@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, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

また、ログインに使用していたアカウントが何らかの理由でGoogleによって無効にされていることもわかりました。パスワードを(以前と同じに)再設定すると、メールを正常に送信できました。私はまた5.5.1メッセージを得ていました。

5
RKL

私はまた多くの解決策を試みたがそれがうまくいくいくつかの変更を加える

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

上記のsmtpclientでは、gmailで動作します。

5
Suresh

あなたのためのまだ別の可能な解決策。 IMAP経由でgmailに接続するときにも、同じような問題がありました。私が出くわしたすべての解決策を試してみた後に、あなたはここや他の場所でSOについて読むでしょう(例えば、 httpsを使ってあなたのメールへの安全性の低いアクセスを可能にします)。 //accounts.google.com/b/0/displayunlockcaptcha など)、実際にもう一度新しいGmailアカウントを設定します。

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

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

私はまだこれを確認(すなわち再現)していませんが、明らかに私のためにそれをしました…それが助けになることを願っています。

4
sinewave440hz

私は同じエラーを受けていたし、上記の解決策のどれも助けにはならなかった。

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

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

4
Vlad Tamas

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

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

4
Albert Bori

アカウントの安全性が低いアプリを有効にします。 https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. まず、Gmailアカウントの設定を確認し、[安全性の低いアプリへのアクセス]からオンにします enter image description here

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

  1. セット

    smtp.UseDefaultCredentials = false;
    

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

私が見つけたもう一つのことはあなたが少なくとも一度あなたのパスワードを変えなければならないということです。そして、安全なレベルのパスワードを使うようにしてください(パスワードと同じユーザー、123456などを使わないでください)。

4

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

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

3
Ayson Baxter

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

3
Bryan Allred

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

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

  • また、安全性の低いアプリをチェックして「有効にする」に設定します。ここがGMAILのリンクです。 https://www.google.com/settings/security/lesssecureapps

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

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

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

2
Bharat
  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;
2
somesh

Gmailのパスワードを変更してもう一度やり直してください。

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

1
Jo Smo

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

0
Faith Nassiwa