上一篇博文的补充,邮件中添加了附件
步骤和上一篇中相同,只是采用Multipart类的对象来添加邮件的内容和附件,并且设置文件名时要注意:MimeUtility.encodeWord可以避免文件名乱码,只改动了部分代码,但大致流程相同,具体代码如下,已亲测。
package com.controller;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.AuthenticationFailedException;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/**
* 发送邮件的主类
*/
public class SendMail {
//发送邮件的props文件
private final transient Properties props=System.getProperties();
//邮件服务器登录验证
private transient MailAuthenticator authenticator;
//邮箱session
private transient Session session;
/**
* 初始化发送邮件
* @param smtpHostName邮件服务器地址
* @param username发送邮件的用户名
* @param password密码
*/
public SendMail(final String smtpHostName,final String username,final String password){
init(username,password,smtpHostName);
}
/**
* 初始化发送邮件
* @param username 发送邮件的用户名
* @param password 密码
*/
public SendMail(final String username,final String password){
//通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
final String smtpHostName="smtp."+username.split("@")[1];
init(username,password,smtpHostName);
}
/**
*
* 初始化
* @param username 发送邮件的用户名
* @param password 密码
* @param smtpHostName SMTP主机地址
*/
private void init(String username, String password, String smtpHostName) {
//初始化props
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", smtpHostName);
//验证
authenticator=new MailAuthenticator(username,password);
//创建session
session=Session.getInstance(props,authenticator);
}
/**
* 发送邮件
* @param recipient收件人邮箱地址
* @param subject邮件主题
* @param content邮件内容
* @param attachment邮件附件
* @throws MessagingException
* @throws AddressException
*/
public void send(String recipient,String subject,String content,File attachment) throws AddressException, MessagingException{
try {
//创建mime类型的邮件
final MimeMessage message=new MimeMessage(session);
//设置发信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
//设置主题
message.setSubject(subject);
//添加邮件的文本内容和附件
Multipart multipart=new MimeMultipart();
//添加邮件正文
BodyPart contentPart=new MimeBodyPart();
contentPart.setContent(content,"text/html;charset=utf-8");
multipart.addBodyPart(contentPart);
//添加附件
if(attachment!=null){
BodyPart attachmentBodyPart=new MimeBodyPart();
DataSource ds=new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(ds));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//将multipart对象放到message中
message.setContent(multipart);
//保存邮件
message.saveChanges();
//发送
Transport.send(message,message.getRecipients(RecipientType.TO));
//System.out.println("邮件发送成功!");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 群发邮件
* @param recipients 收件人们
* @param subject 主题
* @param content 内容
* @throws AddressException
* @throws MessagingException
*/
public void send(List<String> recipients,String subject,String content,File attachment) throws AddressException, MessagingException{
try {
//创建mime类型的邮件
final MimeMessage message=new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//设置收件人们
InternetAddress[] addresses=new InternetAddress[recipients.size()];
for(int i=0;i<recipients.size();i++){
addresses[i]=new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO,addresses);
//设置主题
message.setSubject(subject);
//添加邮件的文本内容和附件
Multipart multipart=new MimeMultipart();
//添加邮件正文
BodyPart contentPart=new MimeBodyPart();
contentPart.setContent(content,"text/html;charset=utf-8");
multipart.addBodyPart(contentPart);
//添加附件
if(attachment!=null){
BodyPart attachmentBodyPart=new MimeBodyPart();
DataSource ds=new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(ds));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//将multipart对象放到message中
message.setContent(multipart);
//保存邮件
message.saveChanges();
//发送
Transport.send(message);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws AddressException, MessagingException,AuthenticationFailedException{
//发件人的地址和密码
SendMail sm=new SendMail("发件人邮箱","发件人密码");
//附件
File file=new File("附件位置");
//多个收件人地址、邮件主题、邮件内容
List<String> list=new ArrayList<String>();
list.add("收件人地址 ");
list.add(" ");
list.add(" ");
sm.send(list, "来自电脑的邮件", "嘿嘿,猜猜我是谁?",file);
}
}