DOBON.NET DOBON.NETプログラミング掲示板過去ログ

System.Web.Mail.SmtpMail.Sendでメールが送信できない

環境/言語:[Windows XP Pro SP2、VB.NET 2002、.NET Framework 1.0 SP3]
分類:[.NET]

こちらのサイトに載っていた以下の例、

Dim mm As New System.Web.Mail.MailMessage()
'送信者
mm.From = "a@a.com"
'送信先
mm.To = "b@b.com"
'題名
mm.Subject = "テスト"
'本文
mm.Body = "こんにちは。これはテストです。"
'JISコードに変換する
mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220)
'無理やりContent-Transfer-Encoding=7bitとする
mm.Headers("Content-Transfer-Encoding") = "7bit"
'SMTPサーバーを指定する
System.Web.Mail.SmtpMail.SmtpServer = "c.com"
'送信する
System.Web.Mail.SmtpMail.Send(mm)

を実行すると、最後の行で、

'System.Web.HttpException' のハンドルされていない例外が system.web.dll で発生しました。
追加情報 : 'CDO.Message' オブジェクトにアクセスできませんでした。

というエラーが発生してしまい、メールを送信できません。どうしたらよいのでしょうか。
あと、SMTPサーバーはlocalhostと設定すればよいのでしょうか。
または、自宅メールサーバを運営しているので、そのサーバのIPアドレスを入力すればよいのでしょうか。
■No6152に返信(UMUさんの記事)
> 'System.Web.HttpException' のハンドルされていない例外が system.web.dll で発生しました。
> 追加情報 : 'CDO.Message' オブジェクトにアクセスできませんでした。
>
> というエラーが発生してしまい、メールを送信できません。どうしたらよいのでしょうか。
> あと、SMTPサーバーはlocalhostと設定すればよいのでしょうか。
> または、自宅メールサーバを運営しているので、そのサーバのIPアドレスを入力すればよいのでしょうか。

この辺りを参照
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7669&forum=7

このあたりも参照してください。
http://ast.pekori.to/wiki/wiki.cgi?sample%2f040914SendMail

エラーが発生する場合はTry-Catchで括って
Exceptionの内容を ex.ToString 等で確認したほうが
解決の糸口がつかめると思います。

上のサンプルでは実際にExceptionをcatchしています。

#この手の検索は私のブログ上でも(検索エンジン経由で)月に50件程度参照が
#行われているため、みんな困っているんだなと感じました。

■No6152に返信(UMUさんの記事)
> こちらのサイトに載っていた以下の例、
>
> Dim mm As New System.Web.Mail.MailMessage()
> '送信者
> mm.From = "a@a.com"
> '送信先
> mm.To = "b@b.com"
> '題名
> mm.Subject = "テスト"
> '本文
> mm.Body = "こんにちは。これはテストです。"
> 'JISコードに変換する
> mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220)
> '無理やりContent-Transfer-Encoding=7bitとする
> mm.Headers("Content-Transfer-Encoding") = "7bit"
> 'SMTPサーバーを指定する
> System.Web.Mail.SmtpMail.SmtpServer = "c.com"
> '送信する
> System.Web.Mail.SmtpMail.Send(mm)
>
> を実行すると、最後の行で、
>
> 'System.Web.HttpException' のハンドルされていない例外が system.web.dll で発生しました。
> 追加情報 : 'CDO.Message' オブジェクトにアクセスできませんでした。
>
> というエラーが発生してしまい、メールを送信できません。どうしたらよいのでしょうか。
> あと、SMTPサーバーはlocalhostと設定すればよいのでしょうか。
> または、自宅メールサーバを運営しているので、そのサーバのIPアドレスを入力すればよいのでしょうか。
教えていただいたURLを参照してみたのですが、やはり私の環境では問題ない気がします。しかしできません。

参照したHP本文より
>1. このクラスはWindows NT系列のOSでしか利用できません。Windows 98、Windows Me上では利用できません。また、Windows XP Home Editionでも利用できません。

 Windows XP Proなのでできるはずだと思うのですが。

