一、目标
用java代码实现发送带附件email的功能
二、学习地址
三、前期准备:
增加jar包:javamail1_4_5.zip
四、代码
public class SendMailService {
private MailInformation mailInfor;
private static SendMailService sendMailService;
public void setMailInfor(MailInformation mailInfor) {
this.mailInfor = mailInfor;
}
public static SendMailService getService() {
if (sendMailService == null) {
sendMailService = new SendMailService();
}
return sendMailService;
}
/**
* 此段代码用来发送普通带附件电子邮件
*/
public void send() throws Exception {
try {
Properties props = new Properties(); // 获取系统环境
Authenticator auth = new Email_Autherticator(); // 进行邮件服务器用户认证
props.put("mail.smtp.host", mailInfor.getHost());
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, auth);
// 用于在console中显示执行过程信息
session.setDebug(true);
// 设置session,和邮件服务器进行通讯。
MimeMessage message = new MimeMessage(session);
message.setSubject(mailInfor.getMail_subject()); // 设置邮件标题
message.setSentDate(new Date()); // 设置邮件发送日期
Address address = new InternetAddress(mailInfor.getSendEmail(),
mailInfor.getSendPassword());
message.setFrom(address); // 设置邮件发送者的地址
Address toAddress = new InternetAddress(mailInfor.getMail_to()); // 设置邮件接收方的地址
message.addRecipient(Message.RecipientType.TO, toAddress);// 加载收件人地址
message.setText(mailInfor.getMail_body()); // 设置邮件正文
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 设置邮件的文本内容
BodyPart contentPart = new MimeBodyPart();
contentPart.setText(mailInfor.getMail_body());
multipart.addBodyPart(contentPart);
multipart.addBodyPart(contentPart);
if (!mailInfor.getFile().isEmpty()) {// 有附件
Enumeration efile = mailInfor.getFile().elements();
while (efile.hasMoreElements()) {
contentPart = new MimeBodyPart();
String filename = efile.nextElement().toString(); // 选择出每一个附件名
FileDataSource fds = new FileDataSource(filename); // 得到数据源
contentPart.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart
// contentPart.setFileName(fds.getName());
// //得到文件名同样至入BodyPart,并解决中文名乱码问题
contentPart.setFileName(MimeUtility.encodeText(fds
.getName()));
multipart.addBodyPart(contentPart);
}
mailInfor.getFile().removeAllElements();
}
// 将multipart对象放到message中
message.setContent(multipart, "text/html;charset=gb2312"); // Multipart加入到信件
// 保存邮件
message.saveChanges();
Transport.send(message); // 发送邮件
System.out.println("send ok!");
} catch (Exception ex) {
ex.printStackTrace();
throw new Exception(ex.getMessage());
}
}
/**
* 用来进行服务器对用户的认证
*/
class Email_Autherticator extends Authenticator {
public Email_Autherticator() {
super();
}
Email_Autherticator(String user, String pwd) {
super();
mailInfor.setSendEmail(user);
mailInfor.setSendPassword(pwd);
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mailInfor.getSendEmail(),
mailInfor.getSendPassword());
}
}
}
javaBean
public class MailInformation {
// 发送邮件的邮箱地址服务器
private String host;
// 这个是你的邮箱用户名以及邮件显示发送者邮箱
private String sendEmail ;
// 你的邮箱密码
private String sendPassword ;
//邮件发送者显示姓名
private String sendName ;
//待接收的邮箱
private String mail_to ;
//邮件标题
private String mail_subject;
//邮件内容
private String mail_body ;
//用于保存发送附件的文件名的集合
private Vector file ;
/**
* 建立发邮件实体时传入发件人的email信息
* @param sendEmail email地址
* @param sendPassword email密码
* @param sendName 发送邮件中显示发件人姓名
*/
public MailInformation(String sendEmail,String sendPassword,String sendName){
this.sendEmail = sendEmail;
this.sendPassword = sendPassword;
this.sendName = sendName;
}
/**
* 163邮箱的host
*/
public void set163Host(){
host = "smtp.163.com";
}
/**
* 126邮箱的host
*/
public void set126Host(){
host = "smtp.126.com";
}
/**
* qq邮箱的host
*/
public void setQQHost(){
host = "smtp.qq.com";
}
/**
* 雅虎邮箱的host
*/
public void setYahooHost(){
host = "smtp.mail.yahoo.com.cn ";
}
/**
* 获得发送邮件的邮箱地址服务器
* @return 地址服务器
*/
public String getHost() {
return host;
}
/**
* 设置发送邮件的邮箱地址服务器
* @param host
*/
public void setHost(String host) {
this.host = host;
}
/**
* 设置发件人的email
* @param sendEmail email
*/
public void setSendEmail(String sendEmail) {
this.sendEmail = sendEmail;
}
/**
* 得到发件人的email
* @return sendEmail email
*/
public String getSendEmail() {
return sendEmail ;
}
/**
* 设置发件人的email密码
* @param sendPassword 密码
*/
public void setSendPassword(String sendPassword) {
this.sendPassword = sendPassword;
}
/**
* 得到发件人的email密码
* @return sendPassword 密码
*/
public String getSendPassword() {
return sendPassword ;
}
/**
* 得到邮件中显示的发件人姓名
* @return 发件人姓名
*/
public String getSendName() {
return sendName;
}
/**
* 设置邮件中显示的发件人姓名
* @param sendName 发件人姓名
*/
public void setSendName(String sendName) {
this.sendName = sendName;
}
/**
* 得到收件人email
* @return 收件人email
*/
public String getMail_to() {
return mail_to;
}
/**
* 设置收件人email
* @param mail_to 收件人email
*/
public void setMail_to(String mail_to) {
this.mail_to = mail_to;
}
/**
* 邮件标题
* @return 邮件标题
*/
public String getMail_subject() {
return mail_subject;
}
/**
* 设置邮件标题
* @param mail_subject 邮件标题
*/
public void setMail_subject(String mail_subject) {
this.mail_subject = mail_subject;
}
/**
* 得到邮件内容
* @return 邮件内容
*/
public String getMail_body() {
return mail_body;
}
/**
* 设置邮件内容
* @param mail_body 邮件内容
*/
public void setMail_body(String mail_body) {
this.mail_body = mail_body;
}
/**
* 得到附件所在的绝对路径
* @return 绝对路径
*/
public Vector getFile() {
return file;
}
/**
* 天剑附件所在的绝对路径
* @return 绝对路径
*/
public void setFile(Vector file) {
this.file = file;
}
}
五、调用方式
public static void main(String[] args) {
SendMailService sendmail = SendMailService.getService();
MailInformation mailInformation = new MailInformation(
"发件人email", "发件人email密码", "发件人显示姓名");
mailInformation.set163Host();
mailInformation.setMail_subject("测试发送邮件");
mailInformation.setMail_body("这是一封测试是否能够发送带附件邮件的信");
mailInformation.setMail_to("收件人email");
Vector fileStr = new Vector();
fileStr.add("附件地址绝对路径");
mailInformation.setFile(fileStr);
sendmail.setMailInfor(mailInformation);
try {
sendmail.send();
} catch (Exception ex) {
ex.printStackTrace();
}
}
六、问题解决
1、发送邮件的邮箱地址服务器
需要搜索得到发件人邮箱的 SMTP服务器地址,比如126的:http://help.163.com/09/0219/10/52GOPOND007536NI.html
2、中文名附件乱码解决
解决地址:http://ben-sin.iteye.com/blog/387536
方法:contentPart.setFileName(MimeUtility.encodeText(fds.getName()));