最近在寫一只程式,當動作完成時,會寄信通知.
而這程式原本是從VS2003升級到VS2005的,有些語法過時的,就轉到VS2005的物件.
其中有一個物件在修改後,卻發現一個奇怪的地方.
信會寄不出來?而我在測試時,並沒有問題啊.
檢查了一下資料庫的郵件位址的資料.
發現存進去的資料格式不是只有單純的郵件位置,其格式如下:
使用者名稱<test@test.com>
如果有多郵件地址時,則是用分號;的方式來串接
使用者名稱1<test1@test.com
>;使用者名稱2<test2@test.com>
但這種格式在System.Web.Mail.MailMessage的方式寄信,並不會有問題.
改用System.Net.Mail.MailMessage的2.0新增的元件寄信,就會有問題產生了.
寫了一個小程式試了一下信件格式的問題.
使用MailMessage.To.Add("使用者名稱<test@test.com>"); 失敗,無法寄,會跳出"指定字串不在電子郵件地址的必要表單中"的錯誤訊息.
但如果是MailMessage.To.Add("Test<test@test.com>");則是可以順利寄出.
所以如果顯示名稱要用中文的話,就必需改一點寫法
MailMessage.To.Add(new MailAddress(("使用者名稱<test@test.com>"));
當然MailAddress可選其它的方法,把顯示名稱放到第二個參數內,但這做法就要修改整個資料庫的資料,或是改用資料截取的方式,如果不行,情願用System.Web.Mail來寫.
再來就是多收件者用分號;串接的方式.
System.Net.Mail也不支援,同樣會跳出"指定字串不在電子郵件地址的必要表單中"的錯誤訊息.
必需一個一個用MailMessage.To.Add的方式加進去.
所以整個修改後,大致上的程式碼如下 :
try
{
string[] toa = textBox1.Text.Trim().Split(";".ToCharArray());
MailMessage newMail = new MailMessage();
newMail .From = new MailAddress("訊息通知<info@XXX.com.tw">");
newMail .Priority = MailPriority.Low;
newMail .IsBodyHtml = true;
newMail .Body = "TEST";
foreach (string to in toa)
{
myMail.To.Add(new MailAddress(to));
}
newMail .Subject = "Test";
SmtpClient sc = new SmtpClient("ext2.genuine.com.tw");
sc.Send(newMail );
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
還好,最後還是能寄了,不用改資料庫的資料,如果真的要改,那就改回去用System.Web.Mail~
留言列表