3

次のコードが必要です。

Try
    Dim mail As New MailMessage()
    Dim SmtpServer As New SmtpClient("smtp.gmail.com")
    mail.From = New MailAddress(txtid.Text)
    mail.[To].Add(TextBox1.Text)
    mail.Subject = txtsub.Text
    mail.Body = txtmess.Text
    ' mail.Attachments.Add(New Attachment(OpenFileDialog1.FileName))
    SmtpServer.Port = 587
    SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text, txtpass.Text)
    SmtpServer.EnableSsl = True

    SmtpServer.Send(mail)
    MsgBox("E-mail Has Been Send Successfully !")
Catch ex As Exception
    MsgBox(ex.Message)
End Try

ステップで

SmtpServer.Send(mail)

いつもエラーが発生します: メールの送信に失敗しました

それを修正する方法はありますか?

私はVB.NETを使用していることに注意してください

4

3 に答える 3

2

ポート 465 (SSL を使用) とポート 587 (TLS を使用) で SMTP サーバーを構成してみてください。

于 2013-09-13T19:55:50.687 に答える
1

を受信して​​いるためSmtpExceptionSmtpClient.Send メソッド (MailMessage)のドキュメントには、次の理由が原因である可能性があると記載されています。

  • SMTP サーバーへの接続に失敗しました。
  • 認証に失敗しました。
  • 操作がタイムアウトしました。
  • EnableSslは に設定されていますtrueが、DeliveryMethodプロパティはSpecifiedPickupDirectoryまたはに設定されていますPickupDirectoryFromIis
  • EnableSslが に設定されてtrueいますが、SMTP メール サーバーは EHLO コマンドへの応答で STARTTLS をアドバタイズしませんでした。

Trim()次のように、ユーザー名とパスワードのテキスト値を使用して、潜在的な先頭または末尾のスペースを削除します。

SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text.Trim(), 
                                                          txtpass.Text,Trim())

次のように、強制的にDeliveryMethodSMTP サーバーを使用することもお勧めします。

SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
于 2013-09-13T13:51:19.713 に答える
0

私自身の実験によると、.NET の SmtpClient クラスは実際には SMTP over SSL (SMTPS) をサポートしていません。クライアント オブジェクトで .EnableSsl フラグを切り替えると、代わりにクライアントが STARTTLS を使用するようになります。

SMTPS が多くの理由で STARTTLS を支持して廃止されたことを考えると、これは驚くべきことではありません。そのほとんどは、新旧のクライアントとサーバー間のシームレスな相互運用性に関係しています。

SMTPS: クライアントはターゲット サーバーとの TCP 接続を開きます。2 つはすぐに SSL ハンドシェイクを開始し、通常の SMTP プロトコル (EHLO、AUTH など) を使用してその SSL トンネルを介して通信を開始します。

STARTTLS: クライアントは、ターゲット サーバーとの TCP 接続を開きます。クライアントは EHLO を発行してから STARTTLS を発行します。これはプレーンテキストを使用して行われます。STARTTLS コマンドは、クライアントとサーバーに、すでに開いているソケットを介して SSL ハンドシェイクを開始するように求めます。今後のすべての通信 (AUTH コマンド以降) は、現在確立されている SSL トンネルを介して行われます。

これは、SmtpClient オブジェクトが SMTPS を想定しているサーバーに接続している場合に問題を引き起こします。クライアントは、SSL ハンドシェイクをすぐに開始するのではなく、ソケットを開いた後に EHLO を送信します。これにより、サーバーは SSL ハンドシェイクが失敗したと見なし、接続が停止または切断されます。クライアントはタイムアウトし、SmtpException を受け取ります。

ポート 465 でリッスンしている SMTP サーバーは、おそらく SMTPS を予期しています。SMTPS には独自の専用ポートがあり、オプションで STARTTLS をサポートすることはできません。これは、定義上、STARTTLS では、サーバーが SSL を使用する前に開始 EHLO および STARTTLS コマンドを受け入れて応答する必要があるためです。

ただし、587 や 25 などの従来のポートの SMTP サーバーには、サーバー ソフトウェアが STARTTLS をサポートし、サービス管理者がそれを有効にすることを選択した場合に、STARTTLS をサポートするオプションがあります。これが、この問題についてインターネットに投稿している多くの人々が、ポートを 465 から 587 に変更することで SmtpClient を機能させることができることに気付いた理由です。


短いバージョン: SmtpClient クラスは STARTTLS をサポートしますが、SMTP over SSL (SMTPS) はサポートしません。クライアント オブジェクトで .EnableSsl フラグを使用する場合は、接続先のサーバーとポートが STARTTLS をサポートしていることを確認してください。サーバーとポートが代わりに真の SMTPS をリッスンして予期している場合、クライアント オブジェクトは正常に接続できず、送信は失敗します。ポート 465 は、SMTPS にほぼ独占的に使用されます。ポート 25 および 587 は、通常の SMTP または STARTTLS をサポートする SMTP (STARTTLS が使用可能な場合) に使用されます (オプション)。

于 2014-02-06T18:11:46.873 に答える