>2. このクラスを利用するためには、Windows 2000以降ではCDOsys.dllが、Windows NT 4.0ではCDOnts.dllが、それぞれシステムにインストールされ、正しく登録されている必要があります。

 やはりこの辺が問題なのだと思うのですが、そもそもこのDLLってなんなんでしょう。標準でインストールされているものではないのでしょうか。

>http://ast.pekori.to/wiki/wiki.cgi?sample%2f040914SendMail

 やってみましたが、出力にはこんなエラーが出ました。

*** EXCEPTION ----------------------------------
System.Web.HttpException: 'CDO.Message' オブジェクトにアクセスできませんでした。 ---> System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.Runtime.InteropServices.COMException (0x80040213): 転送においてサーバーに接続できませんでした。

 自分で調べた情報によると、SMTPサーバは通常localhostと設定すれば問題ないとあったのですが、だめなのでしょうか。
■No6172に返信(UMUさんの記事)
> >http://ast.pekori.to/wiki/wiki.cgi?sample%2f040914SendMail
>
>  やってみましたが、出力にはこんなエラーが出ました。
>
> *** EXCEPTION ----------------------------------
> System.Web.HttpException: 'CDO.Message' オブジェクトにアクセスできませんでした。 ---> System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.Runtime.InteropServices.COMException (0x80040213): 転送においてサーバーに接続できませんでした。

「エラーが出ました」だけでなく、
エラーメッセージの内容を確認してみてください。

今回の場合、テスト環境ではメールの転送において、メールの送信サーバである"c.com"に接続ができませんでした。

ですから、
プログラムから接続できる送信メールサーバを指定してあげてください。


説明ページにも書いていますが
%%以下の点について確認してください。
%%指定したメールサーバに到達できるか。
%%FQDN(完全なドメイン名)を指定している場合、名前解決ができるかどうか。
%%メールの送信先サーバは実在するか。
%%メールの受信者のアドレスは実在するか。

を必ず確認してください。

送信サーバに接続できなければExceptionが発生します。
メールの送信先(To)のドメインが見つからない場合はExceptionが発生します。
メールサーバに当該ユーザが存在しない場合Exceptionが発生する場合があります。

サンプルの説明が不足しており誤解を招いてしまったようです。
もう一度確認してみてください。
■No6172に返信(UMUさんの記事)
>  自分で調べた情報によると、SMTPサーバは通常localhostと設定すれば問題ないとあったのですが、だめなのでしょうか。

その情報元にはサンプルソースはありませんでしたか?
2004/09/15(Wed) 02:56:07 編集(投稿者)

>エラーメッセージの内容を確認してみてください。

 内容も確認し、意味も分かっているのですが、問題はなぜ送信サーバに接続できないのかということです。やはりどこを調べても、Windows XP Proに内蔵されているDLLを使用して送信するため、localhostと設定すればできると書いてありますし・・・

> その情報元にはサンプルソースはありませんでしたか?

 サンプルソースのとおりにやったら今回のエラーが出ました。
送信サーバの指定に自分で運営している自宅メールサーバのIPアドレスを指定し、
メーラで一度新着メールのチェック(受信)を行ってからプログラムを実行した結果、
一度だけ送信に成功しました。宛先側でも受信できました。
おそらく、自宅メールサーバの
「一度受信しなければ送信させない」
というスパム防止機能が働いているためだと思われます。

ということで、サーバのスパム防止機能を停止すればこの方法で一応できますが、
やはり、送信サーバにlocalhostと指定して送信できない原因がいまだ不明のままです。
もしかして、送信するPCにIISがインストールされていないとできないのでしょうか。
自分で調べた限りではそのようなことは書かれていなかったのですが・・・
Windows NT系のOSでWindows XP Home以外ならできるとしか・・・

DOBON.NET | プログラミング道 | プログラミング掲示板