ASP 使用 CDOSYS 发送电子邮件
ASP 使用 CDOSYS 发送电子邮件(中文讲解)
在经典Active Server Pages(ASP)中,CDOSYS(Collaboration Data Objects for Windows Server)是一个内置的微软组件,用于通过SMTP服务器发送电子邮件。它取代了旧的CDONTS组件,支持更高级的功能,如附件、HTML格式和SMTP认证。CDOSYS适用于Windows服务器环境(如IIS),无需额外安装。以下是对ASP中使用CDOSYS发送电子邮件的详细讲解,包括原理、配置和代码示例。
1. CDOSYS 概述
- 作用:CDOSYS允许ASP应用程序创建并发送电子邮件,支持文本、HTML内容、附件和SMTP认证。
- 优势:
- 内置于Windows 2000及以上版本,无需第三方库。
- 支持远程SMTP服务器(如Gmail、Outlook),适合Web应用中的邮件通知(如注册确认、密码重置)。
- 局限性:
- 依赖服务器SMTP配置;本地测试可能需配置IIS SMTP服务。
- 不支持异步发送(发送过程会阻塞页面执行)。
- 前提条件:
- 服务器安装了IIS和CDO组件(默认存在)。
- 获取SMTP服务器信息:如Gmail的
smtp.gmail.com
,端口587,需要用户名/密码认证。
2. 基本发送流程
使用CDOSYS发送邮件的步骤:
- 创建
CDO.Message
对象。 - 配置邮件属性:发件人、收件人、主题、正文。
- 配置SMTP服务器(通过
CDO.Configuration
对象)。 - 调用
Send
方法发送邮件。 - 释放对象(
Set obj = Nothing
)。
3. 简单示例:发送纯文本邮件
以下是一个基本示例,发送一封纯文本邮件(无需认证,适用于本地SMTP):
<%
' 创建邮件对象
Set myMail = Server.CreateObject("CDO.Message")
' 设置邮件基本属性
myMail.Subject = "测试邮件 - 来自ASP"
myMail.From = "sender@example.com" ' 发件人邮箱
myMail.To = "receiver@example.com" ' 收件人邮箱
myMail.TextBody = "这是一封通过ASP和CDOSYS发送的测试邮件。内容可以包含中文。"
' 发送邮件
myMail.Send
' 释放对象
Set myMail = Nothing
Response.Write("邮件发送成功!")
%>
- 解释:
Server.CreateObject("CDO.Message")
:创建邮件消息对象。TextBody
:纯文本正文;若需HTML,使用HTMLBody
。- 如果SMTP无需认证,此代码即可运行;否则需配置(见下文)。
4. 高级示例:带SMTP认证的HTML邮件
对于远程SMTP(如Gmail),需配置认证。以下示例使用Gmail SMTP(端口587,需启用“应用专用密码”):
<%
' 创建邮件对象
Set myMail = Server.CreateObject("CDO.Message")
' 创建配置对象
Set myConfig = Server.CreateObject("CDO.Configuration")
Set fields = myConfig.Fields
' SMTP配置(Gmail示例)
fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 ' 使用SMTP
fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True ' 启用SSL
fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 ' 基本认证
fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "yourgmail@gmail.com" ' SMTP用户名
fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "yourpassword" ' SMTP密码
' 更新配置
fields.Update
' 应用配置到邮件
Set myMail.Configuration = myConfig
' 设置邮件属性
myMail.Subject = "HTML测试邮件"
myMail.From = "yourgmail@gmail.com"
myMail.To = "receiver@example.com"
myMail.HTMLBody = "<h1>测试邮件</h1><p>这是一封<strong>HTML格式</strong>的邮件,支持中文。</p>"
' 发送邮件
myMail.Send
' 释放对象
Set myMail = Nothing
Set myConfig = Nothing
Response.Write("带认证的HTML邮件发送成功!")
%>
- 关键配置解释:
sendusing = 2
:指定使用网络SMTP。smtpserver
和smtpserverport
:SMTP服务器地址和端口。smtpusessl = True
:启用SSL/TLS加密(Gmail必需)。smtpauthenticate = 1
:启用用户名/密码认证。sendusername
和sendpassword
:SMTP账号凭证(注意:密码应加密存储,避免硬编码)。- Gmail特定提示:在Google账户设置中启用“两步验证”和“应用专用密码”,使用专用密码作为
sendpassword
。
5. 添加附件示例
在上述代码基础上添加附件:
<%
' ...(前面的配置代码相同)
' 添加附件
myMail.AddAttachment Server.MapPath("attachment.pdf") ' 服务器路径的附件文件
' ...(发送代码相同)
%>
AddAttachment
:添加本地文件路径的附件,支持多个调用添加多个附件。
6. 错误处理
发送邮件可能失败(如SMTP不可达),需添加错误捕获:
<%
On Error Resume Next
myMail.Send
If Err.Number <> 0 Then
Response.Write("发送失败:" & Err.Description)
Else
Response.Write("发送成功!")
End If
On Error GoTo 0
%>
- 使用
On Error Resume Next
捕获错误,并检查Err.Number
。
7. 注意事项
- 服务器配置:
- 本地测试:IIS需启用SMTP虚拟服务器(控制面板 > 程序和功能 > 启用Windows功能 > IIS > SMTP服务器)。
- 远程SMTP:确保防火墙允许端口(如587),并测试连通性。
- 安全性:
- 避免在代码中硬编码密码;使用
Application
变量或配置文件存储。 - 启用SSL以加密传输;Gmail等服务要求此项。
- 防范邮件注入:验证用户输入(如
To
字段),使用Server.HTMLEncode
过滤。
- 性能与限制:
- 发送过程同步,可能导致页面延迟;大附件或批量发送需优化。
- 邮件大小限制:视SMTP服务器,通常25MB以内。
- 中文支持:设置
Session.CodePage = 65001
(UTF-8)避免乱码。
- 调试:
- 检查IIS日志或事件查看器中的SMTP错误。
- 测试工具:使用Outlook或Thunderbird验证收件箱。
- 替代方案:
- 若CDOSYS不可用,可考虑第三方服务如SendGrid API(需HTTP请求)。
- 在现代ASP.NET中,推荐使用
System.Net.Mail
。
8. 总结
ASP中使用CDOSYS发送电子邮件简单高效,通过CDO.Message
和CDO.Configuration
对象即可实现基本到高级功能。入门时从简单文本邮件开始,逐步添加认证和附件。实际开发中,优先配置安全的SMTP(如Gmail),并添加错误处理以提升鲁棒性。更多细节可参考微软官方CDO文档或测试示例代码。