- 浏览: 682850 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yzs5273:
没什么用。都试过了
WIN7下CS不能全屏的解决方法 -
di1984HIT:
不错,学习了
读取本地计算机中的安装程序列表 -
ffedu:
[flash=200,200][url][img][list] ...
linux/unix中如何用find命令详解,非常详细的介绍,比man find强100倍(转) -
lintghi:
...
Log4j使用相对路径指定log文件及使用总结 -
nick.s.ni:
唉,Java中引用的包没有介绍啊,如果数据库用UTF-8的格式 ...
Oracle 中Java 对象与PL/SQL类型的映射及使用(转)
JavaMail是Sun发布的处理电子邮件的应用程序接口,它预置了一些最常用的邮件传送协议的实现方法,并且提供了很容易的方法去调用它们。JavaMail是Sun发布的应用程序接口,所以目前它还没有被JDK包含。因此你需要从Sun的官方网站上下载到JavaMail类文件包。除此之外还需要Sun的JAF(JavaBeans Activation Framework ),否则JavaMail将不能运行。
核心JavaMail API 由七个类组成:Session 、Message 、Address 、Authenticator 、Transport 、Store 及 Folder ,它们都来自javax.mail 、即JavaMail API 顶级包。可以用这些类完成大量常见的电子邮件任务,包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML文件格式的消息以及搜索或过滤邮件列表。有关JavaMail 的更多信息,请参考JavaMail 指南。
JavaMail的基础知识
使用JavaMail是发送电子邮件所需要的组件 。
JavaMail的机构使处理电子邮件非常容易。下面列出了一些我们需要的类:
1.Properties
JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机,如:
Properties props = new Properties ();
props.put("mail.smtp.host", "smtp.sina.com"); // 可以换上你的smtp主机名。
props.put("mail.smtp.auth", "true"); // 身份验证,目前免费邮件服务器都需要这一项
2.Session
这个Session类代表JavaMail中的一个邮件会话。每一个基于JavaMail的应用程序至少有一个Session(可以有任意多的Session)。在这个例子中,Session对象需要知道用来处理邮件的SMTP服务器。为了做到这一点,你可以参照下面的例子用Properties 来创建一个Session 对象
Session session = Session.getDefaultInstance(props, null);
3.Transport
邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和 Store。 Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。Store的用法请参看Sun的JavaMail文档。
用法:Transport transport = session.getTransport("smtp");
用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将为我们省了很多时间。因为JavaMail已经内置了很多协议的实现方法。
注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3。
4.Message
Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
使用方法是:Message message = new MimeMessage(session);
邮件乱码问题:
JavaMail中的邮件主题需要进行BASE64编码,格式形如:=?GBK?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=
所以,直接使用message.setSubject("中文主题"),或者message.setSubject("中文主题".getBytes ("ISO-8859-1"), "GBK"))都一样会出现乱码。在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
msg.setSubject("=?GBK?B?"+enc.encode(subject.getBytes())+"?=");
邮件发送源码:
SendMail.java
package com.lzw.mail;
import java.util.Arrays;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import com.lzw.io.Out;
/**
* 邮件发送程序
* @author 李赵伟 Create: 2007-12-19
*/
public class SendMail {
private Session session; //会话
private Transport transport; //发送邮件
private User user; //邮件相关的帐户信息
private MailAddress mailAddress; //收件人地址
private MailBody mailBody; //邮件内容
private final String MAIL_SMTP_HOST = "mail.smtp.host";
private final String MAIL_SMTP_AUTH = "mail.smtp.auth";
public SendMail(User user) {
this.user = user;
init();
}
/**
* 初始化<code> Session, Transport </code>
*/
private void init() {
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user.getUsername(), user
.getPassword());
}
};
Properties props = new Properties();
// 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
props.put(MAIL_SMTP_HOST, user.getHost());
// 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
props.put(MAIL_SMTP_AUTH, "true");
// 用刚刚设置好的props对象构建一个session
session = Session.getDefaultInstance(props, auth);
try {
// 发送邮件
transport = session.getTransport("smtp");
// 连接服务器的邮箱
transport.connect(user.getHost(), user.getUsername(), user
.getPassword());
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
Out.pln("与 " + user.getHost() + " 成功建立会话");
}
/**
* 设置收件人地址
*
* @param mailAddress
*/
public void setAddress(MailAddress mailAddress) {
this.mailAddress = mailAddress;
}
/**
* 设置邮件内容
*
* @param mailBody
*/
public void setMailBody(MailBody mailBody) {
this.mailBody = mailBody;
}
/**
* 构造邮件的内容
*
* @return
* @throws AddressException
* @throws MessagingException
*/
private Message createMessage() throws AddressException, MessagingException {
// 用session为参数定义消息对象
MimeMessage message = new MimeMessage(session);
// 加载发件人地址
message.setFrom(new InternetAddress(user.getFrom()));
message.setSentDate(new Date());
// 加载收件人地址
message.addRecipients(Message.RecipientType.TO, getAddress(mailAddress
.getTo()));
if (mailAddress.isHasCC())
message.addRecipients(Message.RecipientType.CC,
getAddress(mailAddress.getCc()));
// 加载标题
message.setSubject(mailBody.getSubject());
if (mailBody.isContentFlag() || mailBody.isAffixFlag()) {
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
if (mailBody.isContentFlag()) {
// 设置邮件的文本内容
MimeBodyPart contentPart = new MimeBodyPart();
if (mailBody.isMimeContent())
contentPart.setContent(mailBody.getContent(),
"text/html;charset=GBK");
else
contentPart.setText(mailBody.getContent());
multipart.addBodyPart(contentPart);
}
if (mailBody.isAffixFlag()) {
// 添加附件
BodyPart affixBody = new MimeBodyPart();
DataSource source = new FileDataSource(mailBody.getAffix());
// 添加附件的内容
affixBody.setDataHandler(new DataHandler(source));
// 添加附件的标题这里很重要,通过下面的Base64编码的转换可以保证你的
// 中文附件标题名在发送时不会变成乱码
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String fileName = "=?GBK?B?"
+ enc.encode(mailBody.getAffixName().getBytes()) + "?=";
affixBody.setFileName(fileName);
multipart.addBodyPart(affixBody);
}
// 将multipart对象放到message中
message.setContent(multipart);
}
// 保存邮件
message.saveChanges();
return message;
}
/**
* 发送邮件,包含:邮件正文、(1个附件)
*
* @param debug
* 调试设置
*/
public void send(boolean debug) {
// 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
// 用(你可以在控制台(console)上看到发送邮件的过程)
session.setDebug(debug);
try {
Message message = createMessage();
transport.sendMessage(message, message.getAllRecipients());
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
Out.pln("\n----------------------------------------------------------");
Out.pln("- 邮件成功发送!");
Out.pln("- TO : " + Arrays.toString(mailAddress.getTo()));
if (mailAddress.isHasCC())
Out.pln("- CC : " + Arrays.toString(mailAddress.getCc()));
Out.pln("----------------------------------------------------------\n");
}
/**
* 关闭资源
*
* @throws MessagingException
*/
public void close() throws MessagingException {
if (null != transport)
transport.close();
}
public Address[] getAddress(String[] address) throws AddressException {
Address[] addrs = new InternetAddress[address.length];
for (int i = 0; i < address.length; i++)
addrs[i] = new InternetAddress(address[i]);
return addrs;
}
/**
* 测试
*/
public static void main(String[] args) {
String host = "smtp.sina.com";
String username = "";
String password = "";
// String from = "";
String to = "";
// String cc = null;
String subject = "测试";
String content = "<a href=http://www.baidu.com>baidu</a>";
boolean mimeContent = true;
String affix = "d:/temp/temp.txt";
String affixName = "temp.txt";
boolean debug = false;
// String userFile = "user.properties";
// String addressFile = "mailaddress.properties";
SendMail mail = null;
try {
try {
User user = new User(host, username, password);
MailAddress mailAddress = new MailAddress(to);
// User user = new User(userFile);
// MailAddress mailAddress = new MailAddress(SendMail.class
// .getResourceAsStream(addressFile));
MailBody mailBody = new MailBody(subject, content, mimeContent,
affix, affixName);
mail = new SendMail(user);
// for (int i = 0; i < 5; i++) {
// 设置发件人地址、收件人地址和邮件标题
mail.setAddress(mailAddress);
// 设置要发送附件的位置和标题
mail.setMailBody(mailBody);
// 设置smtp服务器以及邮箱的帐号和密码
mail.send(debug);
// try {
// Thread.sleep(1 * 1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// mailBody = new MailBody(subject + "_" + (i + 1), content);
// }
} finally {
if (null != mail)
mail.close();
}
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
}
}
}
使用JavaMail发送邮件需要注意的地方:
使用免费的邮件服务器发送邮件时,需要对用户的身份做验证;而进行身份验证的过程又比较消耗时间,当用户需要发送多封邮件时如果每次都做身份验证的话时间的消耗是非常大的;
在整个邮件发送过程中Session(会话)的建立只需要一次,也就是说身份验证也只做一次就可以了,即Session session = Session. getDefaultInstance(props, auth);
发送邮件的过程相对比较简单,有一个需要注意的地方就是连接邮件服务器时transport.connect(user.getHost(), user.getUsername(), user.getPassword());也只需要执行一次即可,这个过程和身份验证一样都需要消耗大量时间。
该程序只允许发送带有一个附件的邮件
发表评论
-
Transfer
2017-06-29 23:03 0Find connections count: ... -
Discover the Mystery of Metaspace
2017-06-23 16:47 0The JDK 8 HotSpot JVM is now u ... -
Command Line JMX Client
2014-12-29 13:12 2562Command Line Parser: GNUComman ... -
Something about JVM class loading and initialization
2014-05-09 10:04 992Class loading stages: Loadin ... -
When a class is loaded and initialized in JVM - Java
2014-05-08 19:09 941from: http://javarevisited.blo ... -
【深入Java虚拟机】之四:类加载机制
2014-05-08 15:12 851转载请注明出处:http://blog.csdn.net/n ... -
Java Reflection - Dynamic Class Loading and Reloading
2014-05-08 12:04 890From: http://tutorials.jenkov. ... -
Java 类加载与初始化
2014-02-19 19:12 769转载自:http://www.cnblogs.c ... -
javax.management.StandardMBean: When and Why. (Reposted)
2013-12-26 15:34 1042Q: When is a Standard MBean no ... -
JVM调优的"标准参数"的各种陷阱(转)
2013-11-11 19:55 1971From: http://hllvm.group.itey ... -
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
2013-11-11 11:05 956(From: http://www.oracle.com/ ... -
An article about TLAB
2013-11-11 10:57 721(From: https://blogs.oracle.co ... -
【JVM】HotSpot JVM内存管理和GC策略总结(转)
2013-11-07 23:39 547JVM的相关知识是学习java高级特性必须要去深入学习的。平 ... -
jstat分析VM内存
2013-11-07 16:41 858Jstat 是JDK自带的一个轻量级小工具。全称“Java ... -
java的GridBagLayout网格包布局管理器使用详解 (转)
2013-11-01 16:44 0网格包布局管理是最复 ... -
java动态跟踪分析工具BTrace实现原理
2013-09-01 12:34 1223转自:http://kenwublog.com ... -
Java synchronize用法(转)
2012-11-05 00:20 1169在多个并发线程之间共用资源,就需要进行同步处理。Java虚拟机 ... -
Interview material collection
2012-07-09 23:05 11551. Why can't static methods be ... -
不要重复 DAO!(转)
2011-12-29 22:17 1199使用 Hibernate 和 Spri ... -
JVM 诊断工具(转)
2011-11-25 12:00 17191.jinfo 描述:输出给定 java 进程所有的配置信 ...
相关推荐
利用JavaMail发送邮件的实例,可以直接运行
该资源是一个javamail发送邮件的例子,里面集成了别人的文件发送的功能,单次发送邮件只能上传一个附件。是一个测试方法,拿过来改一改邮件的地址和密码就可以使用了
直接eclipse里面运行 里面有详细包 不懂问我Q 397764284
javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码 查看debug 邮件处理过程发现邮件头没有编译, 内容是base64编码,所以邮箱收不到或者收到的是base64编码后的一堆乱码,
里面详细的介绍了JavaMail发邮件(包括单个附件和多个附件)的机制,还有JavaMail正常使用所需要的JAR包,源程序例子经过本人详细且严格的测试,大家下载下来就可以直接使用啦。
javamail发送邮件,带附件。发邮件可以看看。
此源码是使用javamail发送邮件,可以实现静默发送邮件,可以发送附件资源等。有相应的使用说明,快捷好用
用JAVAMAIL发邮件(含附件),. TXT用JAVAMAIL发邮件(含附件),.TXT
介绍了如何利用javamail实现带附件的邮件发送,附有代码
JavaMail邮件发送(带附件)
基于javamail1.4实现邮件发送,支持多收件人、抄送人、多附件等
JavaMail实现邮件发送的简单封装(包括文本、图片、html、附件) 详见http://blog.csdn.net/lyisray/article/details/42002215
配置好用户名密码以及SMTP服务器就可以直接运行。已包含相关jar
本人最新写了一个邮件收发的例子,可以处理中文的 包括发送附件,附件标题也可以是中文的,可以给大 家参考下!希望能给大家一些帮助!
06 使用JavaMail发送带附件的邮件.exe06 使用JavaMail发送带附件的邮件.exe
javamail 自动发送邮件 发送html格式邮件 发送带有附件的邮件
javaMail 用附件路径,文件流 byte[] 或 base64 字符串 实现发送附件功能
JavaMail实现邮件发送功能,可发送、抄送、密送多人,支持多附件的发送。配置相关参数后可直接调用发送邮件
页面使用ajax上传文件,Java端采用file.Transto 来保存上传的文件,支持发送正文文本,图片,附件;图片作为附件发送,如需求图片糅合在正文文本中,只需在代码中稍加改动,有注释。
纯java发送简单邮件的功能,支持嘱性文件的配置,可配多人接收,多个附件,简单。。。