java发送邮件
1.引用包
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2、发送邮件步骤
2.1.1、设置公共参数(企业版)
public static Session mailSession() throws GeneralSecurityException {
// 属性对象
Properties properties = new Properties();
// 开启debug调试 ,打印信息
properties.setProperty( "mail.debug", "true" );
// 发送服务器需要身份验证
properties.setProperty( "mail.smtp.auth", "true" );
// 发送服务器端口,可以不设置,默认是25
properties.setProperty( "mail.smtp.port", "465" );
// 发送邮件协议名称
properties.setProperty( "mail.transport.protocol", "smtp" );
// 设置邮件服务器主机名
properties.setProperty( "mail.host", "smtp.ym.163.com" );
//使用SSL,企业邮箱必需!
//开启安全协议
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts( true );
properties.put( "mail.smtp.ssl.enable", "true" );
properties.put( "mail.smtp.ssl.socketFactory", sf );
// 环境信息
Session session = Session.getInstance( properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 在session中设置账户信息,Transport发送邮件时会使用
//userName 为账号 //password 为密码
return new PasswordAuthentication( userName, password );
}
} );
return session;
}
2.1.2 设置公共参数(个人邮箱 注意password)
public static Session sendMails() throws MessagingException {
// 属性对象
Properties properties = new Properties();
// 开启debug调试 ,打印信息
properties.setProperty( "mail.debug", "true" );
// 发送服务器需要身份验证
properties.setProperty( "mail.smtp.auth", "true" );
// 发送服务器端口,可以不设置,默认是25
properties.setProperty( "mail.smtp.port", "25" );
// 发送邮件协议名称
properties.setProperty( "mail.transport.protocol", "smtp" );
// 设置邮件服务器主机名
properties.setProperty( "mail.host", "smtp.163.com" );
// 环境信息
Session session = Session.getInstance( properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 在session中设置账户信息,Transport发送邮件时会使用
//username 为账号 password 第三方授权密码
return new PasswordAuthentication( userName, password );
}
} );
return session;
}
注意:关于2.1.2中提到的授权密码 可登录邮箱设置 QQ、 163 大同小异(为方便理解贴图提示)
2.2 设置消息头
/**
* TODO: 设置邮箱发送人 发送主题 时间
*
* @param subject 主题
* @param toAddresslist 收件人(单个\多个用,分割)
* @param ccAddress 抄送人
* @param bccAddress 密送人
* @param address 发件人
* @param sentDate 发送时间 @author WeiLian
* @date 19/11/14 10:20
* @method
* @version 1.0
**/
public static Message mailMessage(String subject, String address, String toAddresslist, String ccAddress, String bccAddress, Date sentDate) throws GeneralSecurityException, MessagingException, UnsupportedEncodingException {
// 创建邮件对象
Message message = new MimeMessage( mailSession() );
//设置主题
message.setSubject( subject );
// 发件人
if (CheckNull.isNull( address )) {
message.setFrom( new InternetAddress( from ) );
} else {
message.setFrom( new InternetAddress( from, address, "UTF-8" ) );
}
// 多个收件人
message.setRecipients( MimeMessage.RecipientType.TO, InternetAddress.parse( toAddresslist ) );
if (null != ccAddress && !ccAddress.trim().equals( "" )) {
// 抄送人
message.setRecipient( MimeMessage.RecipientType.CC, new InternetAddress( ccAddress ) );
}
if (null != bccAddress && !bccAddress.trim().equals( "" )) {
// 暗送人
message.setRecipient( MimeMessage.RecipientType.BCC, new InternetAddress( bccAddress ) );
}
//发送时间
if (null != sentDate) {
message.setSentDate( sentDate );
}
return message;
}
2.3 准备发送的附件 和内容
/**
* @param subject 主题
* @param content 内容
* @param sourcePath 目录地址(目录下所有文件全部发送)
* @param filePath 文件地址(发送单个文件、图片、zip压缩包)
* @param toAddresslist 收件人(单个\多个用,分割)
* @param ccAddress 抄送人
* @param bccAddress 密送人
* @param sentDate 发送时间
* @Author WeiLian
* @Date: 19/11/14
* @Description //TODO 发送整个文件夹下 和 不修改文件名情况下使用
*/
public static void sendFilesMail(String subject, String content, String sourcePath, String filePath, String toAddresslist, String ccAddress, String bccAddress, Date sentDate) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {
Message message = mailMessage( subject, toAddresslist, ccAddress, bccAddress, bccAddress, sentDate );
final BodyPart messageBodyPart = new MimeBodyPart();
//消息
messageBodyPart.setContent( content, "text/html;charset=UTF-8" );
//创建多重消息
final Multipart multipart = new MimeMultipart();
//设置文本消息部分
multipart.addBodyPart( messageBodyPart );
//为邮件添加多个附件
MimeBodyPart attachment = null;
if (null != sourcePath && !"".equals( sourcePath.trim() )) {
final File source = new File( sourcePath );
if (!source.exists()) {
System.out.println( sourcePath + " not exists" );
return;
}
final File[] files = source.listFiles();
for (final File f : files) {
attachment = new MimeBodyPart();
final String fpath = f.getPath();
//根据附件文件创建文件数据源
final DataSource ds = new FileDataSource( fpath );
attachment.setDataHandler( new DataHandler( ds ) );
//为附件设置文件名
attachment.setFileName( ds.getName() );
multipart.addBodyPart( attachment );
}
}
if (null != filePath && !"".equals( filePath )) {
//添加zip附件
attachment = new MimeBodyPart();
//根据附件文件创建文件数据源
final DataSource ds = new FileDataSource( filePath );
attachment.setDataHandler( new DataHandler( ds ) );
//为附件设置文件名
attachment.setFileName( ds.getName() );
multipart.addBodyPart( attachment );
}
// 发送完整消息
message.setContent( multipart );
// 发送消息
// 连接邮件服务器、发送邮件、关闭连接,全做了
Transport.send( message );
}