Java实现发送邮件
实现发送带有文本、图片和附件的邮件
需要的jar包
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
java代码
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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;
public class TestUtil {
//发送邮件
public static void sendMail() {
try {
Session session = createSession();// 创建Session对象
Message message = createMessage(session);// 创建Message对象
Transport transport = session.getTransport();// 创建Transport对象
/** 第一个参数是发邮件的邮箱,第二个参数是授权码在邮件客户端先开启POP3/SMTP服务然后获取。
* 如果不开启服务,connect无法登录邮箱会报javax.mail.AuthenticationFailedException,身份验证失败异常
*/
transport.connect("发邮件的邮箱","邮箱的授权码");
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//创建一个会话
public static Session createSession() {
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 邮件传输协议
properties.put("mail.host", "smtp.qq.com");// 主机名,用什么邮箱发邮件要设置对应的主机名,QQ邮箱:smtp.qq.com,163邮箱:smtp.163.com
properties.put("mail.smtp.auth","true");// 设置邮件发送需要认证
properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接
properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息
Session session = Session.getInstance(properties);// 创建会话对象
return session;
}
//创建要发送的邮件内容
public static Message createMessage(Session session) throws Exception {
Message message = new MimeMessage(session);// 创建消息对象
message.setFrom(new InternetAddress("发件人邮箱"));// 设置发件人邮箱地址
/**设置收件人
* Message.RecipientType.TO 表示收件人
* Message.RecipientType.CC 表示抄送
* Message.RecipientType.BCC 表示暗送
*/
message.setRecipient(Message.RecipientType.TO, new InternetAddress("邮箱"));// 收件人邮箱
//message.setRecipient(Message.RecipientType.CC, new InternetAddress("邮箱"));// 抄送人邮箱
message.setSubject("主题是一封不知名的邮件");// 设置主题
message.setSentDate(new Date());//设置发送时间,默认是立即发送
/**发送4种不同的邮件
* message对象的setContent方法只有最后一次的赋值生效会覆盖前面的,想要多种内容组合可以通过MimeBodyPart和MimeMultipart的使用
* MimeBodyPart:保存数据的载体,可以保存文本、图片和保存了内容的MimeMultipart
* MimeMultipart:类似容器用于存放保存数据的载体,通过setSubType方法描述与数据的关系
* setSubType方法的参数代表混合MimeBodyPart的方法
* mixed:混合关系,一般正文和附件组合使用mixed
* related:关联关系,一般html引用了图片这类内嵌资源
* alternative:同时存在纯文本与超文本
*/
//1、只发送文本的邮寄
message.setContent("正文是一段不知道说什么的文本", "text/html;charset=UTF-8");
//2、发送带有图片的邮件
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent("这是一段带着不知道是什么图片的内容<br/><img src='cid:pic1.jpg'>", "text/html;charset=UTF-8");// <br/>是换行
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("图片路径"));
image.setDataHandler(dh);
image.setContentID("pic1.jpg");// 对应文本中img的cid
MimeMultipart mmp = new MimeMultipart();
mmp.addBodyPart(mbp);
mmp.addBodyPart(image);
mmp.setSubType("related");
message.setContent(mmp);
//3、发送带有附件的邮件
MimeBodyPart text = new MimeBodyPart();
MimeBodyPart text1 = new MimeBodyPart();
text.setContent("这是一封带着不知道是什么附件的邮件", "text/html;charset=UTF-8");
text1.setContent("<br/>这封邮件第二部分的内容", "text/html;charset=UTF-8");
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh1 = new DataHandler(new FileDataSource("附件路径"));
attach.setDataHandler(dh1);
attach.setFileName(dh1.getName());
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(text1);
mp.addBodyPart(attach);
mp.setSubType("mixed");
message.setContent(mp);
//4、同时发送图片和附件
MimeMultipart mp1 = new MimeMultipart();
mp1.addBodyPart(attach);
//mp1.addBodyPart(mbp);
//mp1.addBodyPart(image);
MimeBodyPart content = new MimeBodyPart();
content.setContent(mmp);
mp1.addBodyPart(content);//这3句相当于mp1.addBodyPart(mbp);和mp1.addBodyPart(image);的效果
mp1.setSubType("mixed");
message.setContent(mp1);
return message;
}
public static void main(String[] args) {
sendMail();
}
}