JavaMail(二):利用JavaMail发送复杂邮件
上一篇文章我们学习了利用JavaMail发送简单邮件,这篇文章我们利用JavaMail发送稍微复杂一点的邮件(包含文本、图片、附件)。这里只贴出核心代码,其余代码可参考JavaMail(一):利用JavaMail发送简单邮件
封装发送邮件代码
/** * 封装发送邮件代码 * @author fly * @时间 2017-05-09 * */ public class Email { /** * 创建并发送一封包含文本、图片、附件的复杂邮件 * @throws Exception */ public static void sendComplexMail(MailSenderInfo mailInfo) throws Exception{ // 判断是否需要身份认证 MyAuthenticator authenticator = null; Properties pro = mailInfo.getProperties(); if(mailInfo.isValidate()){ // 如果需要身份认证,则创建一个密码验证器 authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); } // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(pro, authenticator); // 根据session创建一个邮件消息 Message mailMessage = new MimeMessage(sendMailSession); // 创建邮件发送者地址 Address from = new InternetAddress(mailInfo.getFromAddress()); // 设置邮件消息的发送者 mailMessage.setFrom(from); // 创建邮件的接收者地址,并设置到邮件消息中 Address to = new InternetAddress(mailInfo.getToAddress()); // Message.RecipientType.TO属性表示接收者的类型为TO mailMessage.setRecipient(Message.RecipientType.TO, to); // 设置邮件消息的主题 mailMessage.setSubject(mailInfo.getSubject()); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); MimeBodyPart image = new MimeBodyPart(); //DataHandler为图片 FileDataSource为图片数据源 (与处理附件比较类似:区别在于您必需通过设置 MimeMultipart 构造器中的子类型(或者说用 setSubType())告知 MimeMultipart 各个相关部件,并设置图像的 Content-ID ,作为图像的 src 在 img 标记中使用) DataHandler dh = new DataHandler(new FileDataSource("stock-photo-189028703.jpg")); image.setDataHandler(dh); //用一个给定的 cid URL 引用图像,其中 cid 是图像附件 Content-ID 头的引用 setContent时用到这个cid image.setContentID("tupian"); BodyPart text = new MimeBodyPart(); text.setContent("美丽的图片<br/><img src='cid:" + image.getContentID() + "'/>", "text/html;charset=UTF-8"); MimeMultipart textImageRelated = new MimeMultipart(); textImageRelated.addBodyPart(text); textImageRelated.addBodyPart(image); textImageRelated.setSubType("related"); BodyPart textImage = new MimeBodyPart(); textImage.setContent(textImageRelated); BodyPart attachment = new MimeBodyPart(); //DataHandler为附件 FileDataSource为附件数据源 如果从 URL 中读时,附件的数据源是 URLDataSource DataHandler dh2 = new DataHandler(new FileDataSource(mailInfo.getAttachFileNames()[0])); attachment.setDataHandler(dh2); attachment.setFileName(MimeUtility.encodeText(dh2.getName())); MimeMultipart mainPart = new MimeMultipart(); mainPart.addBodyPart(textImage); mainPart.addBodyPart(attachment); mainPart.setSubType("mixed"); mailMessage.setContent(mainPart); // 连接邮件服务器、发送邮件、关闭连接 Transport.send(mailMessage); } }
测试代码:
public class JavaMailTest { public static void main(String[] args) {
//设置邮件相关信息 MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost("smtp.163.com"); mailInfo.setMailServerPort("25"); mailInfo.setValidate(true); mailInfo.setUserName("qfanliyan@163.com"); mailInfo.setPassword(""); // 您的邮箱密码,若你的邮箱开启了客户端授权密码,则此处是您的客户端授权密码 mailInfo.setFromAddress("qfanliyan@163.com"); mailInfo.setToAddress("ifanliyan@qq.com"); mailInfo.setSubject("这是一封测试邮件"); mailInfo.setContent("你好!这是一封测试邮件"); String[] fileName = {"手艺人.docx"}; mailInfo.setAttachFileNames(fileName); try { //Email.sendTextMail(mailInfo); //Email.sendHtmlMail(mailInfo); Email.sendComplexMail(mailInfo); } catch (Exception e) { e.printStackTrace(); } } }