import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; /** * @Auther: eros * @Date: 2019/4/1 15:20 * @Description: * 1.刚开始使用RFC882文档 * 只能发送纯文本文件,包含邮件头和邮件体两个部分,使用空行分隔 * 邮件头: * form —— 指定发件人 * to —— 指定收件人 * subject —— 指定邮件主题 * cc —— 抄送,同时发送给另一个收件人,收件人可以看到邮件抄送给谁 * bcc —— 密送,同时发送给另一个收件人,收件人无法看到邮件抄送给谁 * 邮件体: * 邮件具体文本内容 * * 2.MIMI协议 * 在RFC882文档的升级和补充,通常将MIME协议描述的邮件称为MIME邮件,MIME协议描述的数据称为MIME消息。 * 可包含图片和附件 * * 3.介绍JAVAMail(基于MIME协议) * 3.1 使用JavaMail API 收发邮件 主要包含哪些api * 》创建和解析邮件内容的API —— Message类是核心,实例对象代表一封电子邮件 * 》发送邮件API —— Transport类是发送邮件核心,实例对象代表某个邮件发送协议的邮件发送对象,例如SMTP协议 * 》接收邮件API —— Store类是接收邮件的核心,实例对象代表某个邮件接收协议的收件接收对象,例如POP3协议 * * * 3.2 邮件组织结构相关的API * MimeMessage —— 代表整封邮件 * MimeMultipart —— 代表一个有多个Mime消息组合成的Mime消息 * MimeBodyPart —— 代表邮件中一个Mime消息 * * 3.3 邮件发送程序 流程 * a.创建包含邮件服务器的网络连接信息的Session对象 * b.创建代表邮件内容的Message对象 * c.创建Transport对象,连接服务器,发送Message对象,关闭连接 * */ public class MailUtils { // POP3 服务器 private final static String QQ_POP_HOST = "pop.qq.com"; private final static String POP_163_HOST = "pop.163.com"; // POP3 端口 private final static String QQ_POP_PORT = "995"; private final static String POP_163_PORT = "995"; // SMTP 服务器 private static String smtp_host = ""; private final static String QQ_SMTP_HOST = "smtp.qq.com"; private final static String SMTP_163_HOST = "smtp.163.com"; // SMTP 端口 private static String smtp_port = ""; private final static String QQ_SMTP_PORT = "587";// 465 | 587 private final static String SMTP_163_PORT = "465";// 465 | 994 // 收件人 —— 邮箱 private static String addressee = ""; // 发件人 —— 邮箱 private static String sender = ""; // 账号 private static String sender_account = ""; // 授权码 private static String sender_password = ""; //邮件文本内容的类型 private final static String MESSAGE_CONTENT_TYPE = "text/html;charset=UTF-8"; //图片地址 private static String photoUrl = "E:\\avatar\\background.jpg"; public static void main(String[] args){ try { learn(); } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * @auther: eros * @param 1 * @date: 2019/4/1 17:18 * @description 第一次书写,熟悉发送邮件套路 * @return: void */ public static void learn() throws MessagingException, UnsupportedEncodingException { Properties props = new Properties(); props.put("mail.smtp.host",QQ_SMTP_HOST); props.put("mail.transport.protocol","smtp"); props.put("mail.smtp.auth","true");// 表示SMTP发送邮件需要进行身份验证 props.put("mail.smtp.sll.enable","true");// 设置是否使用ssl安全连接 props.put("mail.smtp.port",QQ_SMTP_PORT); // 使用JavaMail发送邮件的5个步骤 //1. 创建session Session session = Session.getInstance(props); //开启session 的debug模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport ts = session.getTransport(); //3.使用邮件的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给 //smtp服务器,都通过验证后即可正常发送邮件给收件人。 ts.connect(QQ_SMTP_HOST,sender_account,sender_password); //4.创建邮件 // Message message = createSimpleMail(session); // Message message = createImageMail(session); // Message message = createAttachMail(session); Message message = createMixedMail(session); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); ts.close(); } private static Message createMixedMail(Session session) throws MessagingException, UnsupportedEncodingException { MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.setFrom(new InternetAddress(sender_account)); mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account)); mimeMessage.setSubject("带附件和图片的邮件"); // 正文 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一个带附件和图片的邮件<img src='cid:abc.jpg'>",MESSAGE_CONTENT_TYPE); // 图片 MimeBodyPart image = new MimeBodyPart(); image.setDataHandler(new DataHandler(new FileDataSource(photoUrl))); image.setContentID("abc.jpg"); //附件 MimeBodyPart attach = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(photoUrl)); attach.setDataHandler(dh); attach.setFileName(MimeUtility.encodeText(dh.getName())); // 描述关系 正文和图片 MimeMultipart mp1 = new MimeMultipart(); mp1.addBodyPart(text); mp1.addBodyPart(image); mp1.setSubType("related"); MimeBodyPart content = new MimeBodyPart(); content.setContent(mp1); //描述关系 正文和附件 MimeMultipart mp2 = new MimeMultipart(); mp2.addBodyPart(content); mp2.addBodyPart(attach); mp2.setSubType("mixed"); mimeMessage.setContent(mp2); mimeMessage.saveChanges(); return mimeMessage; } /** * @auther: eros * @param session 1 * @date: 2019/4/1 17:48 * @description 创建一封带附件的邮件 * @return: javax.mail.Message */ private static Message createAttachMail(Session session) throws MessagingException { MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.setFrom(new InternetAddress(sender_account)); mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account)); mimeMessage.setSubject("带附件的邮件"); // 创建邮件正文 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封带附件的邮件",MESSAGE_CONTENT_TYPE); // 创建邮件附件 MimeBodyPart attach = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(photoUrl)); attach.setDataHandler(dh); attach.setFileName(dh.getName()); //创建容器描述数据关系 MimeMultipart mp = new MimeMultipart(); mp.addBodyPart(text); mp.addBodyPart(attach); mp.setSubType("mixed");// ***这个是重点*** mimeMessage.setContent(mp); mimeMessage.saveChanges(); return mimeMessage; } /** * @auther: eros * @param session 1 * @date: 2019/4/1 17:35 * @description 创建一个邮件正文带图片的邮件 * @return: javax.mail.Message */ private static Message createImageMail(Session session) throws MessagingException { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(sender_account)); message.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account)); message.setSubject("带图片的邮件"); // 准备邮件数据 // 准备邮件正文数据 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件",MESSAGE_CONTENT_TYPE); // 准备图片数据 MimeBodyPart image = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(photoUrl)); image.setDataHandler(dh); image.setContentID("xxx.jpg"); // 描述数据关系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); message.setContent(mm); message.saveChanges(); //将创建好的邮件写入到E盘以文件的形式进行保存 // message.writeTo(new FileOutputStream("E:\\ImageMail.eml")); //返回创建好的邮件 return message; } }