邮件发送详解

时间:2024-02-25 11:00:27

      电子邮件在Internet上发送和接收其实和我们日常生活中的邮寄服务一样:当我们要寄一个包裹的时候,我们首先要找到一个有这项业务的邮局,在填写完收件人姓名、地址等信息之后,包裹就寄到了收件人所在地的邮局,那么对方取包裹的时候就必须去这个邮局才能取出。同样的,当我们发送电子邮件的时候,这封邮件是由邮件发送服务器(任何一个都可以)发出,并根据收信人的地址判断对方的邮件接收服务器而将这封信发送到该服务器上,收信人要收取邮件也只能访问这个服务器才能够完成。

电子邮件工作原理

      电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。邮件服务器识将消息存放在接收者的电子信箱内,并告知接收者有新邮件到来。接收者通过邮件客户程序连接到服务器后,就会看到服务器的通知,进而打开自己的电子信箱来查收邮件。
     通常Internet上的个人用户不能直接接收电子邮件,而是通过申请ISP(Internet Service Provider的缩写,意为“Internet服务提供商”)主机的一个电子信箱,由ISP主机负责电子邮件的接收。一旦有用户的电子邮件到来,ISP 主机就将邮件移到用户的电子信箱内,并通知用户有新邮件。因此,当发送一条电子邮件给一另一个客户时,电子邮件首先从用户计算机发送到ISP主机,再到 Internet,再到收件人的ISP主机,最后到收件人的个人计算机。
      ISP主机起着“邮局”的作用,管理着众多用户的电子信箱。每个用户的电子信箱实际上就是用户所申请的帐号名。每个用户的电子邮件信箱都要占用 ISP主机一定容量的硬盘空间,由于这一空间是有限的,因此用户要定期查收和阅读电子信箱中的邮件,以便腾出空间来接收新的邮件。

      电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet上的电子邮件。

      最简单的邮件发送流程如图:

      

如果将这个网络分的更细一点,其具体的流程图如下:

                 

当然在我们的实际的应用中,特别是架设比较庞大的邮件系统的时候,涉及的技术更多、更复杂,如果是多台收件服务器、多台发件服务器,就要再附加一台服务器做负载均衡。里面还要涉及防火墙、垃圾过滤一些安全问题。尽管这些不是我们平时能够的用的着的,但是了解这些还是必须的。


ASP.net发送邮件     

      电子邮件是最初的网络通信技术,在信息技术高速发展的今天,电子邮件已经作为一种不可或缺的通信方式深入到了企业的各个层面。最常见的就是我们熟知的bug报告、密码重置通知、申请确认等。特别是我们在从事企业软件开发的时候,常常要用到电子邮件技术。

      而微软的ASP.NET很好的将其进行了封装,使得发送电子邮件十分便捷。在.net框架1.x版本中ystem.Web.Mail已经实现了这一点。但是其通过的是第三方控件实现的,具体的代码会在后面介绍。在后来的2.0版本已经将其很好的封装在System.Net.Mail中,在这里面有最核心的两个类,即MailMessage和SmtpClient。 

      · MailMessage:描述一个电子邮件消息;它拥有From,To,Subject,Body,Attachments等属性;

      · SmtpClient:把一个指定的MailMessage实例发送到一个指定的SMTP服务器。

 

      我们只要将对象的属性赋值,就能顺利发送一封电子邮件了。流程图如下:

                       

     注意:在邮件发送的过程中会产生异常,比较常见的就是SmtpException,所以发送一定要进行try,catch操作,捕捉可能出现的异常。


初始化MailMessage实例:

    /// <summary>
    
/// 邮件初始化
    
/// 为了简单,自己发个自己
    
/// </summary>
    
/// <returns></returns>

    public MailMessage InitMail(string Address)
    
{
        MailMessage mail 
= new MailMessage();
        
//发件人
        mail.From = new MailAddress(Address);
        
//收件人
        mail.To.Add(new MailAddress(Address));
        
//主题
        mail.Subject = "ASP.NET send mail testing!";
        
//内容
        mail.Body = "Welcome to join us,let me instruduce myself!";
        
//邮件主题和正文编码格式
        mail.SubjectEncoding = System.Text.Encoding.UTF8;
        mail.BodyEncoding 
= System.Text.Encoding.UTF8;
        
//邮件正文是Html编码
        mail.IsBodyHtml = true;
        
//优先级
        mail.Priority = MailPriority.High;
        
//密件抄送收件人
        mail.Bcc.Add(Address);
        
//抄送收件人
        mail.CC.Add(Address);

        
//添加附件
        mail.Attachments.Add(new Attachment("d:\\1.txt"));
        mail.Attachments.Add(
new Attachment("d:\\2.txt"));
        mail.Attachments.Add(
new Attachment("d:\\3.txt"));

        
return mail;
    }

发送Gmail邮件。端口号为25、587成功。


    /// <summary>
    
/// 发送Gmail
    
/// </summary>

    public bool SendGmail()
    
{
        SmtpClient client 
= new SmtpClient();
        client.Credentials 
= new System.Net.NetworkCredential("userName""password");
        
//上述写你的GMail邮箱和密码
        client.Port = 587;//Gmail使用的端口
        client.Host = "smtp.gmail.com";
        client.EnableSsl 
= true;//经过ssl加密

        
try
        
{
            client.Send(InitMail(
"userName@gmail.com"));
            
return true;
        }

        
catch (System.Net.Mail.SmtpException ex)
        
{
            
return false;
        }

    }

效果图:


.net框架1.x版本中的发送电子邮件源码


    public bool sendMail(string sender, string receiver, string title, string content)
    
{
        MailMessage mail 
= new MailMessage();
        mail.From 
= sender;
        mail.To 
= receiver;
        mail.Body 
= content;
        mail.Subject 
= title;

        mail.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"1);
        mail.Fields.Add(
"http://schemas.microsoft.com/cdo/configuration/sendusername""username"); //发送方邮件帐户
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword""passw"); //发送方邮件密码


        
try
        
{
            SmtpMail.SmtpServer 
= "smtp." + sender.Substring(sender.IndexOf("@"+ 1);
            SmtpMail.Send(mail);
            
return true;
        }

        
catch
        
{
            
return false;
        }

    }