System.Net.Mail.SmtpClient について への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 覇王  (社会人) 投稿日時 2009/8/14 11:55:06
ありがとうございます^^
無事にSMTPサーバーを指定してメールを送ることができました。

投稿者 るきお  (社会人) 投稿日時 2009/8/10 06:02:01
こんにちは。

>どこをどのようにすればいいのでしょうか?
ホスト名(サーバー名)の指定が抜けているので最低でもこれを指定する必要があります。
ホスト名を指定するにはSmtpClientクラスのコンストラクタまたはHostプロパティを使用します。

>smtpclientの()にはSMTPサーバー名を入力するんですよね?
>自分の使ってるサーバー名を入力してテストしてみたら無事に
>メール送信に成功しました。
と書いてあるので、指定が必要なことはご存知なんだと思いますが、
投稿されているコード中には抜けていますね。

smtpのホスト名はメールサービスを契約しているプロバイダ(たとえば@nifty)が公開しています。
同じプロバイダと契約していてもホスト名が異なる場合があるので、個人ごとに設定する必要があります。

このことも
>ですが、自分のサーバーを設定してしまうと
>これを友達とかにあげた場合、サーバーが違うと
>メールを送信できないはずです・・・
と書いてあるのでご存じとは思うのですがコード中では抜けています。

>Windowsプログラミングで
>Mail_To
>Mail_From
>Mail_Sub
>Mail_Comment
>SMTP
>という5つのTextBoxとbuttonを作りました。
このSMTPというTextBoxを


  
Private Sub Send_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Send.Click
    Try
        Dim message As New System.Net.Mail.MailMessage(Mail_From.Text, Mail_To.Text)
        message.Subject = Me.Mail_Sub.Text
        message.Body = Me.Mail_Comment.Text
        Dim client As New System.Net.Mail.SmtpClient(SMTP.Text)
        client.Send(message)

        Mail_From.Clear()
        Mail_To.Clear()
        Mail_Sub.Clear()
        Mail_Comment.Clear()

        MessageBox.Show("メールを送信しました。""送信終了")
    Catch ex As Exception
        MessageBox.Show(ex.ToString, "エラー")
    End Try

End Sub


サーバー側で認証が必要な場合はさらに認証情報をセットする必要があります。
これにはCredentialプロパティを使用します。


  
Private Sub Send_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Send.Click
    Try
        Dim message As New System.Net.Mail.MailMessage(Mail_From.Text, Mail_To.Text)
        message.Subject = Me.Mail_Sub.Text
        message.Body = Me.Mail_Comment.Text
        Dim client As New System.Net.Mail.SmtpClient(SMTP.Text)
        client.Credentials = New Net.NetworkCredential("userName""password")
        client.Send(message)

        Mail_From.Clear()
        Mail_To.Clear()
        Mail_Sub.Clear()
        Mail_Comment.Clear()

        MessageBox.Show("メールを送信しました。""送信終了")
    Catch ex As Exception
        MessageBox.Show(ex.ToString, "エラー")
    End Try

End Sub


ネットワークが関連したプログラムではエラーの原因は無数に考えられるのでこれでもうまくいかないかもしれません。
大事なのは何が起こっているのか知ることです。
そのためにCatchブロック内で単にMessageBox.Show("送信できませんでした。", "エラー")とするのではなく、
なぜ送信に失敗したのかわかるようにフレームワークのエラーメッセージを表示するとよいでしょう。
上記の例ではその目的でCatchブロック内も少し変更しました。

※ただし、一般的に推奨されるスタンスでは汎用のExceptionのCatchはしないことになっています。
長くなるので割愛しますが機能的に問題があるわけではないのでこのくらいのプログラムなら上述のように書いてもよいと思います。

▼以下、投稿についての私の感想です。

今回のご質問は、ホスト名の指定について日本語の文章では書いてあるのにコード中で表現されていないので
正直①何がしたくて、②何がわからないのかよくわかりません。

>これがソースなのですが
>どこをどのようにすればいいのでしょうか?
このような聞き方をする前に、
どこがどうエラーになるのかの情報を提示したほうがよいです。

・○○の行で××というエラーメッセージが表示されます。
・エラーは何も発生しないのですがメールが届きません。

刈谷勇さんは、TextBoxではなく外部の設定ファイルに保存する方法がわからないのであろうと推量して
情報を提供されています。私もはじめの投稿を読んだ段階では同じ推量をしました。

それに対する覇王さんの返信の中で刈谷勇さんに対する返答が
>すみません。
>何回も読んだのですが、よく理解できせん・・・・

>これがソースなのですが
>どこをどのようにすればいいのでしょうか?
なので、結局なにをしたくて、何がわからないのかがわからないという状況になっています。

追加でご質問される場合は、
何がしたいのか、何がわからないのかをはっきり明記するとよいと思います。


・メール送信はできている。サーバー名を外部の設定ファイルから読み込む方法がわからない。
・メール送信はできている。サーバー名をTextBoxから入力する方法がわからない。
・メール送信はできたこともあるが、今できていない。まずは確実にメール送信できる方法が知りたい。
投稿者 覇王  (社会人) 投稿日時 2009/8/9 04:29:44
すみません。
何回も読んだのですが、よく理解できせん・・・・

これがソースなのですが
どこをどのようにすればいいのでしょうか?
Public Class Mail

    Private Sub Send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Send.Click
        Try
            Dim message As New System.Net.Mail.MailMessage(Mail_From.Text, Mail_To.Text)
            message.Subject = Me.Mail_Sub.Text
            message.Body = Me.Mail_Comment.Text
            Dim client As New System.Net.Mail.SmtpClient()
            client.Send(message)

            Mail_From.Clear()
            Mail_To.Clear()
            Mail_Sub.Clear()
            Mail_Comment.Clear()

            MessageBox.Show("メールを送信しました。", "送信終了")
        Catch ex As Exception
            MessageBox.Show("送信できませんでした。", "エラー")
        End Try

    End Sub
End Class



Windowsプログラミングで
Mail_To
Mail_From
Mail_Sub
Mail_Comment
SMTP
という5つのTextBoxとbuttonを作りました。
投稿者 刈谷勇  (社会人) 投稿日時 2009/8/9 03:05:31
覇王さん、こんにちは。

設定ファイルに設定させればいいと思います。
ここの初級講座「第37回 Myの用法」に詳しい使い方があります。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard37.htm
参照してみてください。
投稿者 覇王  (社会人) 投稿日時 2009/8/9 00:21:00
System.Net.Mail.SmtpClient
というメールを送るやつがありますけど・・・
smtpclientの()にはSMTPサーバー名を入力するんですよね?
自分の使ってるサーバー名を入力してテストしてみたら無事に
メール送信に成功しました。

ですが、自分のサーバーを設定してしまうと
これを友達とかにあげた場合、サーバーが違うと
メールを送信できないはずです・・・

なので、textを用意して、サーバー名を入力していただき、
それでbuttonを押したときにsmtpclientの()に情報を
入れる形にしたいのですが、どのようにしたらよろしいですか?