- PR -

POP Before SMTP サーバからメールを送信できない

1
投稿者投稿内容
hIzzI
会議室デビュー日: 2005/06/02
投稿数: 10
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-22 18:16
POP Before SMTP サーバからメールを送信したいのですが、
「メールボックスが使用できません。 サーバーの応答: 5.7.1 <[送信先のメールアドレス]>... Relaying denied 」
というエラーが発生しメールを送信することが出来ません。

以下のようなコードで送信を試みているのですが、どこか記述が間違っているのでしょうか?
よろしくお願いします。

// POP Before SMTP サーバのため、一度POPサーバにログイン
string userName = "test@test.net";
string password = "test";
TcpClient tcp = new TcpClient();
tcp.Connect("test.net", 110);
using (StreamWriter sw = new StreamWriter(tcp.GetStream()))
{
sw.Write("USER " + userName + "\nPASS " + password + "\nQUIT\n");
}
tcp.Close();

// 送信データの作成
MailAddress ma = new MailAddress("test@test.net"); // 送信元
MailAddress ma2 = new MailAddress("[送信先のメールアドレス]"); // 送信先
MailMessage mm = new MailMessage(ma.Address, ma2.Address, "Title", "Body");

// メールの送信
SmtpClient sc = new SmtpClient("smtp.test.net", 25);
sc.Send(mm);


[ メッセージ編集済み 編集者: hIzzI 編集日時 2006-08-24 12:08 ]
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-08-22 18:36
こんばんは。

件の SMTP サーバが SMTP-AUTH を導入しているとしたら、コードに不備があります(掲載されていないだけかもしれませんが)。
その辺りいかがでしょうか。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
hIzzI
会議室デビュー日: 2005/06/02
投稿数: 10
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-23 11:58
返信ありがとうございます。

SMTP-AUTHに対応するためメールの送信部分を以下のようにしたのですが同じエラーが発生してしまします。

// メールの送信
NetworkCredential nc = new NetworkCredential(userName, password);
SmtpClient sc = new SmtpClient("smtp.test.net", 25);
sc.UseDefaultCredentials = false;
sc.Credentials = nc;
sc.Send(mm);

SMTP-AUTH以前に根本的な考え方が何か間違っているのでしょうか?
仕様としては

会員登録が出来るWEBサイトがあり、そこで新規登録を行ったときにレンタルサーバーのSMTPサーバー(ここではsmtp.test.net、差出人はtest@test.net)を通して、新規登録完了のメールを送信する

といったWEBサイトではよくある仕組みです。
メール送信の部分がうまくいかないためお手上げ状態です。
よろしくお願い致します。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-08-23 23:18
#私は初学者なのでwebサーバとの関係がよくわからないのですが(汗

実際にレンタルサーバのSMTPサーバはSMTP-Authに対応しているんでしょうか?TELNETで繋いで話した場合にはどうなりますか?
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-08-23 23:47
何となく気になりまして書き込みいたします。
的を外していたら申し訳ありません。

Pop3にアクセスした結果のステータスは正常値が戻ってきているのでしょうか?

少々面倒だと思われますが、コマンド単位で戻り値のステータスを確認し、
正常にPop3にアクセスできているかという箇所を確認してみたいところです。

またSmtpの送信ロジック自体をPop3と同様にTcpClientを利用したロジックに切り替え、
コマンド単位でエラーステータスを確認してみるのも一つの手だと思います。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-24 00:31
こんばんは。

私もAhfさんと同じことを考えていました。

コード:

using (StreamWriter sw = new StreamWriter(tcp.GetStream()))
{
    sw.Write("USER " + userName + "\nPASS " + password + "\nQUIT\n");
}


これだと送りっぱなしでステータスを確認せずに抜けてしまっている
ので、POP Before SMTP になっていないのではないのかなぁと。

あとは ue さんの指摘は「件の SMTP サーバが SMT-AUTH を
導入しているとしたら」という仮定でのことなので(たぶんエラーメッ
セージが SMTP-AUTH を導入している場合と同じだったのだと
思われる)そこで SMTP-AUTH のコーディングをするのは、ちょっ
と違うのかなぁ…と思ってみたり。
その辺は shimix さんも指摘していますが、SMTP-AUTH に対
応しているんでしょうか。

まずは問題の切り分けを。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
hIzzI
会議室デビュー日: 2005/06/02
投稿数: 10
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-28 23:46
shimixさん、Ahfさん、ぽぴ王子さん返信ありがとうございます!

みなさんのご指摘を元にPOP3 Before SMTPの部分をコマンド単位に切り分けてサーバー側に送信したところうまくいきました。
ありがとうございました!

以下は変更後のPOP3 Before SMTP部分のコードです。(Label1にサーバから受信したデータを表示しています。)
using (StreamWriter sw = new StreamWriter(ns))
using (StreamReader sr = new StreamReader(ns))
{
sw.NewLine = "\r\n";
sw.AutoFlush = true;
Label1.Text = sr.ReadLine() + "<br>";
sw.WriteLine("USER {0}", userName);
Label1.Text += sr.ReadLine() + "<br>";
sw.WriteLine("PASS {0}", password);
Label1.Text += sr.ReadLine() + "<br>";
if (tcp.Connected)
{
sw.WriteLine("QUIT");
Label1.Text += sr.ReadLine() + "<br>";
}
}
tcp.Close();
1

スキルアップ/キャリアアップ(JOB@IT)