`
zhouxing
  • 浏览: 207621 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA邮件群发

阅读更多

  :邮件群发是消息在Internet传递的最好办法,同时也是垃圾邮件的来源。本文以使用JAVAMAIL为例,讨论实现大规模邮件发送的方法和技巧。

关键字SMTPMIMEJAVAMAIL、群发邮件

一、引言

邮件群发是Internet生活中最常见的一种信息传递方式,其传递信息的主动性、高效率和低费用而被众多商家广泛采用。我们的电子邮箱随之充满了各种类型的商业邮件,一般称这些商业邮件为垃圾邮件。本文笔者运用JAVA语言开发了一个基于SMTP服务器的邮件群发软件,在以下内容中将逐一介绍SMTP协议,JAVAMAIL包,以及邮件群发程序的片段等。

二、简单邮件传输协议与JAVAMAIL类库

1.简单邮件传输协议(SMTP)从1982年起被用来在不同计算机系统间传递电子邮件。SMTP使用简单的ASCII码文本命令,命令定义长度为4个字符。SMTP基本命令集及功能如表一所示。

命令

功能

HELO

从客户端打开问候信息

MAIL

标识发件人

RCPT

标识收件人

DATA

标识邮件开始

SEND

向终端发送邮件

SOML

执行SENDMAIL命令

SAML

执行SENDMAIL命令

RSET

重置SMTP连接

VRFY

验证系统用户名

EXPN

查询列表和别名

HELP

查询命令列表

NOOP

不操作

QUIT

终止SMTP连接

TURN

变换SMTP角色

表一

绝大多数SMTP系统采用一种标准的邮件报文格式,即RFC822来“规范”邮件的形式。RFC822明确的划分邮件为两个部分,一部分称为邮件头,起其作用是标识邮件;第二部分是邮件体。

邮件头中包括:

1Received:用来标识将邮件从最初发送者到目的地进行中间转发的SMTP服务器,其中含有发信人及发信服务器真实的信息。

2Return-path:用来标识邮件发送到目的服务器所经过的路径。

3From:显示发信人的地址。格式为Fromuser-name

4Date:记录邮件发送时间。

5Destination:记录收邮件地址, 标识电子邮件的接受方地址,这些地址是纯粹地信息,SMTP仅通过RCPT命令发送信件。包括To主收件人,Cc抄送收件人,Bcc暗抄送收件人,格式为To/Cc/Bccaddress

6Resent:表示一封邮件处于某中原因需要从客户端再次发送。

2JAVAMAIL关于邮件操作最新包是JavaMail1.2,有四个大类,如表二所示。

javax.mail

邮件系统模型类

javax.mail.event

Javamail API监听和事件处理类

javax.mail.internet

Internet邮件系统类

javax.mail.search

JavaMail API邮件搜索类

表二

这些类操作分别属于mailapi.jar(文件包含核心API类),smtp.jar(实现SMTP协议功能),pop3.jar(实现POP3协议功能),imap.jar(包含IMAP协议功能)等四个文件。同时这四个文件都被包含在mail.jar中,如过图省事的话,直接包含mail.jar即可。

如果要实现带附件的邮件收发功能,还需要包含activation.jar,它提供通过二进制数据流的形式处理MIME类型的访问。

三、程序举例

1.首先是连接SMTP服务器,JAVAMAIL1.2不能实现SMTP服务的功能,但可以连接已有的SMTP服务器。

//创建一个属性对象

      Properties props=System.getProperties();  //创建系统属性对象

       props.setProperty("mail.transport.protocol","smtp");    //设置使用smtp协议

       props.setProperty("mail.smtp.host",server);  //设置SMTP服务器地址

       props.setProperty("mail.smtp.port",""+port); //设置SMTP端口号

       props.setProperty("mail.smtp.auth","true");   //SMTP服务用户认证

       //创建一个过程对象

javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props, null);

2.创建一封新邮件,一般定义该MimeMessage创建一个邮件对象。

MimeMessage msg=new MimeMessage(sess);       //创建邮件对象

msg.setSubject(“邮件群发”)               //设置邮件主题

msg.setSentDate(new Date());                 //设置发信日期

msg.setFrom(Address address)               //设置发信人

邮件地址只要符合带有“@”符号并且使用“.”分成三段的字符串都会被SMTP服务器接受,发送广告邮件的商家一般都会在这里修改发信人地址,所以我们的收件箱中看见的广告邮件显示中发信人内容一些的根本不存在邮件地址。如果想查看真正地发信人,应该查看邮件头中Received的内容。

//设置主收件人

msg.setRecipients(Message.RecipientType.TO,Address toaddress);

//设置抄送收件人

msg.addRecipients(Message.RecipientType.CC,Address coaddress);

//设置暗抄送人

msg.addRecipients(Message.RecipientType.BCC,Address bcoaddress);

SMTP允许一封邮件有多个接受者,我们可以利用这个特点,在这三个收件人中填写多个收件人地址来提高大规模发邮件效率。另外Bcc这个字段可以隐藏收件人的地址,你有时可能发现邮件的收件人不是自己却收到了这封邮件,就是利用了暗抄这个属性。

3.邮件体一般分为邮件正文本部分和附件部分。正文部分需要设置文本的格式,包括text文本类型,messafe报文类型,image图象类型,video视频类型,audio声音类型,application应用程序类型,multipart混合类型等。如下例,

     String m_body;                          //为需要添加文本内容

    MimeMultipart content=new MimeMultipart();   //创建邮件体对象

    if(content==null) return false;

    MimeBodyPart part=new MimeBodyPart();        //创建文本部分对象

    String type="text/plain";                    //文本类型默认为text/plain

    if(m_body.startsWith("<html>") || m_body.startsWith("<HTML>"))

       type="text/html";             //如果是网页形式的内容,则改变类型为text/html

    part.setText(m_body);

    part.setHeader("Content-Type",type);

    content.addBodyPart(part);

    msg.setContent(content);                     //添加文本至邮件中

msg.saveChanges();                      //保存修改

4.如何向的邮件中添加附件,利用多用途互联网邮件扩展(MIME)协议可以直接二进制数据添加到标准的RFC822邮件中。在JAVAMAIL中实现方法如下,

    String filename;                 //用于存储文件名称与存放路径

    if(filename!=null || filename.length()>0){

       MimeBodyPart part=new MimeBodyPart();//创建MIME对象

       DataSource fds = new FileDataSource(filename); //创建文件流对象

       part.setDataHandler(new DataHandler(fds));

   part.setFileName(MimeUtility.encodeText(fds.getName()));

       content.addBodyPart(part);        //添加二进制编码至邮件体中

       }

   msg.setContent(content);                  //添加文本至邮件中

msg.saveChanges();                        //保存修改

5.邮件的基本内容设置完毕,发送SMTP电子邮件。

   Transport trans=sess.getTransport();      //创建发送对象

   trans.send (msg);                         //发送

    6.如何群发邮件,首先我们要有一个邮件地址列表,邮件地址列表可以向从公共网站获得,也可以根据某单位名称按字典法生成,或者购买用户表。邮件地址列表应该按行存放每个邮件地址。

发信的速度和SMTP的响应速度有密切的关系,所以因该充分利用一封邮件可以有多个接受地址的条件,将邮件地址按组读入进行发送,才能提高邮件群发地效率。下面的例子是每一封信发给10个邮件地址。

import java.io.*;

import java.net.*;

import java.util.*;

import javax.mail.*;

import javax.activation.*;

import javax.mail.internet.*;

class massmail(){

try{

    FileReader fis = new FileReader(“邮件列表文件”);

    BufferedReader dis = new BufferedReader(fis);

    int i=0;

while((fileline = dis.readLine())!=null){

  if((i%10)==0)

    MimeMessage msg=new MimeMessage(sess);

……

  if((i%10)!=0){                //多个邮件地址之间要加“,”

         maillist = maillist + “,” + fileline;

       }else{

         maillist = fileline;

       }

       i++;

      if((i%10)==0){     //一封邮件在暗抄地址处加10个收件人

msg.addRecipients(Message.RecipientType.BCC, maillist);

    ……                        //设置邮件内容

    Transport trans=sess.getTransport();    //创建发送对象

  trans.send (msg);        //发送

}

}

fis.close();

}catch(Exception error){

System.out.println("Exception:" + error);

}

分享到:
评论
1 楼 volking 2008-09-11  
能群发吗?

相关推荐

    java邮件群发代码

    【Java邮件群发代码详解】 在Java编程中,发送电子邮件是一项常见的任务,尤其对于自动化通知、批量消息传递等场景。本篇将详细介绍一个简单的Java邮件群发代码,帮助理解如何使用JavaMail API来实现这个功能。 ...

    java 邮件 群发 源代码

    Java邮件群发是一种常见的编程需求,特别是在自动化通知、营销活动或者系统消息传递中。下面将详细解释这个主题,包括核心概念、技术要点以及如何在Java中实现邮件群发功能。 一、JavaMail API JavaMail API是Java...

    java 邮件群发

    Java邮件群发是一种常见的编程需求,特别是在自动化通知、营销活动或者系统消息传递中。JavaMail API是Java平台上的一个标准库,它允许开发者发送和接收电子邮件。本篇将深入探讨如何利用JavaMail进行邮件群发,并...

    javamail邮件群发、单发_邮件发送

    JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送和接收。它提供了丰富的 API,使得开发者可以方便地...通过这个简单的示例,你应该已经掌握了使用 JavaMail 进行邮件群发和单发的核心概念。

    JAVA实现邮件群发

    在Java编程环境中,实现邮件群发是一项常见的任务,特别是在企业级应用中,如发送通知、订阅更新或客户服务通信。这个“JAVA实现邮件群发”的示例程序提供了精炼且实用的解决方案,使得开发者能够轻松地集成邮件发送...

    [JAVA]-邮件群发程序

    邮件群发程序,由Java编写.程序由本人原创,如有问题可加我QQ(12356918)交流.

    java实现邮件群发

    Java 实现邮件群发是一项常见的任务,特别是在自动化通知、营销活动或者系统消息推送等场景下。下面我们将深入探讨如何利用Java来实现这个功能。 首先,Java 提供了 JavaMail API 来处理邮件发送。JavaMail API 是...

    关于java的群发邮件

    在Java编程环境中,实现邮件群发是一项常见的任务,特别是在企业级应用中,如发送通知、报告或者营销信息。本文将详细讲解如何利用Java技术进行邮件群发,同时也会涉及.NET框架的一些基本概念,以及数据库在其中的...

    邮件群发代码

    以下是一个简单的Java邮件群发类的概述,这个类名为Mailer。 Mailer类的核心是使用了JavaMail API,这是一个开放源码的库,提供了处理电子邮件的全面功能。首先,我们导入了必要的JavaMail和Java Util包: ```java...

    基于java spring邮件群发的demo

    在这个"基于Java Spring邮件群发的demo"中,我们将探讨如何利用Spring框架的邮件服务模块实现高效的邮件群发功能。同时,这个项目还涉及到了MySQL数据库和MyBatis持久层框架,这三者共同构成了一个完整的数据驱动的...

    java发送邮件实例

    Java发送邮件是一个常见的任务,尤其在自动化通知、报表发送或者用户验证等场景中。下面将详细解释这个过程,包括SMTP(Simple Mail Transfer Protocol)的工作原理、JavaMail API的使用以及可能遇到的问题及其解决...

    javaemail邮件群发

    JavaMail邮件群发是Java编程中用于发送电子邮件的API,它允许开发者通过编程方式实现邮件的发送、接收和管理。这个技术广泛应用于自动化通知、营销推广、客户服务等场景。JavaMail API提供了丰富的功能,包括SMTP...

    Java Mail群发实例、邮件群发相关、打造自己的EDM系统

    本教程将深入探讨如何使用Java Mail进行邮件群发,并讲解如何构建一个简单的EDM(Electronic Direct Marketing,电子直接营销)系统。 首先,你需要了解Java Mail的核心组件。`javax.mail`包提供了各种类和接口,...

    java mail 邮件群发源码

    在Java开发中,当我们需要进行邮件群发功能时,Java Mail 提供了完善的API来实现这一需求。本篇文章将详细解析“Java Mail 邮件群发源码”相关的知识点,并通过分析提供的“communication1”文件中的内容来深入理解...

    java发送邮件的案例 包括附件 群发

    这个案例主要涉及使用Java发送带有附件的邮件以及群发功能。以下将详细解释如何实现这一目标。 首先,JavaMail API是Java中用于处理电子邮件的核心库。要发送邮件,你需要在项目中引入JavaMail API的相关依赖,例如...

    java读取数据库群发邮件.zip

    本项目“java读取数据库群发邮件”是利用Java技术来实现从Access数据库中获取数据,并根据这些数据进行邮件群发的功能。Access是一款由Microsoft开发的关系型数据库管理系统,适合小型企业和个人用户存储和管理数据...

    java发送qq邮件 支持群发 附件等等

    以上就是使用Java和SpringBoot发送QQ邮件,支持群发和附件的基本知识点。在实际项目中,可能还需要考虑到邮件模板、多语言支持、邮件发送状态追踪等多种复杂情况,这些都需要根据具体需求进行扩展和实现。

    java邮件发送组件

    Java邮件发送组件是Java开发中用于发送电子邮件的工具,它使得开发者能够轻松地在应用程序中实现邮件功能。Java Mail API是实现这一功能的核心库,它提供了丰富的接口和类,允许程序进行邮件的创建、发送以及处理。...

    用jsp实现邮件群发

    本文将详述如何使用Java Server Pages(JSP)技术来实现邮件群发,并结合SQL Server 2000数据库来存储和管理邮件列表。 首先,我们需要理解JSP的基本原理。JSP是Java平台上的一个服务器端脚本语言,用于生成动态...

    学生成绩单邮件群发源代码

    在IT行业中,邮件群发是一项常见的任务,尤其在教育领域,例如向学生或家长发送成绩报告。本项目名为“学生成绩单邮件群发源代码”,其主要目标是实现自动化地将学生成绩单通过电子邮件的方式批量发送给指定的收件人...

Global site tag (gtag.js) - Google Analytics