近来需要开发一个小系统,其中就用到了将系统自动生成的密码发送到客户邮件地址中的问题,以前一直是使用asp+jmail4.4来进行操作的,这次的系统是在windows 2003+asp.net+sql server 2005上进行的,因此就想到了使用jmail.net来进行发送。
在下载了jmail.net 1.1后,简单的查看了一下例程,就开始动手了,虽然很简单,但还是把过程记录下来,请供大家分享指正。
将Dimac.JMail.dll和Dimac.JMail.Smtp.dll文件入到bin目录,运行软件自带的smtp.aspx页面,先给自己发送一封邮件,发送成功,在此期间遇到的问题有这么几个:
一、“An exception occured: 530 Authentication required”,这说明SMTP服务器需要验证,“Authentication:”就需要选择一种验证方式;
二、“An exception occured: PLAIN is not supported”,验证方式选择为“PLAIN”后,报这个错,这种是因为SMTP服务器不支持PLAIN验证方式引起的,在网上查了一些资料,得知plain验证方式为明文发送验证,login验证方式为BASE64加密文件验证,看来是这个SMTP服务器的安全设置较高,选择使用“login”后就可以了,另:选用了“any”也可以成功,现在还不明白any是不是循环各种验证方式?
附SMTP验证方式资料:http://hi.baidu.com/%B6%AC%D2%E2%BE%D3/blog/item/a06518fbf646802e4f4aea99.html
三、“An exception occured: 554 Sender address not allowed for this authenticated session”,因为我在“from”中随手输入的一个地址没有在验证列表中,看来也是服务器的安全限制,必须输入一个合法存在的邮件地址,而且必须与验证用的用户名和密码一致,防止假冒邮件。这个应该是与SMTP服务器有关,与jmail.net本身没有太大关系。
发送成功后,我准备将它改动一下,方便我在其他页面调用,现将代码分享给大家:
在app_code中新建一个类,取名为SendMail.vb
Imports Microsoft.VisualBasic Imports System Imports Dimac.JMail Public Class SendMail Function SendMail(ByVal SendName As String, ByVal ToEmail As String, ByVal ToName As String, ByVal MailSubject As String, ByVal MailBody As String, ByVal MailHtml As Boolean) As Boolean Dim message As New Dimac.JMail.Message() '发送地址,我这里使用的是一个固定的地址 message.From.Email = "it@mycompany.com" message.From.FullName = SendName '收件人 message.To.Add(ToEmail, ToName) '主题 message.Subject = MailSubject '字符集,现直接指定为gb2312 message.Charset = System.Text.Encoding.GetEncoding("GB2312") '选择是以html格式还是文本格式发送 If MailHtml Then message.BodyHtml = MailBody Else message.BodyText = MailBody End If Try 'SMTP服务器的验证方式 Dim selected = [Enum].Parse(GetType(SmtpAuthentication), "Login") '使用的是一次发送的方式,也可以将各项分别赋值后发送 '各参数分别是邮件内容、SMTP服务器地址、SMTP服务端口、主机名(@后面的内容)、验证方式,验证用户名、验证密码 Smtp.Send(message, "192.168.1.30", 25, "mycompany.com", selected, "it", "it123") Return True Catch ex As Exception 'Response.Write(ex.Message) Return False End Try End Function End Class
SendMail函数各参数的内容分别是:发件人名称、收件人地址、收件人名称、邮件主题、邮件内容、是否使用HTML格式
新建一个测试页面,调用如下:
test.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test.aspx.vb" Inherits="test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> 发件人名称:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br /> 收件人地址:<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox><br /> 收件人姓名:<asp:TextBox ID="TextBox4" runat="server"></asp:TextBox><br /> 邮件主题:<asp:TextBox ID="TextBox5" runat="server"></asp:TextBox><br /> 邮件内容:<asp:TextBox ID="TextBox1" runat="server" Height="173px" TextMode="MultiLine" Width="488px"></asp:TextBox><br /> HTML格式:<asp:CheckBox ID="chk_html" runat="server" /><br /> <asp:Button ID="Button1" runat="server" Text="发送" /> </div> </form> </body> </html>
test.aspx.vb
Imports System Imports SendMail Partial Class test Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sendmail1 As New SendMail sendmail1.SendMail(TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text, TextBox1.Text, chk_html.Checked) End Sub End Class
测试成功,但要注意的是,在测试页中如果选择了使用HTML格式,而且又有HTML代码的话,IIS会报错,说有不安全的字符,这种可以在实际使用中来进行控制或使用POST方式来进行。