先介绍不带附件的邮件 但是带图片和文本
思路:
1.文本和图片封装在 MimeBodyPart中(图片需要进行数据处理)
2.最后将 MimeBodyPart加入到MimeMultipart中此时需要通过MimeMultipart的setSubType()方法设置类型为mixed/related/alternative设置,再将MimeMultipart加入Message中保存进行发送
(图片来自B站狂神说JAVA)
示例代码如下:
public static void main(String[] args) throws MessagingException, GeneralSecurityException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");//设置QQ登陆
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
//关于QQ邮箱 还要设置SSL加密 加上以下代码即可 仅QQ需要 其他邮箱不需要
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用Java Mail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//创建定义整个应用程序所需的环境变量信息的Session对象
//QQ才有 其他邮箱不需要
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("654736673","soqdiresshiqbaj3i");
}
});
//开启Session的debug模式 这样就可以看到程序发送Email 的运行状态
session.setDebug(true);//默认为false
//2.通过session得到trans port对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连接上邮件服务器
try {
ts.connect("smtp.qq.com","[email protected]","soqdiresshiqbaj3i");
} catch (MessagingException e) {
e.printStackTrace();
}
//4.创建邮箱
//创建邮箱对象
MimeMessage message = new MimeMessage(session);
//指定邮箱发件人
message.setFrom(new InternetAddress("[email protected]"));
//指定邮箱收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));//写的自己邮箱 就是自己给自己发
//邮件标题
message.setSubject("用Java发送带图片的邮件");
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));
image.setDataHandler(dh);
image.setContentID("bz.jpg");
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");//这里的cid指的是ContentID的图片标识
//描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//将封装好的数据保存到 Message中
message.setContent(mm);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
带附件 和图片,文本的邮件
思路
1.先将图片和正文准备好
2.将图片和正文拼接在一起组成 MimeMultipart,因为还要与组件拼接,再将拼接好的 MimeMultipart封装在MimeBodyPart当中
3.将附件与组装好的图片文本再次进行拼接成 MimeMultipart
4.保存到message中进行发送
示例代码:
public static void main(String[] args) throws MessagingException, GeneralSecurityException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");//设置QQ登陆
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
//关于QQ邮箱 还要设置SSL加密 加上以下代码即可 仅QQ需要 其他邮箱不需要
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用Java Mail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//创建定义整个应用程序所需的环境变量信息的Session对象
//QQ才有 其他邮箱不需要
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("654736673","soqdiresshiqbaj3i");
}
});
//开启Session的debug模式 这样就可以看到程序发送Email 的运行状态
session.setDebug(true);//默认为false
//2.通过session得到trans port对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连接上邮件服务器
try {
ts.connect("smtp.qq.com","[email protected]","soqdiresshiqbaj3i");
} catch (MessagingException e) {
e.printStackTrace();
}
//4.创建邮箱
//创建邮箱对象
MimeMessage message = new MimeMessage(session);
//指定邮箱发件人
message.setFrom(new InternetAddress("[email protected]"));
//指定邮箱收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));//写的自己邮箱 就是自己给自己发
//邮件标题
message.setSubject("用Java发送带图片的邮件");
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));
image.setDataHandler(dh);
image.setContentID("bz.jpg");
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");
//描述数据关系 1拼装邮件正文内容
MimeMultipart mm1 = new MimeMultipart();
mm1.addBodyPart(text);
mm1.addBodyPart(image);
mm1.setSubType("related");//1.文本和图片内嵌成功
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mm1);
//2准备附件
MimeBodyPart fujian1 = new MimeBodyPart();
fujian1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建 DOC 文档.doc")));
fujian1.setFileName("word文本1");//附件设置名字
MimeBodyPart fujian2 = new MimeBodyPart();
fujian2.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建文本文档.txt")));
fujian2.setFileName("txt2");//附件设置名字
//3拼接附件和正文图片
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(fujian1);
allFile.addBodyPart(fujian2);
allFile.addBodyPart(contentText);
allFile.setSubType("mixed");//正文和附件都在邮件中
//将封装好的数据保存到 Message中
message.setContent(allFile);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
阶段学习后 可用以Web注册等业务
示例:
public class SendMail extends Thread {
//用于给用户发送的邮箱
private String from = "[email protected]";
//邮箱授权码
private String username = "[email protected]";
//邮箱密码 若为QQ 则为授权码
private String password = "wsnmhneeragkbbeh";
//发送邮件的服务器地址
private String host ="smtp.qq.com";
//用户信息
private User user;
public SendMail(User user){
this.user=user;
}
@Override
public void run() {
try {
Properties prop = new Properties();
prop.setProperty("mail.host",host);//设置QQ登陆
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
//关于QQ邮箱 还要设置SSL加密 加上以下代码即可 仅QQ需要 其他邮箱不需要
MailSSLSocketFactory sf = null;
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用Java Mail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//创建定义整个应用程序所需的环境变量信息的Session对象
//QQ才有 其他邮箱不需要
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
});
//开启Session的debug模式 这样就可以看到程序发送Email 的运行状态
session.setDebug(true);//默认为false
//2.通过session得到trans port对象
Transport ts = null;
ts = session.getTransport();
//3.使用邮箱的用户名和授权码连接上邮件服务器
ts.connect("smtp.qq.com",username,password);
//4.创建邮箱
//创建邮箱对象
MimeMessage message = new MimeMessage(session);
//指定邮箱发件人
message.setFrom(new InternetAddress(from));
//指定邮箱收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//写的自己邮箱 就是自己给自己发
//邮件标题
message.setSubject("用Java发送带图片的邮件");
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));
image.setDataHandler(dh);
image.setContentID("bz.jpg");
//准备正文数据
String info ="恭喜您注册成功,你的账号为:"+user.getUsername()+",密码为:"+user.getPassword()+"为了您的信息安全,请您妥善保管" ;
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");
//描述数据关系 1拼装邮件正文内容
MimeMultipart mm1 = new MimeMultipart();
mm1.addBodyPart(text);
mm1.addBodyPart(image);
mm1.setSubType("related");//1.文本和图片内嵌成功
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mm1);
//2准备附件
MimeBodyPart fujian1 = new MimeBodyPart();
fujian1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建 DOC 文档.doc")));
fujian1.setFileName("word文本1");//附件设置名字
MimeBodyPart fujian2 = new MimeBodyPart();
fujian2.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建文本文档.txt")));
fujian2.setFileName("txt2");//附件设置名字
//3拼接附件和正文图片
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(fujian1);
allFile.addBodyPart(fujian2);
allFile.addBodyPart(contentText);
allFile.setSubType("mixed");//正文和附件都在邮件中
//将封装好的数据保存到 Message中
message.setContent(allFile);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}catch(Exception e) {
e.printStackTrace();
}
}}
Servlet代码如下:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理编码格式
try {
request.setCharacterEncoding("UTF-8");
//接受用户信息
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User(username,password,email);
//用户注册成功后给用户发送邮件
//使用多线程处理发送邮件,防止出现耗时和网站人数注册过多的情况
SendMail send = new SendMail(user);
//启动线程
send.start();
//重定向到成功页面 可自行考虑与前台的交互
response.sendRedirect("success.jsp");
}
catch (Exception e){
System.out.println("注册失败");
//此处进行逻辑处理即可
}
}