使用到的jar包:
- mail.jar(29th)
- activation.jar(2fmo)
Java实现纯文本邮件发送
1 package org.westos.email; 2 3 import com.sun.mail.util.MailSSLSocketFactory; 4 5 import javax.mail.*; 6 import javax.mail.internet.InternetAddress; 7 import javax.mail.internet.MimeMessage; 8 import java.security.GeneralSecurityException; 9 import java.util.Properties; 10 11 public class SendEamil { 12 public static void main(String[] args) throws MessagingException, GeneralSecurityException { 13 //创建一个配置文件并保存 14 Properties properties = new Properties(); 15 16 properties.setProperty("mail.host","smtp.qq.com"); 17 18 properties.setProperty("mail.transport.protocol","smtp"); 19 20 properties.setProperty("mail.smtp.auth","true"); 21 22 23 //QQ存在一个特性设置SSL加密 24 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 25 sf.setTrustAllHosts(true); 26 properties.put("mail.smtp.ssl.enable", "true"); 27 properties.put("mail.smtp.ssl.socketFactory", sf); 28 29 //创建一个session对象 30 Session session = Session.getDefaultInstance(properties, new Authenticator() { 31 @Override 32 protected PasswordAuthentication getPasswordAuthentication() { 33 return new PasswordAuthentication("619046217@qq.com","16位授权码"); 34 } 35 }); 36 37 //开启debug模式 38 session.setDebug(true); 39 40 //获取连接对象 41 Transport transport = session.getTransport(); 42 43 //连接服务器 44 transport.connect("smtp.qq.com","619046217@qq.com","16位授权码"); 45 46 //创建邮件对象 47 MimeMessage mimeMessage = new MimeMessage(session); 48 49 //邮件发送人 50 mimeMessage.setFrom(new InternetAddress("619046217@qq.com")); 51 52 //邮件接收人 53 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("875203654@qq.com")); 54 55 //邮件标题 56 mimeMessage.setSubject("Hello Mail"); 57 58 //邮件内容 59 mimeMessage.setContent("我的想法是把代码放进一个循环里","text/html;charset=UTF-8"); 60 61 //发送邮件 62 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); 63 64 //关闭连接 65 transport.close(); 66 } 67 }
Java实现文本图片附件复杂的邮件发送
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象
1 package org.westos.email; 2 3 import com.sun.mail.util.MailSSLSocketFactory; 4 5 import javax.activation.DataHandler; 6 import javax.activation.FileDataSource; 7 import javax.mail.*; 8 import javax.mail.internet.*; 9 import java.security.GeneralSecurityException; 10 import java.util.Properties; 11 12 public class SendComplexEmail { 13 public static void main(String[] args) throws GeneralSecurityException, MessagingException { 14 Properties prop = new Properties(); 15 prop.setProperty("mail.host", "smtp.qq.com"); 设置QQ邮件服务器 16 prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议 17 prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码 18 19 // QQ邮箱设置SSL加密 20 MailSSLSocketFactory sf = new MailSSLSocketFactory(); 21 sf.setTrustAllHosts(true); 22 prop.put("mail.smtp.ssl.enable", "true"); 23 prop.put("mail.smtp.ssl.socketFactory", sf); 24 25 //1、创建定义整个应用程序所需的环境信息的 Session 对象 26 Session session = Session.getDefaultInstance(prop, new Authenticator() { 27 @Override 28 protected PasswordAuthentication getPasswordAuthentication() { 29 //传入发件人的姓名和授权码 30 return new PasswordAuthentication("619046217@qq.com","16位授权码"); 31 } 32 }); 33 34 //2、通过session获取transport对象 35 Transport transport = session.getTransport(); 36 37 //3、通过transport对象邮箱用户名和授权码连接邮箱服务器 38 transport.connect("smtp.qq.com","619046217@qq.com","16位授权码"); 39 40 //4、创建邮件,传入session对象 41 MimeMessage mimeMessage = complexEmail(session); 42 43 //5、发送邮件 44 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); 45 46 //6、关闭连接 47 transport.close(); 48 49 50 } 51 52 public static MimeMessage complexEmail(Session session) throws MessagingException { 53 //消息的固定信息 54 MimeMessage mimeMessage = new MimeMessage(session); 55 56 //发件人 57 mimeMessage.setFrom(new InternetAddress("619046217@qq.com")); 58 //收件人 59 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("619046217@qq.com")); 60 //邮件标题 61 mimeMessage.setSubject("带图片和附件的邮件"); 62 63 //邮件内容 64 //准备图片数据 65 MimeBodyPart image = new MimeBodyPart(); 66 DataHandler handler = new DataHandler(new FileDataSource("E:\IdeaProjects\WebEmail\resources\测试图片.png")); 67 image.setDataHandler(handler); 68 image.setContentID("test.png"); //设置图片id 69 70 //准备文本 71 MimeBodyPart text = new MimeBodyPart(); 72 text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8"); 73 74 //附件 75 MimeBodyPart appendix = new MimeBodyPart(); 76 appendix.setDataHandler(new DataHandler(new FileDataSource("E:\IdeaProjects\WebEmail\resources\测试文件.txt"))); 77 appendix.setFileName("test.txt"); 78 79 //拼装邮件正文 80 MimeMultipart mimeMultipart = new MimeMultipart(); 81 mimeMultipart.addBodyPart(image); 82 mimeMultipart.addBodyPart(text); 83 mimeMultipart.setSubType("related");//文本和图片内嵌成功 84 85 //将拼装好的正文内容设置为主体 86 MimeBodyPart contentText = new MimeBodyPart(); 87 contentText.setContent(mimeMultipart); 88 89 //拼接附件 90 MimeMultipart allFile = new MimeMultipart(); 91 allFile.addBodyPart(appendix);//附件 92 allFile.addBodyPart(contentText);//正文 93 allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed 94 95 96 //放到Message消息中 97 mimeMessage.setContent(allFile); 98 mimeMessage.saveChanges();//保存修改 99 100 return mimeMessage; 101 } 102 }
QQ邮箱授权码:
QQ邮箱需获取相应的权限:
QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)