摘 要:邮件群发是消息在Internet传递的最好办法,同时也是垃圾邮件的来源。本文以使用JAVAMAIL为例,讨论实现大规模邮件发送的方法和技巧。
关键字:SMTP、MIME、JAVAMAIL、群发邮件
一、引言
邮件群发是Internet生活中最常见的一种信息传递方式,其传递信息的主动性、高效率和低费用而被众多商家广泛采用。我们的电子邮箱随之充满了各种类型的商业邮件,一般称这些商业邮件为垃圾邮件。本文笔者运用JAVA语言开发了一个基于SMTP服务器的邮件群发软件,在以下内容中将逐一介绍SMTP协议,JAVAMAIL包,以及邮件群发程序的片段等。
二、简单邮件传输协议与JAVAMAIL类库
1.简单邮件传输协议(SMTP)从1982年起被用来在不同计算机系统间传递电子邮件。SMTP使用简单的ASCII码文本命令,命令定义长度为4个字符。SMTP基本命令集及功能如表一所示。
命令
功能
HELO
从客户端打开问候信息
MAIL
标识发件人
RCPT
标识收件人
DATA
标识邮件开始
SEND
向终端发送邮件
SOML
执行SEND或MAIL命令
SAML
执行SEND或MAIL命令
RSET
重置SMTP连接
VRFY
验证系统用户名
EXPN
查询列表和别名
HELP
查询命令列表
NOOP
不操作
QUIT
终止SMTP连接
TURN
变换SMTP角色
表一
绝大多数SMTP系统采用一种标准的邮件报文格式,即RFC822来“规范”邮件的形式。RFC822明确的划分邮件为两个部分,一部分称为邮件头,起其作用是标识邮件;第二部分是邮件体。
邮件头中包括:
1)Received:用来标识将邮件从最初发送者到目的地进行中间转发的SMTP服务器,其中含有发信人及发信服务器真实的信息。
2)Return-path:用来标识邮件发送到目的服务器所经过的路径。
3)From:显示发信人的地址。格式为From:user-name。
4)Date:记录邮件发送时间。
5)Destination:记录收邮件地址, 标识电子邮件的接受方地址,这些地址是纯粹地信息,SMTP仅通过RCPT命令发送信件。包括To主收件人,Cc抄送收件人,Bcc暗抄送收件人,格式为To/Cc/Bcc:address。
6)Resent:表示一封邮件处于某中原因需要从客户端再次发送。
2.JAVAMAIL关于邮件操作最新包是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);
}
分享到:
相关推荐
【Java邮件群发代码详解】 在Java编程中,发送电子邮件是一项常见的任务,尤其对于自动化通知、批量消息传递等场景。本篇将详细介绍一个简单的Java邮件群发代码,帮助理解如何使用JavaMail API来实现这个功能。 ...
Java邮件群发是一种常见的编程需求,特别是在自动化通知、营销活动或者系统消息传递中。下面将详细解释这个主题,包括核心概念、技术要点以及如何在Java中实现邮件群发功能。 一、JavaMail API JavaMail API是Java...
在Java编程环境中,实现邮件群发是一项常见的任务,特别是在企业级应用中,如发送通知、订阅更新或客户服务通信。这个“JAVA实现邮件群发”的示例程序提供了精炼且实用的解决方案,使得开发者能够轻松地集成邮件发送...
JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送和接收。它提供了丰富的 API,使得开发者可以方便地...通过这个简单的示例,你应该已经掌握了使用 JavaMail 进行邮件群发和单发的核心概念。
Java 实现邮件群发是一项常见的任务,特别是在自动化通知、营销活动或者系统消息推送等场景下。下面我们将深入探讨如何利用Java来实现这个功能。 首先,Java 提供了 JavaMail API 来处理邮件发送。JavaMail API 是...
在Java编程环境中,实现邮件群发是一项常见的任务,特别是在企业级应用中,如发送通知、报告或者营销信息。本文将详细讲解如何利用Java技术进行邮件群发,同时也会涉及.NET框架的一些基本概念,以及数据库在其中的...
邮件群发程序,由Java编写.程序由本人原创,如有问题可加我QQ(12356918)交流.
JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 IMAP。 在本文中,我们将讨论如何使用 JavaMail 库来代发邮件...
4. 创建MimeMessage对象:这是JavaMail中的邮件对象,可以设置发件人、收件人、主题、正文等信息。 5. 发送邮件:通过Transport类的send方法发送MimeMessage对象。 以下是一个简单的Java发送邮件的示例代码: ```...
在这个"基于Java Spring邮件群发的demo"中,我们将探讨如何利用Spring框架的邮件服务模块实现高效的邮件群发功能。同时,这个项目还涉及到了MySQL数据库和MyBatis持久层框架,这三者共同构成了一个完整的数据驱动的...
JavaMail邮件群发是Java编程中用于发送电子邮件的API,它允许开发者通过编程方式实现邮件的发送、接收和管理。这个技术广泛应用于自动化通知、营销推广、客户服务等场景。JavaMail API提供了丰富的功能,包括SMTP...
Java邮件发送组件是Java开发中用于发送电子邮件的工具,它使得开发者能够轻松地在应用程序中实现邮件功能。Java Mail API是实现这一功能的核心库,它提供了丰富的接口和类,允许程序进行邮件的创建、发送以及处理。...
以下是一个简单的Java邮件群发类的概述,这个类名为Mailer。 Mailer类的核心是使用了JavaMail API,这是一个开放源码的库,提供了处理电子邮件的全面功能。首先,我们导入了必要的JavaMail和Java Util包: ```java...
Java开发的邮件代理服务器是一种基于Java编程语言实现的软件系统,它充当了用户与实际邮件服务器之间的中介。这种代理服务器的主要任务是处理电子邮件的发送、接收以及管理等操作,为用户提供更加便捷和安全的服务。...
这个案例主要涉及使用Java发送带有附件的邮件以及群发功能。以下将详细解释如何实现这一目标。 首先,JavaMail API是Java中用于处理电子邮件的核心库。要发送邮件,你需要在项目中引入JavaMail API的相关依赖,例如...
本项目“java读取数据库群发邮件”是利用Java技术来实现从Access数据库中获取数据,并根据这些数据进行邮件群发的功能。Access是一款由Microsoft开发的关系型数据库管理系统,适合小型企业和个人用户存储和管理数据...
在Java开发中,当我们需要进行邮件群发功能时,Java Mail 提供了完善的API来实现这一需求。本篇文章将详细解析“Java Mail 邮件群发源码”相关的知识点,并通过分析提供的“communication1”文件中的内容来深入理解...
2. **创建邮件**:通过 `MimeMessage` 类来构建邮件对象,设置发件人、收件人、主题和邮件正文。可以使用 `MimeBodyPart` 和 `Multipart` 类来添加附件或HTML内容。 3. **发送邮件**:使用 `SMTPTransport` 的 `...
本教程将深入探讨如何使用Java Mail进行邮件群发,并讲解如何构建一个简单的EDM(Electronic Direct Marketing,电子直接营销)系统。 首先,你需要了解Java Mail的核心组件。`javax.mail`包提供了各种类和接口,...