0

わかった; メールメッセージを送信できないようです。これをコンソールアプリケーションとして実行しています:

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

namespace Email
{
    class Program
    {
        static void EMail(string ToAddress, string Subject, string Body, string FromAddress, string Host, int Port, string Username, string Password)
        {
            System.Net.Mail.SmtpClient SMTPClient = new System.Net.Mail.SmtpClient(Host, Port);
            System.Net.Mail.MailMessage Message = new System.Net.Mail.MailMessage();
            Message.To.Add(new System.Net.Mail.MailAddress(ToAddress));
            Message.From = new System.Net.Mail.MailAddress(FromAddress);
            Message.Body = Body;
            Message.Subject = Subject;
            SMTPClient.EnableSsl = true;
            SMTPClient.Credentials = new System.Net.NetworkCredential(Username, Password);
            SMTPClient.Send(Message);
            SMTPClient.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(FinishedSending);
        }
        static void FinishedSending(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            Console.WriteLine("DONE!");
        }
        static void Main(string[] args)
        {
            EMail("***********", "Hi!", "This is a test, Sent from a C# application.", "******", "smtp.gmail.com", 465, "****************", "**************");
            Console.ReadLine();
        }
    }
}

エラーが発生していない、Gmail アカウントで受信していない、「DONE!」と書かれていない。ポート 465 の送信と受信を許可しました。ポート 465 で smtp.gmail.com を Telnet すると、空白のコマンド プロンプト ウィンドウが表示されます。ありがとう。

4

4 に答える 4

4

例外がない場合は、電子メールを通過する必要があります。

「DONE!」は印刷されていません。メソッドを呼び出したにイベントにフックしているためですSend()。sendを呼び出すでもフックします。

編集:そして、はい、そうあるべきですSendAsync。送信は同期的です。

また、次の順序でこれらのパラメーターを試してください。

smtpClient.EnableSsl = true;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = (...)

このコードは、新しいWinformsアプリケーションで機能します。

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            var state = e.UserState;
            //"Done"
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var smtpClient = new SmtpClient("smtp.gmail.com", 587)
            {
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential("myEmail@gmail.com", "mypassword")
            };

            var message = new MailMessage("myEmail@gmail.com", "myEmail@gmail.com", "Subject", "body");

            smtpClient.SendCompleted += new SendCompletedEventHandler(smtpClient_SendCompleted);
            smtpClient.SendAsync(message, new object());

        }
    }
于 2013-01-13T23:17:31.177 に答える
0

System.Net.Mail.SmtpClient :: Send()は、本来あるべきほど同期していない可能性があると思います。このクラスは、タスクスケジューラによって実行されるPowerShellスクリプトで使用していました。PowerShellコンソールからスクリプトを実行すると、常にメッセージが表示されます。ただし、スクリプトをスケジュールされたタスクとして実行する場合は、実行しません。

送信後1秒間スクリプトをスリープさせることで問題を解決しました。スクリプトの最後でPowerShellがシャットダウンすることで、SMTPセッションが強制終了されたと思われます。これは、インタラクティブセッションから実行した場合には発生しません。

私はそれがだらしないことを知っています、しかし私はそれが実際に終わっていることを確認するためのより良い方法を見つけていません。たぶん、フラッシュする必要のあるバッファがありますか?

別の方法として、実際のメッセージを送信した後、偽のメッセージを使用してSend()を呼び出すこともできます。これを行うと、メッセージが一貫して送信されることがわかりました。これはまだだらしのないものですが、任意の時間待機している間に送信する前に実際にバッファをフラッシュする必要がある可能性が高いため、少しずさんなことがわかります。

于 2013-03-21T16:58:04.973 に答える
0

機能しない理由は、ポート 465 をターゲットにしているためです。EnableSsl をポート 25 (Gmail では使用できません) またはポート 587 で使用するとうまくいくはずです。

ポート 465 での SMTPS、または Microsoft が多くの場所で呼んでいる「暗黙の SSL」は、SmtpClient クラスではサポートされていません。EnableSsl プロパティは、暗号化されていない接続が確立された後に、クラスが STARTTLS コマンドを探して使用するかどうかを制御します。

Microsoft SmtpClient.EnableSsl プロパティのドキュメントに従って:

SmtpClient クラスは、RFC 3207 で定義されているように、Transport Layer Security を介したセキュアな SMTP の SMTP サービス拡張のみをサポートします。このモードでは、SMTP セッションは暗号化されていないチャネルで開始され、クライアントからサーバーに STARTTLS コマンドが発行されて切り替えられます。 SSLを使用した安全な通信。詳細については、Internet Engineering Task Force (IETF) によって発行された RFC 3207 を参照してください。

別の接続方法は、プロトコル コマンドが送信される前に SSL セッションが確立される方法です。この接続方法は、SMTP/SSL、SMTP over SSL、または SMTPS と呼ばれることがあり、デフォルトではポート 465 を使用します。SSL を使用するこの代替接続方法は、現在サポートされていません。

本当にポート 465 経由で SMTPS を使用する必要がある場合は、非推奨の System.Web.Mail クラスを使用した解決策があります。これは、舞台裏で CDONTS を使用します (例: https://stackoverflow.com/a/1014876 )

于 2016-09-08T04:22:33.947 に答える