1

なぜこのエラーが発生するのかわかりません。初歩的なようです。とにかく、EmailSender というシングルトン クラスがあります。以下のコードは短くて簡単です。問題は、MainWindow クラスで sender を使用できないことです。sender.Send() などの試みは、asdafsafas.Send() を実行したかのように扱われます。ランダムな文字列であるかのように扱われます。なぜこれが起こっているのか分かりません。

using System;
using System.Net.Mail;
using System.Windows.Forms;

namespace SendMail
{
    public partial class MainWindow : Form
    {
        #region Private variables
        private MailMessage msg = new MailMessage();
        private EmailSender sender = EmailSender.GetInstance();
        #endregion

        public MainWindow()
        {
            InitializeComponent();

        }

        private MailMessage PrepareMailMessage()
        {

            return msg;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {

        }
    }
}

GetInstance メソッドは次のとおりです。

public static EmailSender GetInstance()
{
    return _instance ?? (_instance = new EmailSender());
}
4

4 に答える 4

6

これは、このメソッドを定義した方法が原因です (sender はパラメーターです)。クラスレベルの変数ではなく、メソッドの引数を最初に見つけています。これを修飾できます:

private void btnSend_Click(object sender, EventArgs e)
{
    // sender here is the "(object sender, " paramater, so it's defined
    // as system object.

    // use this instead:
    this.sender.Send(); // The "this" will make the class find the instance level variable instead of using the "object sender" argument
}
于 2011-11-04T19:21:21.380 に答える
1

これsenderは、 がメール オブジェクトではなく、イベントをトリガーしたボタンであるためです。SmtpClientメールを送信するには、次のものが必要です。

private void btnSend_Click(object sender, EventArgs e)  
{  
    SmtpClient client = new SmtpClient("192.0.0.1", 25); //host, port
    client.Send(msg);
}

また、このMailMessageクラスは を実装IDisposableしているため、メッセージの処理が完了したらメッセージを破棄するコードが必要です。

破棄を含め、メールを送信するために必要なすべてを含むラッパーを作成しました。

/// <summary>
/// Wrapper class for the System.Net.Mail objects
/// </summary>
public class SmtpMailMessage : IDisposable
{
    #region declarations

    MailMessage Message;
    SmtpClient SmtpMailClient;

    #endregion

    #region constructors

    /// <summary>
    /// Default constructor for the SmtpMailMessage class
    /// </summary>
    public SmtpMailMessage()
    {
        //initialize the mail message
        Message = new MailMessage();
        Message.Priority = MailPriority.Normal;
        Message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;            
        Message.From = new MailAddress("xxx@abc.com");           

        //initialize the smtp client
        SmtpMailClient = new SmtpClient();
        SmtpMailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
        SmtpMailClient.Host = "192.168.0.1";
        SmtpMailClient.Port = 25;
    }

    /// <summary>
    /// Parameterized constructor for the SmtpMailMessage class. Allows for override of the default
    /// SMTP host and port number
    /// </summary>
    /// <param name="HostIP">The IP address of the exchange server</param>
    /// <param name="PortNumber">The port number for ingoing and outgoing SMTP messages</param>
    public SmtpMailMessage(string HostIP, int PortNumber) : this()
    {
        //override the smtp host value
        SmtpMailClient.Host = HostIP;

        //override the smtp port value
        SmtpMailClient.Port = PortNumber;
    }

    #endregion

    #region subject / body

    /// <summary>
    /// The body content of the mail message
    /// </summary>
    public string Body
    {
        get
        {
            return Message.Body;
        }
        set
        {
            Message.Body = value;
        }
    }

    /// <summary>
    /// the subject of the mail message
    /// </summary>
    public string Subject
    {
        get
        {
            return Message.Subject;
        }
        set
        {
            Message.Subject = value;
        }
    }

    #endregion

    #region mail type

    /// <summary>
    /// Gets or sets a value that determines whether the mail message
    /// should be formatted as HTML or text
    /// </summary>
    public bool IsHtmlMessage
    {
        get
        {
            return Message.IsBodyHtml;
        }
        set
        {
            Message.IsBodyHtml = value;
        }
    }

    #endregion

    #region sender

    /// <summary>
    /// Gets or sets the from address of this message
    /// </summary>
    public string From
    {
        get
        {
            return Message.From.Address;
        }
        set
        {
            Message.From = new MailAddress(value);
        }
    }

    #endregion

    #region recipients

    /// <summary>
    /// Gets the collection of recipients
    /// </summary>
    public MailAddressCollection To
    {
        get
        {
            return Message.To;

        }
    }

    /// <summary>
    /// Gets the collection of CC recipients 
    /// </summary>
    public MailAddressCollection CC
    {
        get
        {
            return Message.CC;
        }
    }

    /// <summary>
    /// Gets the collection of Bcc recipients
    /// </summary>
    public MailAddressCollection Bcc
    {
        get
        {
            return Message.Bcc;
        }
    }

    #endregion

    #region delivery notification

    /// <summary>
    /// Gets or sets the delivery notification settings for this message
    /// </summary>
    public DeliveryNotificationOptions DeliveryNotifications
    {
        get
        {
            return Message.DeliveryNotificationOptions;
        }
        set
        {
            Message.DeliveryNotificationOptions = value;
        }
    }

    #endregion

    #region priority

    /// <summary>
    /// Gets or sets the Priority of this message
    /// </summary>
    public MailPriority PriorityLevel
    {
        get
        {
            return Message.Priority;
        }
        set
        {
            Message.Priority = value;
        }
    }

    #endregion

    #region send methods

    /// <summary>
    /// Sends the message anonymously (without credentials)
    /// </summary>
    public void Send()
    {
        SmtpMailClient.Send(Message);
    }

    /// <summary>
    /// Sends the message with authorization from a network account   
    /// </summary>
    /// <param name="Username">The Windows username of the authorizing user</param>
    /// <param name="Password">The Windows password of the authorizing user</param>
    /// <param name="Domain">The domain name of the network to which the authorizing user belongs</param>
    public void Send(string Username, string Password, string Domain)
    {
        //attach a network credential to this message using the information passed into the method
        SmtpMailClient.Credentials = new NetworkCredential(Username, Password, Domain);

        //send the message
        SmtpMailClient.Send(Message);
    }

    #endregion

    #region IDisposable implementation

    ~SmtpMailMessage()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);            
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (Message != null)
                Message.Dispose();
            Message = null;                
            SmtpMailClient = null;
        }
    }

    #endregion        
}

実装:

using (SmtpMailMessage mail = new SmtpMailMessage("192.168.0.1", 25))
{
    //set the to address to the primary email
    mail.To.Add("xxx@abc.com");

    //set the message type and subject and body
    mail.IsHtmlMessage = true;
    mail.Subject = "Foo";
    mail.Body = "Hello world!";

    //send the email
    mail.Send();
}
于 2011-11-04T19:19:34.750 に答える
0

メソッドのスコープ内で実行している場合btnSend_Click、パラメーターobject senderは global よりも優先されますEmailSender sender

たとえば、グローバル変数の名前を変更するか、必要なEmailSender m_sender送信者を正確に指定する必要があります。this.sender.Send()

于 2011-11-04T19:20:59.877 に答える
0

btnSend_Click関数でsender.Sendを呼び出していると思います。

その関数には、sender (オブジェクト送信者) とも呼ばれるパラメーターがあります。今、あなたはどちらを使うべきか混乱しています。したがって、プライベート var 送信者の名前を変更します。

于 2011-11-04T19:22:07.623 に答える