0

C#でメールを送信するWebサービスがありました

    [WebMethod]
    public string sendEmail()
    {
        MailMessage mail = new MailMessage();
        SmtpClient smtpsvr = new SmtpClient("smtp.gmail.com");

        // mail settings

        // smtpsvr settings

        smtpsvr.SendCompleted += new SendCompletedEventHandler(sentCompleteCallBack);

        try
        {
            smtpsvr.SendAsync(mail, "Email 1");
            return "sent"; //this return only indicate email has been sent out
        }

        catch (Exception)
        {
            return "failed";
        }
    }

    private void sentCompleteCallBack(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Error != null) //error
        {
            sendResult = "email failed " + (string)e.UserState;
        }
        else
        {   //this result, indicate the process of sending email has been completed
            sendResult = "email sent " + (string)e.UserState;
        }

        // ??? haw to pass sendResult value to client page
    }

プロパティ文字列、クラス文字列を使用してsendResult値を取得してみました。しかし、クライアントページ(aspx)の最後では、空/nullのみを取得しました。文字列sendEmail()値しか取得できません。

sendResult値をクライアントに返す方法は?助けてくれてありがとう!

/ * ** * ** * *** /編集

このようにコードを変更する必要があるかもしれませんか?(まだsendAsync()を使用しています

    [WebMethod]
    public string sendEmail()
    {
    MailMessage mail = new MailMessage();
    SmtpClient smtpsvr = new SmtpClient("smtp.gmail.com");

    //mail settings

    //smtpsvr settings
    smtpsvr.SendCompleted += new SendCompletedEventHandler(sentCompleteCallBack);

    try
    {
        smtpsvr.SendAsync(mail, "email 1");
        return "sent"; 
    }

    catch (Exception)
    {
        return "failed";
    }
}

 private void sentCompleteCallBack(object sender, AsyncCompletedEventArgs e)
 {
    if (e.Error != null) //error
    {
       //write to DB_email_status = "failed"
    }
    else
    {   
      //write to DB_email_status = "success"
    }
}

クライアント側のページ(aspx):(1)Webサービスを呼び出して電子メールを送信します。(2)sendEmail()メソッドから電子メール送信文字列値を取得します。(3)button_onclick:DB_email_statusからデータを表示/取得します。(???)このケースは達成可能ですか?(!!!) 本当にありがとう。

4

3 に答える 3

0

または send() とスレッドを使用します。

 [WebMethod]
 public bool sendEmail()
 {
   //mail settings
   //smtp settings
   try 
   { 
        smtp.Send(mail);
        return true;
   }
   catch
   {
       return false;
   }

クライアント ページ (aspx)

   private void send()
   {
      Thread.Sleep(100;
      //call web service: sendEmail()
      if true 
      { label.Text = "sent"} else {label.Text = "fail"}
   }

   private void button_Onclick(...)
   {
       Thread t = new Thread (send);
        t.Start();
        t.Join();
    }

sendAsync() と同様に動作しますが、戻り値を取得する方が簡単です。

于 2012-07-31T00:01:17.220 に答える
0

以下のように、SendEmail メソッドの戻り値として bool を渡さないのはなぜですか

bool sentEmail()
{
bool isValid = false;

try
{
    //if email successful
    isValid = true
}
catch(Exception ex)

{

  //Email Fails
  isValid = false;
}

return isValid;

}
于 2012-07-30T01:34:29.163 に答える
0

If you are using stateless protocol as in HTTP , then the server(Web service) can give only one response to the client. So, there is no way for the WebService to send details of the Async results to the client unless the client probes it again for status.

IMO, your best bet is to use .Send() instead of .SendAsync(). You can use Timeout property to prevent the method from hanging.

于 2012-07-30T03:34:50.717 に答える