1.Java Mail发送邮件
首先,将邮件统一发送给邮件的中转代理,然后由中转代理发送至邮件服务器,等待用户查阅。
在由用户发送至邮件中转的代理的过程中使用到的是应用层的smtp协议。
在发送邮件前需要准备相关的邮箱和登录信息
QQ邮箱 SMTP服务器:smtp.qq.com 端口号:465、587
163邮箱 SMTP服务器:smtp.163.com 端口号:465
在准备好登录信息后需要导入相关jar包
设置邮件账号信息,登录名及密码(密码使用的是邮箱允许smtp和pop3协议开启时生成的密码)
在连接SMTP服务器时要准备Properties对象传入相关的信息
//邮箱账号信息
String userName="18392746299@163.com";
String password="PSLFGBHARLGZSRBT";
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加密
获取Session实例传入实例并传入相关信息及Authenticator对象,返回用户名和密码。
//参数1:smtp服务器连接参数
//参数2:账号和密码的授权认证对象
Session session=Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
发送邮件:创建Session会话并创建邮件对象,向邮件对象中传入session对象,设置邮件的标题、正文、发件人和收件人,最后发送邮件。
Session session=JavaMailUtils.createSession();
MimeMessage message=new MimeMessage(session);
message.setSubject("这是一个测试邮件");//设置邮件标题
message.setText("啦啦啦啦啦!!!");//设置邮件正文
message.setFrom(new InternetAddress("18392746299@163.com"));//发送人
message.setRecipient(RecipientType.TO,new InternetAddress("3460888610@qq.com"));//接收人
Transport.send(message);
2. 发送只包含文本信息的邮件
将发送邮件前的相关准备工作封装成一个JavaMailUtils类
public class JavaMailUtils {
private JavaMailUtils() {
}
public static Session createSession() {
//邮箱账号信息
String userName="18392746299@163.com";
String password="PSLFGBHARLGZSRBT";
//SMTP服务器连接信息
Properties props=new Properties();
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
//参数1:smtp服务器连接参数
//参数2:账号和密码的授权认证对象
Session session=Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
return session;
}
调用该类创建Session对象,并创建邮件对象,设置邮件的相关信息。
message.setRecipient();表示收件人
message.setRecipients();表示抄送人
try {
Session session=JavaMailUtils.createSession();
//创建邮件对象
MimeMessage message=new MimeMessage(session);
message.setSubject("这是一个测试邮件");//设置邮件标题
message.setText("啦啦啦啦啦!!!");//设置邮件正文
message.setFrom();//发送人
message.setRecipient(RecipientType.TO,new InternetAddress("3460888610@qq.com"));//接收人
//发送
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
3.发送包含附件的邮件
创建MimeBodyPart对象,并向该对象中写入正文的内容,创建另一个对象,向该对象中传入要上传的附件的内容(通过流的方式传入),设置附件的名称。创建MimeMultiPart对象,将正文和附件加入该对象,然后将该对象放入邮箱对象中,发送邮件。
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("F:\\猿究院学习资料\\test\\风景.jpg")),"application/octet-stream")
));
//将正文和附件放入Multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
//将Multipart放入邮件
message.setContent(multipart);
Transport.send(message);
3.发送正文中包含图片的邮件
与发送包含附件的方式大致相同,不同点在于在正文内容中要田间图片的信息,在图片对象部分要设置Header以便于在正文内容部分加入。
BodyPart textPart=new MimeBodyPart();
StringBuilder contentText=new StringBuilder();
contentText.append("aaaaaaa");
contentText.append("b");
contentText.append("<img src=\"cid:abc\"/>");
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
//邮件附件
BodyPart imagePart=new MimeBodyPart();
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(Files.readAllBytes(Paths.get("F:\\猿究院学习资料\\test\\风景.jpg")),
"application/octet-stream")));
imagePart.setHeader("Content-ID", "abc");//图片内容的ID
//邮件正文+附件
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
message.setContent(multipart);
//发送邮件
Transport.send(message);
在邮件的正文部分还可以使用html标签,但需要加上以下语句,否则将无法识别。
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
总结:发送的邮件若只包含正文文字则只需要Message对象,若还包含附件或图片就需要借助MimeBodyPart和MimeMultiPart对象。