java mail setfrom.setRecipient(MimeMessage.RecipientType.CC) 设置多个抄送人一直报错

博客分类:
JavaMail技术基础概念整理归纳
一、邮件传输协议(转载网络并整理)1.SMTP:简单邮件传输协议(Simple Mail Transfer Protocol)由RFC821定义,定义了发送邮件的机制
在JavaMail环境中,基于JavaMail的程序将和因特网服务供应商ISP(internet Service Provider's)SMTP服务器通信
SMTP服务器会中转消息给接收方SMTP服务器以便最终让用户经由POP或者IMAP获得
2.POP:代表邮局协议(Post Office Protocol)目前常用版本为3 也称pop3此协议是由RFC1939定义
POP是一种机制,因特网上多大数用户用它得到邮件.
它规定每个用户一个邮箱的支持.
注意:在使用POP协议的时候,用户的许多性能并不是由POP协议支持的如:查看几封新邮件消息这个功能这些功能内建在如Microsoft Outlook之类的程序中所以在用JavaMail的时候,如果想要这些信息,你就必须自己实现了
3.IMAP:更高级的用户接收消息的协议,被定义在RFC2060中
IMAP代表因特网消息访问协议(Internet Message Access Protocol)目前用的版本是4,所以也叫做IMAP4.
在用到IMAP的时候,邮件服务器必须支持这个协议,不能仅仅把使用POP的程序用于IMAP,并指望它支持IMAP所有性能
它与POP3的区别是:IMAP用密文在网络间传输消息,比POP3的明文传输要安全
4.MIME:是因特网邮件扩展标准(Multipurpose Internet Mail Extensions)注意:它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可理解成一个定义合适的标准.
5.NNTP:因为JavaMail将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持.NNTP 就是网络新闻传输协议.
二、获得jar(转载网络)JavaMailAPI可以到下载将mail.jar添加到classpath即可
如:JavaMail 1.4.1
JAF框架可以到下载如:jaf 1.0.2将activation.jar添加到classpath即可
如果使用J2EE则可以不用基本的JavaMailAPI了,确保j2ee.jar在classpath中即可
三、常用API(转载网络并整理)JavaMail核心类结构javax.mail的包下面存在着一些核心类:Session、Message、Address、 Authenticator、Transport、Store、Folder
javax.mail.internet包中还有一些常用的子类
1.javax.mail.Session类定义了基本的邮件会话,进行收发邮件的工作都是基于这个会话
Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息
使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象Properties props = new Properties();Session.getDefaultInstance(props, null);注意第2个参数为null,则表示不使用邮件授权
2.javax.mail.Message类Message是个抽象类,大多数情况下,使用javax.mail.internet.MimeMessage子类该类是使用MIME类型、MIME信息头的邮箱信息MimeMessage msg = new MimeMessage(session);
建立MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口
对于一般发送文本信息的邮件:msg.setContent("Hello", "text/plain"或"text/charset=gb2312");或msg.setText("Hello");
针对内容是存文本
msg.setSubject(string)
对邮件设置邮件主题
3.javax.mail.Address 邮件地址类
抽象类一般使用javax.mail.internet.InternetAddress子类
(1)传入代表邮件地址的字符串,建立一个邮件地址类:Address address = new InternetAddress("");
Address address = new InternetAddress("", "名字/姓名");
(2)建立邮件地址类后,通过MimeMessage对象的setFrom()和setReplyTo()两种方法设置邮件的发信人msg.setFrom(address);或msg.setReplyTo(address);
addForm()方法增加发信人
(3)设置收信人MimeMessage对象的addRecipient()方法增加收信人msg.addRecipient(Message.RecipientTyp, address)或msg.setRecipients(Message.RecipientType,address数组);
同时发送给多个地址
Message对象.RecipientType的常量来区分收信人的类型:Message.RecipientType.TO
主送Message.RecipientType.CC
抄送Message.RecipientType.BCC 隐蔽抄送
4.javax.mail.Authenticator类
抽象类JavaMail API通过使用授权类以用户名、密码的方式访问那些受保护资源(指服务器)
采用继承此类的方式,并且该继承类必须具有返回javax.mail.PasswordAuthentication对象(存储认证时用到的用户名,密码)
并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类
参考如下代码://SMTP验证类(内部类),继承javax.mail.Authenticatorclass MyAuthenticator extends Authenticator {
private String strU
private String strP
public MyAuthenticator(String user, String password) {
this.strUser =
this.strPwd =
//方法返回javax.mail.PasswordAuthentication对象 protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
在构造会话对象时:Properties props = System.getProperties();
props.put("mail.smtp.auth","true");//设置执行SMTP授权验证
MyAuthenticator auth=new MyAuthenticator(MailUserName,MailPassword);
//得到默认的对话对象Session session=Session.getDefaultInstance(props,auth);
5.javax.mail.Transport类
抽象类发送邮件时用到这个类实现了发送信息的协议(SMTP)
第一种发送方式:使用这个类的静态方法send()来发送邮件
Transport.send(MimeMessage对象);
另一种发送方式:由Session获得相应协议对应的Transport实例
通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接使用sendMessage()方法发送,最后关闭连接
参考如下代码:MimeMessage对象.saveChanges();Transport transport = session.getTransport("smtp");transport.connect(smtphost, username, password);transport.sendMessage(MimeMessage对象, MimeMessage对象.getAllRecipients());transport.close();
注意:发送方式二是个很好的方法,尤其是在同一个邮件服务器上发送多个邮件时因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连接
send()这个基本的方法是在每次调用时进行与邮件服务器的连接的对于在同一个邮件服务器上发送多个邮件来讲其效率比较低
注意:如果需要在发送邮件过程中监控mail命令的话,在发送前设置debug标志:session.setDebug(true)
6.javax.mail.Store和javax.mail.Folder类接收邮件,在获得Session后,从Session中获取特定类型的Store,然后连接到Store(Store代表了存储邮件的邮件服务器)
在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。
Store store = session.getStore("pop3");或Store store = session.getStore("imap");
store.connect(host, username, password);
连接到Store后,一个Folder对象(目录对象)通过Store的getFolder()方法返回,可从这个Folder中读取邮件信息
//从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效)Folder folder = store.getFolder("INBOX");
以只读 (Folder.READ_ONLY)的方式打开Folderfolder.open(Folder.READ_ONLY);
//调用Folder的getMessages()方法得到目录中所有Message的数组Message message[] = folder.getMessages();
注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder
SUN在设计Folder的getMessages()方法时采取了很智能的方式:先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容
在读取邮件时,可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存getContent()方法只接收邮件内容(不包含邮件头)writeTo()方法将包括邮件头
System.out.println(((MimeMessage)message).getContent());
读取邮件内容后,要关闭Folder和Store
folder.close(aBoolean); //boolean型参数表示是否在删除操作邮件后更新Folderstore.close();
贴上本人在实际项目中的实现代码:
/* * Mail.java:Mail实体 *
* Created on
* Copyright(C) 2009, by Ambow Research&Development Branch. *
* Original Author: LuFeng *
* ------- * $Log$ */package cn.com.ambow.cip.system.
import java.util.Dimport java.util.V
public class Mail { private S // 主题 private String inceptA //收件人地址 private String sendA
//发件人地址 private S // 邮件正文 private Vector file= //附件 private Date sendT // 发送时间
public Mail(){
inceptAddress="";
sendAddress="";
content="";
file=new Vector(); }
public String getContent() { }
public void setContent(String content) {
this.content = }
public Vector getFile() { }
public void setFile(Vector file) {
this.file = }
public String getInceptAddress() {
return inceptA }
public void setInceptAddress(String inceptAddress) {
this.inceptAddress = inceptA }
public String getSendAddress() {
return sendA }
public void setSendAddress(String sendAddress) {
this.sendAddress = sendA }
public Date getSendTime() {
return sendT }
public void setSendTime(Date sendTime) {
this.sendTime = sendT }
public String getTitle() { }
public void setTitle(String title) {
this.title = }
//该方法用于收集附件名 public void attachfile(String fname){
file.addElement(fname); } }
MailFacade.java
/** MailFacade.java:本类功能简介 *
* Created on
* Copyright(C) 2009, by Ambow Research&Development Branch. * * Original Author: LuFeng *
* ------- * $Log$*/package cn.com.ambow.cip.system.
import java.util.P
import javax.mail.Mimport javax.mail.S
import javax.mail.Aimport javax.mail.PasswordA
import javax.mail.Timport javax.mail.internet.InternetAimport javax.mail.internet.MimeMimport javax.mail.internet.MimeBodyPimport javax.mail.internet.MimeU
import javax.mail.Mimport javax.mail.internet.MimeM
import javax.mail.MessagingE
import javax.activation.FileDataSimport javax.activation.DataH
import java.util.Vimport java.util.Eimport java.util.D
import cn.com.ambow.publicwork.config.AmbowCimport cn.com.ambow.publicwork.common.AmbowL
public class MailFacade { private static String SMTPServer=""; private static String MailUserName=""; private static String MailPassword=""; private static String SendDebug=""; private static String IsLoad="";
//做一个可以传发件人等参数的构造 public MailFacade() throws Exception{
if(IsLoad.length()==0){ //如果还没有装载,则装载邮件服务器信息(从.properties文件中读取)
AmbowConfig abConfig=AmbowConfig.createAmbowConfig();
SMTPServer=AmbowLang.getEmptyString(abConfig.getProperty("smtpServer"));
MailUserName=AmbowLang.getEmptyString(abConfig.getProperty("username"));
MailPassword=AmbowLang.getEmptyString(abConfig.getProperty("password"));
SendDebug=AmbowLang.getEmptyString(abConfig.getProperty("sendDebug"));
IsLoad="load";
* 发送邮件方法
* 接收一个Mail对象(封装邮件)
*/ public boolean startSend(Mail mail) throws Exception{
//创建Properties对象
Properties props = System.getProperties();
//创建信件服务器
props.put("mail.debug",SendDebug);
props.put("mail.smtp.host",SMTPServer);
props.put("mail.smtp.auth","true");//执行SMTP验证
MyAuthenticator auth=new MyAuthenticator(MailUserName,MailPassword);
//得到默认的对话对象
Session session=Session.getDefaultInstance(props,auth);
//创建一个消息,并初始化该消息的各项元素
MimeMessage msg = new MimeMessage(session);
//发送人地址
msg.setFrom(new InternetAddress(mail.getSendAddress()));
//收件人地址
InternetAddress[] address={new InternetAddress(mail.getInceptAddress())};
msg.setRecipients(Message.RecipientType.TO,address);
//设置主题
msg.setSubject(AmbowLang.getEmptyString(mail.getTitle()).trim());
//后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
//邮件正文
MimeBodyPart mbpText=new MimeBodyPart();
mbpText.setContent(AmbowLang.getEmptyString(mail.getContent()),"text/charset=gb2312");
mp.addBodyPart(mbpText);
//利用枚举器方便的遍历集合
Enumeration efile=mail.getFile().elements();
//检查序列中是否还有更多的对象
String filename="";
while(efile.hasMoreElements()){
MimeBodyPart mbp=new MimeBodyPart();
//选择出每一个附件名
filename=efile.nextElement().toString();
//得到数据源
FileDataSource fds=new FileDataSource(filename);
//得到附件本身并至入BodyPart
mbp.setDataHandler(new DataHandler(fds));
//得到文件名同样至入BodyPart(同时处理中文文件名)
mbp.setFileName(MimeUtility.encodeWord(fds.getName(),"GB2312",null));
mp.addBodyPart(mbp);
//移走集合中的所有元素
mail.getFile().removeAllElements();
//Multipart加入到信件
msg.setContent(mp);
//设置信件头的发送日期
msg.setSentDate(new Date());
//发送信件
Transport.send(msg);
}catch(MessagingException mex){
mex.printStackTrace();
Exception ex =
if ((ex=mex.getNextException())!=null){
ex.printStackTrace();
//发送成功 }
//SMTP验证类(内部类),继承javax.mail.Authenticator class MyAuthenticator extends Authenticator {
private String strU
private String strP
public MyAuthenticator(String user, String password) {
this.strUser =
this.strPwd =
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
//测试方法 public static void main(String args[])throws Exception{
MailFacade mailFacade=new MailFacade();
Mail mail=new Mail();
mail.setSendAddress("");
mail.setInceptAddress("");
mail.setTitle("邮件标题");
mail.setContent("您好:这是邮件正文,谢谢!");
mail.attachfile("D:\\Work\\邮件附件.rar");
System.out.println(mailFacade.startSend(mail)); }}
浏览: 40737 次
来自: 苏州
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
Java Mail API的开发是SUN为Java开发者提供公用API框架的持续努力的良好例证。提倡公用框架,反对受限于供应商的解决方案,充分预示着一个日益开放的开发环境的建立。
  Java Mail API的结构本身证明了它的开发者的基本目标之一--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。换句话说,Java Mail API尽可能地保持简单。乍看起来,JavaMail API所拥有的类总数以及类之间的关系可能让人误解为要花费漫长的学习时间。实际上,一旦正式开始使用,你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具。
安装前要确保你的机子上安装得有标准版的JDK和Web服务器,并且已配置好,有关它们的安装方法,请参考其它文章(网上到处都有).
(1).安装JavaMail API。现在最常用的 JavaMail API 版本是1.3.
  要使用 JavaMail 1.3 API,请下载 JavaMail 1.3 实现,解开Javamail-1_3.zip 文件,并将 mail.jar 文件添加到 CLASSPATH 中。除了核心类,随版本 1.3 实现一起提供的还有 SMTP、IMAP4 和 POP3 供应商。
  
(2).JavaBeans Activation Framework(1.0.2版) 的安装
JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。下载完框架后,解开 jaf1_0_2.zip 文件,并将 activation.jar 文件添加到 CLASSPATH 中。
  
注: 如果您使用的JDK是J2EE,就没有什么特定的事非要用基本 JavaMail API来做不可;J2EE 的类就能处理了,因为它本身就包含有JavaMail API和JAF,您只需要确将 j2ee.jar 文件添加到您的CLASSPATH 中并已全部设置好。
3.JavaMail的常用类介绍
没用过JavaMail的人可能看不懂这些介绍,不过不要紧,后面的文章有具体的实例,到时也可倒回来查看这些类的用法.
(1) javax.mail.Properties类
  JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
用法:
 Properties props = new Properties ();
   props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtp主机名。
(2) javax.mail.Session类
  这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。
用法:
   Session sendMailS
   sendMailSession = Session.getInstance(props, null);
(3) javax.mail.Transport类
  邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和Store. Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。
用法:
T
  transport = sendMailSession.getTransport("smtp");
  用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。
 注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3.
(4) javax.mail.MimeMessage类
  Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
  用法:
Message newMessage = new MimeMessage(sendMailSession);
(5) javax.mail.InternetAddress类
一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类.
用法:
InternetAddress from=new InternetAddress("");
(6) javax.mail.Store类
Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。
用法:
Store store=s.getSorte("pop3");//s为一个邮件会话
store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码登录你的邮箱
(7) javax.mail.Folder类
Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。
用法:
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
(8) javax.mail.Internet.MimeMultpart
一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象.
用法:
MimeMultipart multipart=new MimeMultipart();
注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分.
(9) javax.mail.Internet.MimeBodyPart类
MimeBodyPart是BodyPart具体用于mimeMessage的一个子类.
MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部分:
⊙一个MIME类型
⊙匹配这个类型的内容
用法:
MimeBodyPart mdp=new MimeBodyPart();
String text="Hello JavaMail!";
mdp.setContent(text,"text/plain");//定义MIME类型为text/plain,并设置MimeBodyPart的内容.
(10) javax.activation.DataHandler类(包含在JAF中)
JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.
用法:
DataHandler dh=new DataHandler(text,type);
mdp.setDatahandler(dh);//mdp是一个MimeBodyPart对象
(11) javax.activation.FileDataSource类(包含在JAF中)
一个FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的MimeBodyPart对象附在一个mimeMessage对象上.
用法:
MimeMultipart mm=new MimeMultipart();
MimeBodyPart mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource("c:/exam.txt");
mdp.setDataHandler(new DataHandler(fds)); //设置数据源
mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart
(12) javax.activation.URLDataSource类(包含在JAF中)
远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多).
用法:
与FileDataSource唯一不同的是数据源的设置:
URLDataSource uds=new URLDataSource("http://www.cnjsp.com/logo.gif");
4.试着编写第一个发送程序
在前面我们已对JavaMail作了一些介绍,下面我们可试着写自己的程序了.
首先,我们先写一个撰写邮件的html程序index.htm,如下:
-------------------------------------------------------------------------------------------
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&撰写邮件&/title&
&/head&
&body&
&form name="form1" method="post" action="testmail.jsp"&
&table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black"&
&tr bgcolor="#FFFFFF"&
&td width="24%"&收信人地址:&/td&
&td width="76%"&
&input name="to" type="text" id="to"&&/td&
&/tr&
&tr bgcolor="#FFFFFF"&
&td&主题:&/td&
&td&
&input name="title" type="text" id="title"&&/td&
&/tr&
&tr&
&td height="107" colspan="2" bgcolor="#FFFFFF"&
&textarea name="content" cols="50" rows="5" id="content"&&/textarea&&/td&
&/tr&
&tr align="center"&
&td colspan="2" bgcolor="#FFFFFF"&
&input type="submit" name="Submit" value="发送"&
&input type="reset" name="Submit2" value="重置"&
&/td&
&/tr&
&/table&
&/form&
&/body&
&/html&
接着,我们再写一个处理程序testmail.jsp,如下:
-----------------------------------------------------------------------------------------
&%@ page contentType="text/charset=GB2312" %&
&%request.setCharacterEncoding("gb2312");%&&!--中文处理代码--&
&!--引入要用到的类库--&
&%@ page import="java.util.*,javax.mail.*"%&
&%@ page import="javax.mail.internet.*"%&
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&发送成功&/title&
&/head&
&body&
&%
try{
//从html表单中获取邮件信息
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();//也可用Properties props = System.getProperties();
props.put("mail.smtp.host","smtp.163.net");//存储发送邮件服务器的信息
props.put("mail.smtp.auth","true");//同时通过验证
Session s=Session.getInstance(props);//根据属性新建一个邮件会话
s.setDebug(true);
MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象
//设置邮件
InternetAddress from=new InternetAddress("");
message.setFrom(from);//设置发件人
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO
message.setSubject(ttitle);//设置主题
message.setText(tcontent);//设置信件内容
message.setSentDate(new Date());//设置发信时间
//发送邮件
message.saveChanges();//存储邮件信息
Transport transport=s.getTransport("smtp");
transport.connect("smtp.163.net","boy","iloveyou");//以smtp方式登录邮箱
transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有
//已设好的收件人地址
transport.close();
&font color="#FF6600"&发送成功!&/font&
&br&
&br&
&%
}catch(MessagingException e){
out.println(e.toString());
}
%&
&/body&
&/html&
**********************************注意***************************************
有好多书上和网上的文章在关键部分都是这样写testmail.jsp的,如下:
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","smtp.163.net");
Session s=Session.getInstance(props);
MimeMessage message=new MimeMessage(s);
InternetAddress from=new InternetAddress("");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setText(tcontent);
message.setSentDate(new Date());
Store store=s.getStore("pop3");
store.connect("pop.163.net","boy","iloveyou");//以pop3的方式登录邮箱
Transport transport=s.getTransport("smtp");
transport.send(message);
store.close();
事实上,这种方式并不可靠,因为很多电子邮局的smtp服务器要求我们通过验证,所以用这种方式发邮件时,只能发给同类邮箱(即相同smtp的邮箱),甚至有时同类邮箱也发不出去.以上两种方式我试过很多次,结果证明第一种方式是最可靠的.
好了,我相信你应该会写最简单的Email发送程序了.OK,下一次我们将说说怎样写发送HTML格式的邮件.
5.发送HTML格式的邮件
所谓HTML格式,就是超文本格式.你的邮件可以用HTML代码编写,发给对方后,对方收到的将是信息将是超文本,超文本比纯文本好看多了.下以面是在以前例子的基础上修改的程序:
&%@ page contentType="text/charset=GB2312" %&
&%request.setCharacterEncoding("gb2312");%&
&%@ page import="java.util.*,javax.mail.*"%&
&%@ page import="javax.mail.internet.*"%&
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&发送成功&/title&
&/head&
&body&
&%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());
//给消息对象设置内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,"text/charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对
//象(事实上可以存放多个)
mm.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
message.setContent(mm);//把mm作为消息对象的内容
message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%&
&font color="#FF6600"&发送成功!&/font&
&br&
&br&
&%
}catch(MessagingException e){
out.println(e.toString());
}
%&
&/body&
&/html&
注:撰写邮件的html文件仍然和前面(请参考jsp和Java Mail(三))那个一样,不需要作任何修改.
怎么样,这个程序是不是很简单呢?如果还有什么不懂的话,请在下面留言.下一次我们将要讲一讲怎样发送附件.
6.发送三种类型的附件
前面我们已学会了发送一般文本邮件和超文本邮件,今天我们将让大家学会编写三种类型的附件的邮件
发送程序.(注:撰写界面仍然用前面的)
&%@ page contentType="text/charset=GB2312" %&
&%request.setCharacterEncoding("gb2312");%&
&%@ page import="java.util.*,javax.mail.*"%&
&%@ page import="javax.mail.internet.*"%&
&%@ page import="javax.activation.*"%&&!--要发送附件必须引入该库--&
&%@ page import="java.net.*"%&&!--要用到URL类--&
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&发送成功&/title&
&/head&
&body&
&%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");
Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());
Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象
//设置信件文本内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,"text/charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中
//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)
mdp=new MimeBodyPart();//新建一个存放附件的BodyPart
DataHandler dh=new DataHandler("JavaMail附件测试","text/charset=gb2312");
//新建一个DataHandler对象,并设置其内容和格式/编码方式
mdp.setFileName("xxf.txt");//加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh
mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中
//设置信件的附件2(用本地上的文件作为附件)
mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource("g:/xx.txt");
dh=new DataHandler(fds);
mdp.setFileName("dd.txt");//可以和原文件名不一致
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
//设置信件的附件3(用远程文件作为附件)
mdp=new MimeBodyPart();
URLDataSource ur=new URLDataSource(new URL("http://localhost:8080/jspstudy/email/xx.gif"));
//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下.
dh=new DataHandler(ur);
mdp.setFileName("ss.txt");
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
message.setContent(mm);//把mm作为消息对象的内容
message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%&
&font color="#FF6600"&发送成功!&/font&
&br&
&br&
&%
}catch(MessagingException e){
out.println(e.toString());
}
%&
&/body&
&/html&
发送附件是不是很有趣呢?但是在这里由于没有修改撰写界面,要发送的附件只能在程序里固定,所以一点都不灵活.不用担心,下一次我们将重写撰写界面,当然同时也会修改邮件处理程序,到时我们将能灵活地发送自己的邮件.
七.编写灵活的发送程序
本小节没加什么新鲜的东西,但是综合了以前的所有内容,可以让你灵活地发送你想要发的邮件.看了本小节之后对你会感觉到非常有用.
更改后的撰写界面程序如下:
-------------------------------------------------------------------------------------------
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&撰写邮件&/title&
&/head&
&body&
&form action="testall.jsp" method="post" name="form1"&
&table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black"&
&tr bgcolor="#FFFFFF"&
&td width="24%"&收信人地址:&/td&
&td width="76%"& &input name="to" type="text" id="to"&&/td&
&/tr&
&tr bgcolor="#FFFFFF"&
&td&主题:&/td&
&td& &input name="title" type="text" id="title"&&/td&
&/tr&
&tr&
&td height="18" colspan="2" bgcolor="#FFFFFF"&信件类型
&select name="emailtype" id="emailtype"&
&option value="text/plain" selected&Text&/option&
&option value="text/html"&Html&/option&
&/select&&/td&
&/tr&
&tr&
&td height="53" colspan="2" bgcolor="#FFFFFF"&&textarea name="content" cols="50" rows="5" id="content"&&/textarea&&/td&
&/tr&
&tr align="center"&
&td colspan="2" bgcolor="#FFFFFF"&附件1(自定义):
&input name="fj1" type="text" id="fj1"&
(输入文本信息) &/td&
&/tr&
&tr align="center" valign="bottom"&
&td colspan="2" bgcolor="#FFFFFF"&附件2(本地):
&input name="fj2" type="file" id="fj2" size="10"&&/td&
&/tr&
&tr align="center"&
&td colspan="2" bgcolor="#FFFFFF"&附件3(远程):
&input name="fj3" type="text" id="fj3" value="http://"&
(输入URL)&/td&
&/tr&
&tr align="center"&
&td colspan="2" bgcolor="#FFFFFF"& &input type="submit" name="Submit" value="发送"&
&input type="reset" name="Submit2" value="重置"&&/td&
&/tr&
&/table&
&/form&
&/body&
&/html&
处理邮件的JSP程序如下:
----------------------------------------------------------------------------------------
&%@ page contentType="text/charset=GB2312" %&
&%request.setCharacterEncoding("gb2312");%&
&%@ page import="java.util.*,javax.mail.*"%&
&%@ page import="javax.mail.internet.*"%&
&%@ page import="javax.activation.*"%&&!--要发送附件必须引入该库--&
&%@ page import="java.net.*"%&&!--要用到URL类--&
&html&
&head&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&title&发送成功&/title&
&/head&
&body&
&%
try{
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String emailtype=request.getParameter("emailtype");//获取email类型
String tcontent=request.getParameter("content");
String tfj1=request.getParameter("fj1");
String tfj2=request.getParameter("fj2");
String tfj3=request.getParameter("fj3");
Properties props=new Properties();
props.put("mail.smtp.host","127.0.0.1");
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from=new InternetAddress("");
message.setFrom(from);
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(ttitle);
message.setSentDate(new Date());
Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象
//设置信件文本内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent(tcontent,emailtype+";charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中
//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送)
mdp=new MimeBodyPart();//新建一个存放附件的BodyPart
DataHandler dh=new DataHandler(tfj1,"text/charset=gb2312");
//新建一个DataHandler对象,并设置其内容和格式/编码方式
mdp.setFileName("text.txt");//加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh
mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中
//设置信件的附件2(用本地上的文件作为附件)
mdp=new MimeBodyPart();
FileDataSource fds=new FileDataSource(tfj2);
dh=new DataHandler(fds);
int ddd=tfj2.lastIndexOf("\\");
String fname=tfj2.substring(ddd);//提取文件名
String ffname=new String(fname.getBytes("gb2312"),"ISO8859-1");//处理文件名是中文的情况
mdp.setFileName(ffname);//可以和原文件名不一致,但最好一样
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
//设置信件的附件3(用远程文件作为附件)
mdp=new MimeBodyPart();
URL urlfj=new URL(tfj3);
URLDataSource ur=new URLDataSource(urlfj);
//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下.
dh=new DataHandler(ur);
int ttt=tfj3.lastIndexOf("/");
String urlname=tfj3.substring(ttt);
//String urlfname=new String(urlname.getBytes("gb2312"),"ISO8859-1");//不知怎么回事,这里不能处理中文问题
mdp.setFileName(urlname);
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
message.setContent(mm);//把mm作为消息对象的内容
message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("127.0.0.1","xxf","coffee");
transport.sendMessage(message,message.getAllRecipients());
transport.close();
%&
&font color="#FF6600"&发送成功!&/font&
&br&
&br&
&%
}catch(MessagingException e){
out.println(e.toString());
}
%&
&/body&
&/html&
下载次数: 10
(370.7 KB)
下载次数: 9
浏览: 278540 次
来自: 北京
多谢博主分享
图片看不成
正在学习中,看完文章了,谢谢写的教程!!!
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 setmailserverhost 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信