zoukankan      html  css  js  c++  java
  • (转)邮件发送(附源码)


     原文地址:http://www.cnblogs.com/holyknight-zld/archive/2012/09/05/SendEmail.html

       今天分享一个邮件发送的实例,使用的是Smtp服务,实例中使用到了网易的smtp服务器smtp:163.com QQ的smtp服务器:smtp:qq.com,实现主要用到了微软的System.Net.Mail中提供的SmtpClient类和MailMessage类。

    注意点:

    我们要实现邮件发送,必须首先保证邮箱中的对应的服务是开启状态,下面以QQ邮箱为例,想要使用Smtp服务必须保证Smtp服务是开启的,看到QQ邮箱的服务设置,勾选上对应的服务即可,QQ默认是勾选上的,但也有些邮箱默认是不开启服务的。


    页面端:

    首先贴上页面图,设计页面,设置默认端口号为25,Smtp服务统一的端口号:


    代码端:

    首先是初始化代码:

    初始化
    复制代码
    1 //保存名称
    2 private string fileName = "";
    3 //文件操作
    4 FileStream fs = null;
    5
    6 //设置Smtp协议
    7 SmtpClient smtpClient = null;
    8 //设置发信人地址 需要密码
    9 MailAddress AddressFrom = null;
    10 //设置收信人地址 不需要密码
    11 MailAddress AddressTo = null;
    12 //邮件信息
    13 MailMessage Message = null;
    复制代码

    页面载入代码,即Form_Load:

    Form_Load
    复制代码
    1 //页面载入
    2 private void Form1_Load(object sender, EventArgs e)
    3 {
    4 //初始化下拉框
    5 cmbHZ.SelectedIndex = 0;
    6 cmbReceiveHZ.SelectedIndex = 0;
    7 cmbSendHZ.SelectedIndex = 0;
    8 cmbSmtp.SelectedIndex = 0;
    9 }
    复制代码

    页面载入时,主要是做一些初始化的工作,设定页面的下拉框为首项选中。

    接下来是最重要的代码,邮件发送,即【发送】按钮代码:

    发送邮件
    复制代码
    1 //发送邮件
    2 private void btnSend_Click(object sender, EventArgs e)
    3 {
    4 if (MessageBox.Show("您确定要发送当前邮件吗?", "发送提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)==DialogResult.Yes)
    5 {
    6 try
    7 {
    8 //设置Smtp服务器信息
    9 SetSmtpClient("smtp." + cmbSmtp.Text + cmbHZ.Text, Convert.ToInt32(nudPort.Value));
    10
    11 }
    12 catch (Exception err)
    13 {
    14 MessageBox.Show("邮件发送失败,请确定Smtp服务器名是否正确!"+"\n"+"技术信息:"+err.Message);
    15 return;
    16 }
    17 try
    18 {
    19 if (tbPwd.Text == "")
    20 {
    21 MessageBox.Show("对不起,需要密码验证,请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    22 tbPwd.Focus();
    23 return;
    24 }
    25
    26 //设置发送地址信息
    27 SetAddressFrom(tbSendEmail.Text.Trim() + cmbSendHZ.Text, tbPwd.Text);
    28 }
    29 catch (Exception)
    30 {
    31 MessageBox.Show("邮件发送失败,请确认发送邮箱地址和密码的正确性!");
    32 return;
    33 }
    34
    35 //message信息
    36 Message = new MailMessage();
    37
    38 //发信人地址
    39 Message.From = AddressFrom;
    40 //收信人地址
    41 AddressTo = new MailAddress(tbReceiveEmail.Text.Trim() + cmbReceiveHZ.Text);
    42 //添加收信人地址
    43 Message.To.Add(AddressTo);
    44
    45 //信息的主题
    46 Message.Subject = tbTitle.Text;
    47 //主题的编码方式
    48 Message.SubjectEncoding = System.Text.Encoding.UTF8;
    49
    50 //邮件正文
    51 Message.Body = tbContent.Text;
    52 //邮件正文的编码
    53 Message.BodyEncoding = System.Text.Encoding.UTF8;
    54
    55 //清除附件信息
    56 Message.Attachments.Clear();
    57 //添加附件
    58 if (tbAttachment.Text != "")
    59 {
    60 Message.Attachments.Add(new Attachment(tbAttachment.Text.Trim()));
    61 }
    62 //发送
    63 smtpClient.SendAsync(Message, "000000");
    64 //发送完成回调函数
    65 smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);
    66
    67 }
    68 }
    复制代码

    其中在该事件中还涉及到了SetSmtpClient()方法和SetAddressFrom()方法,在后面会讲解到。该事件主要实现了邮件的发送功能,但在邮件发送前需要对邮件的一些信息做一些配置,大致配置过程为:配置SmtpClient实例信息(服务器名,端口,超时等)-->>发件人信息验证(服务器验证,发件人地址,密码),使用Smtp服务时需要验证密码-->>配置MailMessage实例的信息(发件人地址,收件人地址,主题,正文,附件信息),同时指定编码方式-->>邮件发送回调函数(邮件发送成功事件),这就是这个事件代码执行的大致流程,同时在该事件中加入了一些逻辑判断,首先Smtp服务必须要有密码验证,所以必须使用户输入密码,然后是添加附件部分,我这里指定了附件的格式,即只允许将一定格式的文件作为附件,所以要对文件的格式做个判断,其次就是附件的大小,附件过大影响传送速度,所以限制了文件的大小在10M以内。

    下面贴上发送邮件中使用到的方法代码,SetSmtpClient():

    SetSmtpClient
    复制代码
    1 //设置Smtp服务器信息
    2 private void SetSmtpClient(string serverHost, int Port)
    3 {
    4 smtpClient = new SmtpClient();
    5 //指定Smtp服务名
    6 //QQ:smtp.qq.com
    7 //sina:smtp.sina.cn
    8 smtpClient.Host = serverHost;
    9 smtpClient.Port = Port;
    10 smtpClient.Timeout = 0;
    11 }
    复制代码

    该方法主要实现对SmtpClient实例配置,指定其Host(服务器信息),Port(端口号),Timeout(超时)。

    接着贴上SetAddressFrom()方法代码:

    SetAddressFrom
    复制代码
    1 //验证发件人信息
    2 private void SetAddressFrom(string mailAddress, string mailPwd)
    3 {
    4 //创建服务器验证
    5 NetworkCredential networkCreadential_My = new NetworkCredential(mailAddress,mailPwd);
    6 //实例化发件人地址
    7 AddressFrom = new MailAddress(mailAddress,tbShowName.Text);
    8 //指定发件人信息 邮箱地址和密码
    9 smtpClient.Credentials = new NetworkCredential(AddressFrom.Address, mailPwd);
    10
    11 }

    复制代码
    NetworkCredential 类是为基于密码的身份验证方案(如基本、简要、NTLM 和 Kerberos)提供凭据的基类.通过该类进行服务器验证,然后指定发件人的地址及密码,因为Smtp需要密码验证。

    由于邮件实现了附件的发送,接下来是附件部分的代码,首先是选择附件即【...】按钮代码:

    选择附件
    复制代码
    1 //选择附件
    2 private void btn_SelectAttach_Click(object sender, EventArgs e)
    3 {
    4 //打开文件对话框
    5 OpenFileDialog open = new OpenFileDialog();
    6 if (open.ShowDialog() == DialogResult.OK)
    7 {
    8 //保存选择的文件名
    9 fileName = open.SafeFileName;
    10 tbAttachment.Text = open.SafeFileName;
    11
    12 }
    13 }
    复制代码

    该事件中主要用到了一个打开文件对话框,从而选择要附加的文件。

    因为当选中了文件之后,需要显示些信息,必须文件大小啊,文件格式啊,是否添加成功啊...所以我添加了一个文本框内容变化事件(EditValueChanged),对这个方法可能你会陌生,其实只是由于用到了DXperience组件而已,所以对应的方法名也会有所改变了,先贴上该方法的代码:

    EditValueChanged
    复制代码
    1 //文本框变化事件
    2 private void tbAttachment_EditValueChanged(object sender, EventArgs e)
    3 {
    4 //判断时候可以上传
    5 if (CanAddAttachment(tbAttachment.Text))
    6 {
    7 //判断大小是否允许
    8 if (CanAddSize(tbAttachment.Text))
    9 {
    10 lblState.Visible = true;
    11 lblState.Text = "添加成功!";
    12 }
    13 else
    14 {
    15 MessageBox.Show("上传的文件过大!");
    16 btnSend.Enabled = false;
    17 return;
    18 }
    19 }
    20 else
    21 {
    22 MessageBox.Show("不支持该格式的附件!");
    23 btnSend.Enabled = false;
    24 return;
    25 }
    26 }
    复制代码

    可以发现,该方法中又有两个方法CanAddAttachment()方法和CanAddSize()方法,看方法名就知道一个用来判断是否可以添加该附件,一个是用来判断是否为允许大小。主要是这两个方法的调用,其他就是写逻辑判断,然后是打印出对应信息,比如邮件过大即弹出框提醒,添加成功即设置反馈信息为"添加成功"。

    贴上这两个方法的代码,CanAddAttachment()方法:

    CanAddAttachment
    1 //判断附件类型是否合法
    2 private bool CanAddAttachment(string path)
    3 {
    4 //实例化文件操作对象
    5 fs = new FileStream(path, FileMode.Open);
    6 //设置允许添加的附件类型
    7 string[] allowExtensions = new string[] { ".jpg", ".jpeg", ".doc", ".docx", ".txt", ".excel",".rar",".zip"};
    8 //获取文件的后缀
    9 string name = System.IO.Path.GetExtension(fs.Name);
    10 for (int i = 0; i < allowExtensions.Length; i++)
    11 {
    12 if (name == allowExtensions[i])
    13 {
    14 return true;
    15 }
    16 }
    17 fs.Flush();
    18 fs.Close();
    19 return false;
    20 }

    接着是CanAddSize()方法:

    CanAddSize
    1 //获取文件大小
    2 private bool CanAddSize(string path)
    3 {
    4 double size = Convert.ToDouble(fs.Length) / 1024.0 / 1024.0;
    5 //设置最大为10M
    6 if (size > 10)
    7 {
    8 return false;
    9 }
    10 fs.Flush();
    11 fs.Close();
    12 return true;
    13 }

    最后是邮件发送之后的回调函数,代码:

    回调函数
    1 //回调函数
    2 private void SendBack(object sender, AsyncCompletedEventArgs e)
    3 {
    4 MessageBox.Show("您的邮件已成功发送!","恭喜",MessageBoxButtons.OK,MessageBoxIcon.Information);
    5 }

    回调函数我写的很简单,就是弹出一个提示框,告知用户邮件发送成功。调用回调函数是在邮件发送代码中,即:

    smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);

    至此,该实例的界面,代码都讲解完了.......接下来看看运行效果吧......

    首先运行(无附件)----填写信息:这里设置发送端为网易163邮箱,接收端为QQ邮箱

    点击【发送】,没有问题,QQ邮箱提示有新邮件信息:

    然后再看看带附件的邮箱发送效果,同样运行,然后点击【...】按钮选择附件信息,如图:

    此时如果添加附件成功则有提示信息“添加成功”,说明此时的邮件已经带有了附件信息,然后同样点击【发送】按钮,这时QQ邮箱同样提示有新邮件信息,只不过这次的邮件是带附件邮件,如图:

    那么点击邮件进去看看附件信息,如图:

    没问题,就是我们刚才添加的"知识点笔记.doc"附件。


    至此,这个邮件发送的实例讲解就到这为止了,欢迎大家扩展交流,,可以将其扩展成可以实现群发效果.........

    附上实例源码地址: /Files/holyknight-zld/SendEmail/发送邮件.rar 

  • 相关阅读:
    Linux各个目录的作用及内容
    发现未授权登录用户怎么办
    开启GodMode
    通过域名方式决定使用哪个数据库的方式分享
    openerp-server.conf 中配置 dbfilter 参数无效的解决办法
    OpenERP7.0 忘记admin管理员密码解决办法
    DEB方式在UBUNTU安装ODOO 8.0
    解决apt-get的E: Could not get lock /var/lib/dpkg/lock方法
    Ubuntu 11.04 (Natty) 已经停止支持 但可以使用old-releases源了
    How to get the url of a page in OpenERP?
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2673650.html
Copyright © 2011-2022 走看看