QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

SmtpClientクラスを使用したSMTP認証メール送信に失敗する。

お世話になります。

SmtpClientでSMTP認証メールを送信しようとすると、以下のエラーにより送信できな
い現象が起こっています。
 
 System.Net.Mail.SmtpException: 構文エラーです。コマンドが認識できません。
 サーバーの応答: Authentication required
 エラーコードは505

 .NET Framework1.1で存在するSystem.Web.Mail.SmtpMailクラスを使用すると
送信できます。
 (下記コード参照。本コードのsmtpClient.Sendで問題の例外が出ます。)

 メール送信を試みているmailサーバでサポートしている認証方式が、PLAINと
CRAM-MD5なのですが、SmtpClientクラスではこれらの方式に対応していないので
しょうか?

[環境]

 Windows2003Server Standard
 VS2005

---以下、コード

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Mail;
using System.Net.Mail;
using System.Diagnostics;

namespace SmtpClient
{
class MailClass
{
///
/// コンストラクタ
///
public MailClass()
{

    }

    /// <summary>
    /// メール送信
    /// </summary>
    /// <param name="hostName">メールサーバホスト名。例:mailServ.co.jp</param>
    /// <param name="mailAdr">メールアドレス。例:user1@yahoo.co.jp</param>
    /// <param name="usrName">認証ユーザ名。例:user1</param>
    /// <param name="passwd">パスワード。例:user1Pass</param>
    public void SendMail(string hostName, string mailAdr, string usrName, string passwd)
    {
        //
        //ここから:SmtpMailクラスを使用 .Net1.1
        //

        //メールメッセージを作成。
        System.Web.Mail.MailMessage mailMessage = new System.Web.Mail.MailMessage();
        mailMessage.To = mailAdr;
        mailMessage.From = mailAdr;
        mailMessage.Subject = "[Test]Smtp送信テスト(1.1)";
        mailMessage.Body = "SMTP送信テストです。";
        if (!string.IsNullOrEmpty(usrName))
        {
            // SMTP認証に設定
            mailMessage.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;
            mailMessage.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = usrName;
            mailMessage.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = passwd;
        }

        try
        {
            //メール送信
            SmtpMail.SmtpServer = hostName;
            SmtpMail.Send(mailMessage);
        }
        catch (Exception ee)
        {
            Debug.WriteLine(ee.ToString());
        }
        //
        //ここまで
        //

        //
        //ここから:SmtpClientクラスを使用するパターン .Net2.0
        //
        System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient(hostName);
        //SMTP認証を使用する場合、ユーザ名、パスワードを指定。
        smtpClient.UseDefaultCredentials = false;
        if (!string.IsNullOrEmpty(usrName))
        {
            smtpClient.Credentials = new System.Net.NetworkCredential(usrName, passwd);

        }
        System.Net.Mail.MailMessage mailMessage2 = new System.Net.Mail.MailMessage(mailAdr, mailAdr, "[Test]Smtp送信

テスト(2.0)", "SMTP送信テストです。");
mailMessage2.BodyEncoding = Encoding.GetEncoding("Shift-JIS");
mailMessage2.SubjectEncoding = Encoding.GetEncoding("Shift-JIS");
mailMessage2.Sender = new MailAddress(mailAdr);
mailMessage2.ReplyTo = new MailAddress(mailAdr);
try
{
//メール送信
smtpClient.Send(mailMessage2);
}
catch (SmtpException se)
{
Debug.WriteLine(se.ToString()+"\r\nコード:"+se.StatusCode+" "+se.StatusCode);
}
catch (Exception ee)
{

            Debug.WriteLine(ee.ToString());
        }
        //
        // ここまで
        //
    }

}

}

質問者:シロネコムサシ

回答

SMTP認証でメールを送信する(.NET Framework 2.0) VB2005(.NET Framework2.0)でSMTP認証を使ったメールの送信サンプルです。

[VB.NET]
Imports System.Net
Imports System.Net.Mail

Module Program
Sub Main()
Dim Message As New MailMessage("from", "to", "subject", "body")
Dim Client As New SmtpClient("smtp server name")
Client.Credentials = New NetworkCredential("user name", "password")
'Client.EnableSsl = True 'SSL認証のときは、コメントアウト
Client.Timeout = 100000 '←これが無いとダメ
Client.Send(Message)
End Sub
End Module

投稿者:Msist

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。