近期有个项目需要把软件的错误信息以邮件形式发给指定管理员邮箱,过程中遇到了一些小问题可以记录下来以供参考。
首先是代码:
private void SendEmail(Email f)
{
try
{
if (mSmtpIPAddress.Length > 0 && !string.IsNullOrEmpty(f.ToAddress))
{
SmtpClient client = new SmtpClient(mSmtpIPAddress);
client.Port = mSmtpPort;
client.EnableSsl = mSsl;
MailMessage mMessage = new MailMessage(f.FromAddress, f.ToAddress, f.Subject, f.Body);
if (f.CC != null && f.CC.Length > 0)
{
try
{
MailAddress cc = new MailAddress(f.CC);
mMessage.CC.Add(cc);
}
catch { }
}
if (f.BCC != null && f.BCC.Length > 0)
{
try
{
MailAddress bcc = new MailAddress(f.BCC);
mMessage.Bcc.Add(bcc);
}
catch { }
}
if (f.AttachmentPath.Length > 0)
{
Attachment mAttachment = new Attachment(f.AttachmentPath);
mMessage.Attachments.Add(mAttachment);
}
if (mAuthentication)
{
// Add authenication
NetworkCredential cred = new NetworkCredential(mUserName, mPassword);
client.UseDefaultCredentials = false;
client.Credentials = cred;
}
client.Send(mMessage);
}
}
catch (Exception err)
{
LogError("SendEmail", err);
}
}
通过SMTP发送邮件,要通过SmtpClient类,该类的几个重要属性如下:
- Host:get/set Smtp服务器地址,可以通过构造函数指定;
- Port:get/set Smtp服务器通信的端口号,可通过构造函数指定;
- EnableSsl:get/set 与Smtp服务器之间的通信是否需要加密,若false,则与Smtp的所有通信都通过明文进行;
- Credentials: ICredentialsByHost类型,get/set SmtpClient的认证,用于连接Smtp服务器发送邮件时需要的用户名、密码信息;
其中Credentials属性通过NetworkCredential类进行设定,而要发送的邮件通过MailMessage进行封装。
当EnableSsl被设置成为True时,若Smtp服务器不支持加密通信,则会产生“服务器不支持安全连接”的异常
若用户名密码不正确时,则会产生"邮箱不可用。服务器响应为: 5.7.1 Unable to relay"的异常信息。