2011-12-21 19 views
2

私のアプリはIndy TiDSMTPクライアントコンポーネントを使用してメールを送信します。しかし、いくつかの状況では、顧客はSMTPサーバーとポート、ユーザー名などを設定することができません。何も設定しなくても電子メールを送信するソリューションを提供したいと考えています。外部サーバーを使わずにIndyでメールを送信する

私はTIDSMTPRelayのデモを試してみましたが、私はexplcitly DNSサーバーのIPアドレスを入力する必要があります(と私はこれをしなかったとき、それは「プロジェクトSMTPRelay.exeは、メッセージとともにEIdHostRequired例外クラスを 『』調達」で失敗しました)。私は、ユーザーがインターネットにアクセスできる限り、「すぐに使える」設定を入力する必要のないIndyソリューションを期待していました。

その他に何が必要ですか?

TIA、あなたが直接受信者のメールサーバーにメールを送信する必要が R

+3

いくつかのチェック(MXレコード、逆引きDNS検索、動的IP範囲など)が失敗した場合、相手先のメールサーバーによって受信メールが拒否されることがあることに注意してください。それにより、メールを受け入れて宛先に転送するメールサーバを「中継する」方が良いでしょう。 –

+0

私の会社の電子メールサーバーと認証の詳細をアプリにハードコードし、TidSMTP(クライアント)を使用してメールを送信するという意味ですか? – rossmcm

+0

DNSをルートサーバーから開始して解決できます。ローカルに構成されたDNSサーバーのIPアドレスを知る必要はありません。 –

答えて

10

。そのためには、受信者ドメインごとにMXレコードを取得するためにDNSルックアップを実行する必要があります。 IndyのTIdSMTPRelayコンポーネントは、あなたのためにそれを処理します(TIdDNSResolverコンポーネントを内部的に使用します)。

マシンの現在のDNS設定を問い合わせるプラットフォームに中立な方法はありません。これには、プラットフォーム固有のAPIが必要です。私はそれが将来のリリースでは可能性の範囲外ではないと思うが、Indyはそれを自動化するための場所に何も持っていない。

表示されている例外はTIdTCPClient.Connect()で発生しています。 TIdSMTPRelayを使用するときは、手動で呼び出すべきではありません。各受信者ドメインにどのHostが接続するかを決定した後、内部的に呼び出されます。オプションでRelaySenderプロパティを設定してSend()メソッドを呼び出すと、自分で行う必要があるのはDNSServerプロパティです。他に何もない。

+0

ありがとうございます。 [引用]この例外はTIdTCPClient.Connect()によって発生します。 TIdSMTPRelayを使用しているときは手動で呼び出すべきではありません。各受信者ドメインに対してどのホストに接続するかを決定した後、内部的に呼び出されます。 DNSServerプロパティを設定し、必要に応じてRelaySenderプロパティを設定し、Send()メソッドを呼び出します。私は 'TidSMTPRelay'デモの例を実行していましたが、これはすべてのフィールドを入力して「送信」をクリックすると、私がすべてのことをやったと仮定したものです。私はここで何が欠けていますか? – rossmcm

+0

TIdSMTPRelayのコード例が間違っていますか? – rossmcm

+0

間違っていない、ただ古い。 'btnSendMailClick()'では、 'Send()'を呼び出すだけで 'Connect()'と 'Disconnect()'の二つの呼び出しを取り除きます。そして、 'Send()'が終了する前に内部的にソケットを閉じるので、あなたは例外ハンドラで 'Connected()'と 'Disconnect()'への呼び出しを取り除くことができます。それ以外は、デモの他のものはすべて問題ありません。 –

関連する問題