一、发送邮件
发送邮件分为三步骤:1,创建Session会话 2,创建邮件对象 3,发送
邮件发送首先需要准备好登录信息,SMTP服务器连接信息,并创建Session会话。为便于重复使用,将其封装成一个工具类。
将SMTP服务器连接信息封装成Properties对象,使用props.put()添加相关信息。
public final class JavaMailutils {
private JavaMailutils() {//将构造方法设置为私有,意味着无法从除自身之外的任何类访问它
}
public static Session createSession() {
//邮箱账号信息
String userName="aaa@163.com";//邮箱发送账号
String password=" ";//账号授权密码
//SMTP服务器连接信息
Properties props=new Properties();
props.put("mail.smtp.host", "smtp.163.com");//SMTP主机名
props.put("mail.smtp.port", "25");//主机端口号
props.put("mail.smtp.auth", "true");//是否需要用户验证
props.put("mail.smtp.starttls.enable", "true");//启用TLS加密
//创建Sessio会话
Session session=Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,password);
}
});
session.setDebug(true);//设置debug模式方便调试
return session;
}
}
1.发送普通邮件
在创建好session对象后,创建一个邮件message对象,并设置邮件相关内容然后调用Transport.send(message)即可成功发送。
//测试正文内容邮件
public class Demo02 {
public static void main(String[] args) {
try {
//1.创建Session会话
Session session=JavaMailutils.createSession();
//2.创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setSubject("这是一封测试邮件");//设置邮件标题
message.setText("邮件内容");//设置邮件内容
message.setFrom(new InternetAddress("aaa@163.com"));//发件人
//收件人
message.setRecipient(RecipientType.TO, new InternetAddress("bbb@qq.com"));
//3.发送
Transport.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、发送可抄送邮件
想要发送可抄送邮件,需要调用message.addRecipients()方法设置抄送人地址。抄送邮件可发送给多人,收件人地址以数组形式接收。
message.addRecipients(RecipientType.CC,
new InternetAddress[] {new InternetAddress("sss@qq.com")});//抄送
3、发送HTML标签邮件
部份邮件正文内容包含html标签,发送html标签邮件需要在设置正文内容时写入标签以及相关参数
message.setText("<b>太阳</b>当空照","utf-8","html");
二、发送附件邮件
发送附件邮件时不能再直接调用setText方法,而是通过调用setContent方法,将正文+附件组装成multipart对象进行发送。
//包含附件邮件
public class Demo04 {
public static void main(String[] args) {
try {
//创建session会话
Session session=JavaMailutils.createSession();
//创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setFrom(new InternetAddress("aaa@163.com"));//发件人
message.setRecipient(RecipientType.TO, new
InternetAddress("bbb@qq.com"));//收件人
message.addRecipients(RecipientType.CC,new InternetAddress[] {new
InternetAddress("sss@qq.com")});//抄送
message.setSubject("包含附件邮件");//邮件标题
//邮件既包含正文又包括附件
//正文
BodyPart textPart=new MimeBodyPart();
textPart.setContent("附件邮件","text/html;charset=utf-8");
//附件
BodyPart filePart=new MimeBodyPart();
filePart.setFileName("叮当猫");//附件文件显示名称
filePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\y\\test\\3.jpg"))
,"application/octet-stream")));
//将正文+附件组装成multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
//将multipart对象放入邮件
message.setContent(multipart);
//3.发送邮件
Transport.send(message);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
附件邮件包含正文和附件两部分,可用BodyPart对象分别设置。setContent()决定添加的内容。
setFileName()方法可设置附件显示名称,setDataHandler()设置附件数据,参数一是文件输入流,参数二是附件类型。二进制文件使用application/octet-stream。然后将正文+附件组装成multipart对象,调用message.setContent(multipart)将multipart对象放入邮件,最后调用Transport.send(message)发送。
三、发送正文嵌套图片邮件
//正文嵌套图片
public class Demo05 {
public static void main(String[] args) {
try {
//创建session会话
Session session=JavaMailutils.createSession();
//创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setFrom(new InternetAddress("aaa@163.com"));//发件人
message.setRecipient(RecipientType.TO, new InternetAddress("bbb@qq.com"));//收件人
message.addRecipients(RecipientType.CC,new InternetAddress[] {new InternetAddress("sss@qq.com")});//抄送
message.setSubject("正文嵌套图片邮件");//邮件标题
//邮件既包含正文又包括附件
//正文
BodyPart textPart=new MimeBodyPart();
StringBuilder contentText=new StringBuilder();
contentText.append("<h3>叮当猫</h3>");
contentText.append("<p>小叮当的故事</p>");
contentText.append("<img src=\"cid:xdd\"/>");
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
//附件
BodyPart imagePart=new MimeBodyPart();
imagePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\y\\test\\3.jpg"))
,"application/octet-stream")));
imagePart.setHeader("content-ID", "xdd");//图片的内容ID
//将正文+附件组装成multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
//将multipart对象放入邮件
message.setContent(multipart);
//3.发送邮件
Transport.send(message);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
发送正文嵌套图片的邮件与发送附件邮件不同的是,正文部分需要使用StringBuilder将正文文本和图片进行拼接,然后调用setContent()方法添加进正文。图片依然使用附件形式,但要调用 imagePart.setHeader("content-ID", "xdd")添加图片ID便于在正文中使用contentText.append("<img src=\"cid:xdd\"/>")将图片添加进正文。然后同样调用Transport.send(message)发送邮件。