import java.net.HttpURLConnection;
import java.net.URL;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.util.ByteArrayDataSource;
public void sendAttachment(MailBean mailBean) throws Exception{
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props);
Message message = new MimeMessage(session);
InternetAddress from = new InternetAddress("xxxx@qq.com"); // 邮件发送者地址
from.setPersonal(MimeUtility.encodeText("吴彦祖")); // 发件人
message.setFrom(from);
InternetAddress to = new InternetAddress(mailBean.getRecipient());
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject(MimeUtility.encodeText(mailBean.getSubject()));
message.setSentDate(new Date());
MimeMultipart msgMultipart = new MimeMultipart("mixed");// 指定为混合关系
message.setContent(msgMultipart);
// 邮件内容
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(mailBean.getContent(), "text/html;charset=UTF-8");
// 组装的顺序非常重要,一定要先组装文本域,再组装文件
msgMultipart.addBodyPart(htmlPart);
// 组装附件
if(mailBean.getAttachmentPath() != null){
MimeBodyPart file = new MimeBodyPart();
URL url = new URL(mailBean.getAttachmentPath());
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
InputStream inputStream = conn.getInputStream();
DataSource dataSource1=new ByteArrayDataSource(inputStream, "application/octet-stream");
DataHandler dh = new DataHandler(dataSource1);
file.setDataHandler(dh);
// 附件区别内嵌内容的一个特点是有文件名,为防止中文乱码要编码
file.setFileName(MimeUtility.encodeWord(mailBean.getFileName() != null ? mailBean.getFileName() : dh.getName(),"utf-8","B"));
msgMultipart.addBodyPart(file); // 添加附件,可添加多个
}
message.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect("smtp.qq.com", -1, "xxxx@qq.com", "a123456"); // 主机,发送者地址,密码
transport.sendMessage(message, message.getAllRecipients());
transport.close();
logger.info("邮件发送完毕");
}
@Getter
@Setter
@ToString
public class MailBean implements Serializable{
// 邮件接收人
private String recipient;
// 邮件主题
private String subject;
// 邮件内容
private String content;
// 附件Http地址
private String attachmentPath;
// 附件名称, 吴彦祖.jpg
private String fileName;
}