需要jar包:activation.jar和mail.jar
都是来自网上。
我首先在src下建了一个properties文件,存放信息,这里就不写了。
下面是一个自己封装的邮件类:
/**
* 邮件类,一个邮件对象可以看作一封邮件
* 可以有多个附件。
* */
public class Email {
// 发件人
private static String from ;
// smtp主机
private static String host;
//发件邮箱的用户名
private static String username;
//发件邮箱的密码
private static String password;
// smtp主机端口
private static String port;
private static MyAuthenticator myAuthenticator =null;
private BodyPart mbpContent = null;
private MimeMessage msg = null;
private Multipart mp = null;
/*
* 读取配置文件,初始化参数
* */
static{
Reader r = null;
try {
r = new FileReader(new File("src/mail.properties"));
Properties p = new Properties();
p.load(r);
from = p.getProperty("from");
host = p.getProperty("host");
username = p.getProperty("username");
password = p.getProperty("password");
port = p.getProperty("port");
myAuthenticator = new MyAuthenticator(username,password);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(r != null)
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 构造方法,
* 根据props构建session
* 根据session构建MimeMessage对象,
* 创建MimeMultipart对象,并将其加入到MimeMessage对象中
* 创建BodyPart邮件正文,并将其加入到MimeMultipart对象中
* 设置发送者 和 时间
* */
public Email(){
Properties props = new Properties();;
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port);
Session session = Session.getDefaultInstance(props,myAuthenticator);
msg = new MimeMessage(session);
mp = new MimeMultipart();
mbpContent = new MimeBodyPart();
try {
msg.setFrom(new InternetAddress(from));
msg.setContent(mp);
mp.addBodyPart(mbpContent);
msg.setSentDate(new Date());
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置邮件主题
* @param subject 邮件主题
* */
public void setSubject(String subject){
try {
//解决中文乱码
subject = MimeUtility.encodeText(subject);
msg.setSubject(subject);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置接受者
* @param receiveUser 接受者地址
* */
public void setReceiveUser(String receiveUser){
try {
InternetAddress[] address ={ new InternetAddress(receiveUser)};
msg.setRecipients(Message.RecipientType.TO, address);
}catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置邮件正文。
* @param content 邮件正文内容
* */
public void setContent(String content){
try {
mbpContent.setText(content);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 添加邮件附件,可以添加对个附件。
* @param affix 附件的地址
* @param affixName 附件的名字
* */
public void addFile(String affix,String affixName){
BodyPart messageBodyPart= new MimeBodyPart();
DataSource source = new FileDataSource(affix);
try {
messageBodyPart.setDataHandler(new DataHandler(source));
//解决附件的中文乱码
try {
affixName = MimeUtility.encodeText(affixName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
messageBodyPart.setFileName(affixName);
mp.addBodyPart(messageBodyPart);
} catch (MessagingException e1) {
e1.printStackTrace();
}
}
/**
* 发生邮件,利用工具类Transport实现
*/
public boolean sendMail() {
try {
Transport.send(msg);
} catch (MessagingException e) {
return false;
}
return true;
}
}
/**
* 继承至Authenticator
* 用于对邮件发送时的授权和验证
* */
class MyAuthenticator extends Authenticator{
private String username;
private String password;
public MyAuthenticator(String username, String password) {
super();
this.username = username;
this.password = password;
}
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username, password);
}
}
JAVA邮件发送的大致过程是这样的的:
1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。
2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。
3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。
4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。
5、使用javax.mail.Transport工具类发送邮件。
MimeMessage-----------相当于一个邮件,可以设置发件人,收件人啦等。
MimeMultipart-------------相当于邮件的正文和邮件的集合。邮件的正文和附件看是同样的东西。
MimeBodyPart-----------邮件的正文或附件。
Transport---------工具类,负责发送邮件。
javamail中BodyPart的setText与setContent的区别;
setContent可以指定发送内容的格式,如:html,plain等,
setText只发送纯文本格式的数据
注意:在设置html时,setContent(htmlString,"text/html;charset=\"utf-8\"");记得加上字符编码.
若邮件正文是为html,且其中有图片等元素。
需要mimeMuilpart.setSubType("related")
mixed--------范围最大,可加文字或超文本,内嵌资源,附件
related--------可加文字或超文本,内嵌资源
alternative-----可加文字或超文本
bodypart.setContendID();<img src="cid:"/>---------------不会将图片以附件的形式显示出来,若不写,<img src="filename"/>,亦可以达到效果,但内嵌资源会以附件的形式在邮件里显示。