laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 193, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

去网上搜c#邮件发送程序时,基本找到的都是零散的函数,没做封装,有的连异常处理都没有;能用的调用起来也不太灵活方便,所以,特地做了个封装。代码中如果有错误,欢迎指正。
以下是程序:

using System;
using System.Web.Mail;
using System.Collections;

namespace Asai.Mail
{
    
    
/// <summary>
    
/// C#邮件发送类 V1.0
    
/// --Author:laifangsong QQ:25313644
    
/// --最后修改:2007-07-27
    
/// 
    
/// 支持批量(发送、抄送、密送)
    
/// 支持多语言、带多个附件
    
/// 支持smtp发送邮件服务器验证
    
/// </summary>

    public class DotNetSendMail
    
{
        
public DotNetSendMail()
        
{}
        
        
/// <summary>
        
/// 邮件发送结果。如果发送过程出现错误,该值为捕获到的异常提示;否则,该值为“OK”。
        
/// </summary>

        public string SendMailResult
        
{
            
get
            
{
                
return this.m_SendMailResult;
            }

            
set
            
{
                
this.m_SendMailResult = value;
            }

        }

        
private string m_SendMailResult;


        
邮件发送时,额外的功能属性设置


        
/// <summary>
        
/// 发送邮件方法,方法中几个参数是发邮件时所必须的
        
/// </summary>
        
/// <param name="p_From">发件人</param>
        
/// <param name="p_To">邮件人,多个收件人逗号隔开</param>
        
/// <param name="p_Subject">邮件标题</param>
        
/// <param name="p_Body">正文</param>
        
/// <param name="p_SmtpServer">发送邮件服务器</param>
        
/// <param name="p_SmtpUsername">发件服务器登录名</param>
        
/// <param name="p_SmtpPassword">发件服务器登录密码</param>
        
/// <returns></returns>

        public bool SendMail(string p_From, string p_To, string p_Subject, string p_Body, string p_SmtpServer, string p_SmtpUsername, string p_SmtpPassword)
        
{
            
try
            
{
                System.Web.Mail.MailMessage mail 
= new System.Web.Mail.MailMessage();
                                
                mail.From 
= p_From;
                mail.To 
= p_To;
                mail.Subject 
= p_Subject;    
                mail.Body 
= p_Body;
                SmtpMail.SmtpServer 
= p_SmtpServer;
                
//邮件服务器验证,需要输入您在邮件发送服务器上注册的邮箱用户名和密码
                if(p_SmtpUsername!="")
                
{
                    mail.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate""1");
                    mail.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/sendusername", p_SmtpUsername);
                    mail.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/sendpassword", p_SmtpPassword);
                }

                
                
//以上是发邮件时所必需的,下面是额外的一些功能设置
                
                
if(this.m_Cc!="")
                
{
                    mail.Cc 
= this.m_Cc;
                }

                
if(this.m_Bcc!="")
                
{
                    mail.Bcc 
= this.m_Bcc;
                }

                
switch(this.m_BodyFormat)
                
{
                    
case 1:
                        mail.BodyFormat 
= MailFormat.Html;
                        
break;
                    
case 2:
                        mail.BodyFormat 
= MailFormat.Text;
                        
break;
                    
default:
                        
break;
                }

                
switch(this.m_MailPriority)
                
{
                    
case 1:
                        mail.Priority 
= System.Web.Mail.MailPriority.Low;
                        
break;
                    
case 2:
                        mail.Priority 
= System.Web.Mail.MailPriority.Normal;
                        
break;
                    
case 3:
                        mail.Priority 
= System.Web.Mail.MailPriority.High;
                        
break;
                    
default:
                        
break;
                }

                
if(this.m_AttachFiles.Count>0)
                
{
                    
foreach(string file in m_AttachFiles)
                    
{
                        
if(file.Trim()!="")
                        
{
                            mail.Attachments.Add(
new MailAttachment(file.Trim()));
                        }

                    }

                }


                SmtpMail.Send(mail);
                
this.m_SendMailResult = "OK";
                
return true;
            }

            
catch(Exception ex)
            
{
                
this.m_SendMailResult = ex.ToString();
                
return false;
            }
            
        
        }


    }

}


调用:


DotNetSendMail sendMail 
= new DotNetSendMail();
//sendMail.Cc = "laifangsong##gmail.com";
//sendMail.Bcc = "laifangsong##gmail.com";
//sendMail.BodyFormat = 2;
//sendMail.MailPriority = 3;
//sendMail.AttachFiles.Add(Server.MapPath("attachFile.txt"));
bool sendResultFlag = sendMail.SendMail("laifangsong##126.com","laifs##163.com","标题","内容","smtp.126.com","laifangsong##126.com","123456");
if(sendResultFlag)
{
    Response.Write(
"发送成功!");
}

else
{
    Response.Write(
"发送失败!<br/>");
    Response.Write(
"以下是错误信息:<br/><br/>");
    Response.Write(sendMail.SendMailResult);
    Response.End();
}

组件及源码下载:/Files/jiny-z/csharp_mail.rar

Feedback

#1楼    回复  引用    

2007-07-28 15:39 by superstar [未注册用户]
怎么用不成功的

System.Web.HttpException: 邮件无法发送到 SMTP 服务器。传输错误代码为 0x80040217。服务器响应为 not available ---> System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.Runtime.InteropServices.COMException (0x80040211): 邮件无法发送到 SMTP 服务器。传输错误代码为 0x80040217。服务器响应为 not available --- 内部异常堆栈跟踪的结尾 --- 在 System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) 在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 在 System.Web.Mail.SmtpMail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args) --- 内部异常堆栈跟踪的结尾 --- 在 System.Web.Mail.SmtpMail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args) 在 System.Web.Mail.SmtpMail.CdoSysHelper.Send(MailMessage message) 在 System.Web.Mail.SmtpMail.Send(MailMessage message) 在 Asai.Mail.WebForm1.Button1_Click(Object sender, EventArgs e) 位置 e:\ghy\dotnet\c#2.0\示例\csharp_mail\asai.mail邮件发送\源代码\test.aspx.cs:行号 87


#2楼 [楼主]   回复  引用  查看    

2007-07-29 07:35 by laifangsong      
@superstar
可能是你的smtp服务器设置有问题,例:163的smtp是 smtp.163.com
另外,调用例子中的邮箱地址和登录密码,要改成你自己的。

#3楼    回复  引用    

2007-07-31 12:26 by ddy [未注册用户]
楼主是否知道如何发送一个url,打开邮件后直接链接此url指向的网页,找了几天了,不知道如何解决了。如果知道的话,请邮件联系我啊,谢谢ddgcq#163.com

#4楼 [楼主]   回复  引用  查看    

2007-07-31 16:25 by laifangsong      
@ddy
你说的我也不懂怎么实现,估计不行。就算你发过去的标题是链接,邮件服务器也会做处理的,因为他一般要保证点着该链接可以到邮件正文。

#5楼    回复  引用    

2007-08-13 01:10 by 38745434 [未注册用户]
mail.BodyFormat = MailFormat.Html;
mail.Priority = MailPriority.High;
mail.Body = "<a href=http://www.***.com/>hgf</a>

#6楼    回复  引用  查看    

2008-07-15 21:14 by 52Qin      
有时候能发,有时候失败,是我网速慢?

#7楼 [楼主]   回复  引用  查看    

2008-07-20 18:47 by laifangsong      
@52Qin
可能是邮件服务器不稳定或者邮件被当成垃圾邮件过滤、拒绝转发了
例子中用的是126的服务器,smtp.126.com,每次都能发出


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-08-07 08:52 编辑过


相关链接: