javaMail中
JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来创建Message类的实例对象,如果我们创建的是一个简单文本邮件,那么MimeMessage类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资源或者是带附件的复杂邮件,则需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等.
图片是别人的,上边话也是. MimeMultipart中可以有一个或多个MimeBodyPart组成,MimeBodyPart对象中也可以设置一个包含多个MimeBodyPart的MimeMultipart.(如设置一个包含图片和文字的邮件).
代码如下:
Properties props = new Properties();
// 设置邮件服务器地址,连接超时时限等信息
props.put("mail.host", config.getHost());
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); // 使用验证
props.put("mail.smtp.connectiontimeout", config.getConnectionTimeout() + ""); //
props.put("mail.smtp.timeout", config.getConnectionTimeout() + ""); //
// 创建缺省的session对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getUser(), config.getPassword());
}
});
// 开启debug
// session.setDebug(true);
// 创建message对象
Message msg = new MimeMessage(session);
// 设置发件人和收件人
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);
InternetAddress[] addressTo = new InternetAddress[recipients.size()];
for (int i = 0; i < recipients.size(); i++) {
addressTo[i] = new InternetAddress(recipients.get(i));
}
msg.setRecipients(Message.RecipientType.TO, addressTo);
// 设置抄送人
if (mailCcs != null && mailCcs.size() > 0) {
InternetAddress[] addressCC = new InternetAddress[mailCcs.size()];
for (int i = 0; i < mailCcs.size(); i++) {
addressCC[i] = new InternetAddress(mailCcs.get(i));
}
msg.setRecipients(Message.RecipientType.CC, addressCC);
}
// 设置密送人
if (mailBccs != null && mailBccs.size() > 0) {
InternetAddress[] addressBcc = new InternetAddress[mailBccs.size()];
for (int i = 0; i < mailBccs.size(); i++) {
addressBcc[i] = new InternetAddress(mailBccs.get(i));
}
msg.setRecipients(Message.RecipientType.BCC, addressBcc);
}
// 判断是否设置邮件主题
if (subject != null) {
// 设置邮件标题,中文编码
subject = MimeUtility.encodeText(new String(subject.getBytes(), "UTF-8"), "GBK", "B");
msg.setSubject(subject);
}
// 设置邮件内容,区分文本格式和HTML格式
if (contentType == null || contentType.equals(EmailData.CONTENT_TYPE_TEXT)) {
msg.setText(content);
} else if (contentType.equals(EmailData.CONTENT_TYPE_HTML)) {
// 给消息对象设置内容
Multipart mmp = new MimeMultipart();// 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
BodyPart bodyPart1 = new MimeBodyPart(); // 新建一个存放信件内容的BodyPart对象
bodyPart1.setContent(content, "text/html;charset=GBK");// 给BodyPart对象设置内容和格式/编码方式
mmp.addBodyPart(bodyPart1);
// 设置邮件附件
if (fileName != null) {
fileName.forEach(item->{
File file = new File(item);
String name = file.getName();
MimeBodyPart bodyPart2 = new MimeBodyPart();
FileDataSource fileDataSource = new FileDataSource(file);
try {
bodyPart2.setDataHandler(new DataHandler(fileDataSource));
bodyPart2.setFileName(MimeUtility.encodeText(name, "GBK", "B"));
mmp.addBodyPart(bodyPart2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
}
// 将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
msg.setContent(mmp);// 把mm作为消息对象的内容
}
// 设置邮件发送时间
msg.setSentDate(new java.util.Date());
// 调用抽象类的静态方法send()发送邮件
Transport.send(msg);
另外解决发送附件是有过一个小纠结 不知道要的这个文件路径是客户端的路径 还是服务器上的绝对路径,经过查证是 客户端的文件路径.这就省了好些事.
链接参考