2017-01-24 21 views
1

私はコーディングをお願いします。電子メールにメッセージを送信しようとしていますが、ボタンをクリックしてメッセージを送信しようとするとエラーが発生します。下記のコーディングです:c#メール/メッセージ/ SMTPエラーを送信

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Mail; 


namespace CO6009DissertationV5 
{ 

    public partial class frmSendMsg : Form 
    { 

     public frmSendMsg() 
     { 
      InitializeComponent(); 
     } 

     private void btnSend_Click(object sender, EventArgs e) 
     { 
      SmtpClient client = new SmtpClient(); 
      client.Host = "smtp.gmail.com"; 
      client.Port = 587; 
      client.EnableSsl = true; 

      System.Net.NetworkCredential userpassword = new System.Net.NetworkCredential(); 
      userpassword.UserName = "[email protected]"; 
      userpassword.Password = "password"; 

      client.Credentials = userpassword; 

      MailMessage msg = new MailMessage("[email protected]", "[email protected]"); 
      **msg.To.Add(new MailAddress(txtBoxToEmail.Text));** 
      msg.Body = "<b> Sender's Name: </b>" + txtBoxName.Text + "<p><b> Sender's E-mail: </b>" + txtBoxEmail.Text + "<p><b>Sender's Subject: </b>" + txtBoxSubject.Text + "<p><b>Sender's Message: </b>" + "<p>" + txtBoxMsg.Text; 
      msg.Subject = txtBoxSubject.Text; 
      msg.IsBodyHtml = true; 

      try 
      { 
       client.Send(msg); 
       lblMsgStatus.Text = "<p> Message Successfully Sent </p>"; 
      } 

      catch (Exception ex) 
      { 
       lblMsgStatus.Text = "Send failed"; 
      } 
     } 
    } 
} 

主な問題は、この行のようだ:

msg.To.Add(new MailAddress(txtBoxToEmail.Text)); 

プロジェクトがエラー行与え、ここで停止し続けたよう:

{ "パラメータを'addresses'は空の文字列にすることはできません。\ r \ nパラメータ名:アドレス "}。

ご協力いただければ幸いです。

+1

ここにあなたのユーザー/パスワードでコードを貼り付けないでください! – Pikoh

+1

入手したエラーメッセージのテキストを追加してください。 – Filburt

+0

また、[Gmail経由で電子メールを送信する](http://stackoverflow.com/q/32260/205233)をチェックしてください。他にも多くの質問があります。以前はあなたのエラーが発生した可能性が非常に高いです。 – Filburt

答えて

2

txtBoxToEmail.Textは、有効な電子メールアドレス

msg.To.Add(new MailAddress(txtBoxToEmail.Text)); 

ない場合、この行は、それはまだはっきりしていない場合は、のtry-catchを使用してコードをラップし、例外の詳細を

を評価してくださいだけで失敗する可能性があります編集:あなたの編集を参照してください、私は例外メッセージ "パラメータのアドレス '空の文字列にすることはできませんと思います。\ r \ nパラメータ名:アドレスはかなり明確です

0

メールを送信する前にあなたのEmailIdを検証する方が良い。親切方法 の下に追加し、このようなあなたのボタンのクリックイベントでそれを呼び出す:

 if (IsValidEmail(txtBoxToEmail.Text)) 
    { 
      msg.To.Add(new MailAddress(txtBoxToEmail.Text)); 
    } 

方法を電子メールIDを検証するために:

static bool IsValidEmail(string email) 
    { 
     try 
     { 
      var addr = new System.Net.Mail.MailAddress(email); 
      return addr.Address == email; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
+0

これはtry/catchでラップされた元のコードと同じことです。これはどんな種類のバリデーションも行いません。 OPは* try */catchブロックにコードをラップしています。 –

+0

@ Panagiotis Kanavosオリジナルコードのヌルチェックを教えてください。 – Karthikeyan

+0

@ Panagiotis Kanavos私が投稿した答えはnullをチェックします。 – Karthikeyan

1

エラーメッセージは非常に明確である - 対処するためのテキストは空です。つまり、txtBoxToEmail.Textは空です。

将来は、アドレスを確認して使用することで回避できます。あなたは簡単に例えば、String.IsNullOrWhitespaceと空の文字列をチェックすることができます。

private void btnSend_Click(object sender, EventArgs e) 
{ 
    if (String.IsNullOrWhitespace(txtBoxToEmail.Text)) 
    { 
     MessageBox.Show("To can't be empty!","Invalid Address", 
         MessageBoxButtons.OK,MessageBoxIcon.Error); 
     return; 
    } 
... 

あなたが例えばテキストは@文字が含まれていることを保証し、より精巧なチェックを追加することができます。

しかし、ユーザーが正しい入力を入力せずに電子メールを送信しようとすることができないように、コントロールとフォーム自体に検証を追加することも、さらに優れたソリューションです。

Windowsフォームには、User Input Validation in Windows Formsで説明されているように、入力を検証するさまざまな方法が用意されています。

txtBoxToEmailValidatingイベントを処理して、有効なアドレスを確認し、アドレスが正しいまでユーザーがコントロールから離れるのを防ぐことができます。実際、ドキュメントの例は電子メールによる検証です! :

private void textBox1_Validating(object sender, 
       System.ComponentModel.CancelEventArgs e) 
{ 
    string errorMsg; 
    if(!ValidEmailAddress(textBox1.Text, out errorMsg)) 
    { 
     // Cancel the event and select the text to be corrected by the user. 
     e.Cancel = true; 
     textBox1.Select(0, textBox1.Text.Length); 

     // Set the ErrorProvider error with the text to display. 
     this.errorProvider1.SetError(textBox1, errorMsg); 
    } 
} 

private void textBox1_Validated(object sender, System.EventArgs e) 
{ 
    // If all conditions have been met, clear the ErrorProvider of errors. 
    errorProvider1.SetError(textBox1, ""); 
} 
public bool ValidEmailAddress(string emailAddress, out string errorMessage) 
{ 
    // Confirm that the e-mail address string is not empty. 
    if(String.IsNullOrWhitespace(emailAddress.Length)) 
    { 
     errorMessage = "e-mail address is required."; 
     return false; 
    } 

    // Confirm that there is an "@" and a "." in the e-mail address, and in the correct order. 
    if(emailAddress.IndexOf("@") > -1) 
    { 
     if(emailAddress.IndexOf(".", emailAddress.IndexOf("@")) > emailAddress.IndexOf("@")) 
     { 
     errorMessage = ""; 
     return true; 
     } 
    } 

    errorMessage = "e-mail address must be valid e-mail address format.\n" + 
     "For example '[email protected]' "; 
     return false; 
} 

サンプルは次の問題の入力に感嘆符とエラーUIを表示するErrorProviderコンポーネントを使用します。

あなたは良い方法がtxtBoxToEmail.Textの値をチェックしているHow to: Display Error Icons for Form Validation with the Windows Forms ErrorProvider Component

0

にErrorProviderに関する詳細な情報を見つけることができます。多分それはヌルまたは空です。 次に、.To.Add(new MailAddress(txtBoxToEmail.Text))を使用します。

関連する問題