目录
1. 电子邮件是如何发送的
电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。
邮件服务器发送邮件的协议是SMTP协议,它是Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465 或587。SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议。
2. 准备阶段
2.1 准备SMTP的登录信息
在使用JavaMail发送邮件时,首先需要自己的邮件地址和对方的邮件地址,其次要确定邮件服务器地址和端口号,发送方用163邮箱,接收方用qq邮箱。
QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587
163邮箱:SMTP服务器是smtp.163.com,端口是465
2.2 准备jar包
在程序中需要用到Javax.mail-1.6.2.jar,所以先要把jar包导入到当前项目,然后通过JavaMail API连接到SMTP服务器上,
2.3 链接SMTP服务器
首先我们需要准备一个Properties对象,里面存SMTP主机名、端口号、是否需要用户认证及是否启用TLS加密。其次获取Sessoin实例,传入props,同时需要传入Authenticator对象,在Authenticator对象中返回邮箱发送账号及账号授权密码,最后设置Debug便于调试。
String userName = "1*********5@163.com";//邮箱发送账号
String password = "W**************G";//账号授权密码
//连接到SMTP服务器
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");//SMTP主机名
props.put("mail.smtp.port", "25");//主机端口号
props.put("mail.smtp.auth", "true");//是否需要用户认证
props.put("mail.smtp.starttls.enable","true");//启用TLS加密
//获取Session实例
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
//设置Debug模式便于调试
session.setDebug(true);
3. 发送邮件
3.1 发送普通HTNL邮件
发送普通邮件时,第一步需要创建Session会话。
第二部创建MimeMessage邮件对象,在邮件对象中设置邮件发送地址、接收方地址、邮件主题、正文等信息。
RecipientType.TO为接收方
RecipientType.CC为抄送方
第三步用Transport的send方法发送message邮件。
通过以上三步发送普通邮件。
try {
//1.创建Session会话
Session session =JavaMailUtils.createSession();
//2.创建邮箱对象
MimeMessage message = new MimeMessage(session);
message.setSubject("Hello");//设置邮件主题
message.setText("爱你孤身走暗巷,爱你不跪的模样");//设置邮件正文
message.setFrom(new InternetAddress("1*********5@163.com"));//设置发送方地址
message.setRecipient(RecipientType.TO,new InternetAddress("2********0@qq.com"));//设置接收方地址
//发送
Transport.send(message);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.2 发送带附件的HTML邮件
发送带附件的邮件,跟发送带附件的邮件第一步跟最后一步操作是相同的。
不同之处在于第二步,其中创建MimeMessage对象、设置邮件标题、发件方、收件方及抄送方这些都不变。但是在设置内容时既包含内容又包含附件,我们不能直接用setText方法直接设置,而设要建一个MultiPart对象(一个MultiPart中可以添加多个BodyPart对象)。所以需要分别创建正文及附件相应的BodyPart对象,将正文及附件内容传入相应的BodyPart对象中,再将BodyPart添加至MultiPart中。最后通过setContect方法把MultiPart添加到Message中。
在BodyPart通过SetContect添加文本时,如果添加纯文本则用textPart.setContent("...","text/plain;charset=utf-8");添加html文本用textPart.setContent("...","text/html;charset=utf-8");
在添加附件时需要设置附件名,及添加DataHandler对象,将需要发送的附件上传。
try {
//创建Session会话
Session session = JavaMailUtils.createSession();
//创建MimeMession邮箱对象
MimeMessage message = new MimeMessage(session);
message.setSubject("测试邮件");//邮件标题
message.setFrom("1*********5@163.com");//发件人
message.setRecipient(RecipientType.TO, new InternetAddress("2********0@qq.com"));//收件人
//抄送
message.setRecipients(RecipientType.CC,new InternetAddress[]{new InternetAddress("2********0@qq.com")},newInternetAddress("1********0@qq.com");
//既包含正文又包含附件
BodyPart textPart = new MimeBodyPart();
//正文
textPart.setContent("用<b>脑子</b>干事算工作,不用<b>脑子</b>算动作","text/html;charset=utf-8");
//附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName("足球");
//上传附件文件
filePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\yjy\\messi.jpg")), "application/octet-stream")));
//将正文+附件组装成Muitipart对象
Multipart mulitPart = new MimeMultipart();
mulitPart.addBodyPart(textPart);
mulitPart.addBodyPart(filePart);
message.setContent(mulitPart);
//发送
Transport.send(message);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.3 发送内嵌图片的HTML邮件
发送内嵌图片与发送附件有些许不同,在传入正文内容时需要及将需要传入的内容都添加在StringBuilder中,再通过setContect方法将StringBuilder添加至textPart。(若StringnBuilder中带有html文本,则用textPart.setContent("contentText.toString()","text/html;charset=utf-8");)。
在传入图片时,需要设置图片内容ID,并将图片内容ID通过html标签方式添加至StringBuilder中。
try {
//创建Session会话
Session session = JavaMailUtils.createSession();
//创建MimeMession邮箱对象
MimeMessage message = new MimeMessage(session);
message.setSubject("测试邮件2");//邮件标题
message.setFrom("1*********5@163.com");//发件人
message.setRecipient(RecipientType.TO, new InternetAddress("2********0@qq.com"));//收件人
//抄送
message.setRecipients(RecipientType.CC,new InternetAddress[]{new InternetAddress("2********0@qq.com")});
BodyPart textPart = new MimeBodyPart();
StringBuilder contentText = new StringBuilder();
contentText.append("<h3>梅西</h3>");
contentText.append("<p>三个男人的故事</p>");
contentText.append("<img height=100px src=\"cid:football\"/>");
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
//上传附件文件
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\yjy\\messi.jpg")), "application/octet-stream")));
//图片内容ID
imagePart.setHeader("Content-ID","football");
//将正文+附件组装成Muitipart对象
Multipart mulitPart = new MimeMultipart();
mulitPart.addBodyPart(textPart);
mulitPart.addBodyPart(imagePart);
//发送
message.setContent(mulitPart);
Transport.send(message);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}