jdk
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
</dependency>
package com.airport;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class SendEmail {
public static void main(String[] args) throws MessagingException {
// 设置SMTP服务器地址、端口号等信息
String host = "smtp.sina.com";
int port = 465;
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");// 连接协议
props.put("mail.smtp.host", host);// 主机名,必须要,也可以使用smtp.sina.com.cn
props.put("mail.smtp.port", port);// 端口号,写不写无所谓,不确定的情况下,可以不写
props.put("mail.smtp.auth", "true");// 是否鉴权,必须要
props.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接,一般都使用
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//发送者的账号及IMAP/SMTP秘钥
return new PasswordAuthentication("@sina.com", "5b8ba7eab20afe14");
}
});
MimeMessage message = new MimeMessage(session);
//发送者邮箱
message.setFrom(new InternetAddress("@sina.com"));
//接收者邮箱
message.addRecipient(Message.RecipientType.TO, new InternetAddress("@qq.com"));
message.setSubject("Hello from Java!");
message.setText("This is a test email sent using Java.");
Transport.send(message);
System.out.println("Email sent successfully!");
}
}
plus版本
package com.airport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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 java.util.Properties;
/**
* 发送新浪邮件工具类,可发送纯文本、富文本、附件格式的邮件
* Created by wolffy on 2019/4/10
*/
@Slf4j
public class SinaMailUtil {
/**
* 发送者邮箱
*/
private static final String sender = "发送者邮箱";
/**
* 邮箱密码
*/
private static final String password = "邮箱密码";
private static Properties properties() {
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 连接协议
properties.put("mail.smtp.host", "smtp.sina.com");// 主机名,必须要,也可以使用smtp.sina.com.cn
properties.put("mail.smtp.port", 465);// 端口号,写不写无所谓,不确定的情况下,可以不写
properties.put("mail.smtp.auth", "true");// 是否鉴权,必须要
properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接,一般都使用
properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息,其中就包含了port
return properties;
}
/**
* 发送纯文本类型的新浪邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容
*/
public static void sendTextEmail(String receiver, String subject, String content) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
// 多个收件人
// message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@sina.com"), new InternetAddress("xxx@sina.com")});
// 一个收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));// 发送
// message.setRecipient(Message.RecipientType.CC, new InternetAddress(receiver));// 抄送
// message.setRecipient(Message.RecipientType.BCC, new InternetAddress(receiver));// 暗送
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
message.setText(content);
// setText等同于如下写法,将mimeType封装起来了,提供出一个简单的API
// MimeBodyPart textPart = new MimeBodyPart();
// textPart.setContent(content, "text/plain;charset=UTF-8");
// MimeMultipart multipart = new MimeMultipart();
// multipart.addBodyPart(textPart);
// message.setContent(multipart);
// 将创建好的邮件写入到磁盘盘以文件的形式进行保存
// message.saveChanges();
// message.writeTo(new FileOutputStream("/Users/felix/Desktop/sina_email.eml"));
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为邮箱登录密码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送富文本类型的新浪邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容,一段html
*/
public static void sendRichEmail(String receiver, String subject, String content) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为邮箱登录密码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带图片的新浪邮件,此种方式需要对文本内容详细规划,不能直接拷贝一段html来发送(本质上来说还是发送附件:sendFileEmail(),附件就是图片,只不过图片不以附件的方式展示出来),
* 如果不想要上传那图片,只是想引用一下其他地方(比如OSS)的图片,可使用sendRichEmail()方法,在html文本中使用img标签进行图片引入
* <p>
* 具体表现为:
* <p>
* 文本中用到的图片,都需要以附件的方式上传到服务器,但是并不以附件的方式展示出来,而是需要指定一个唯一的ContentID,然后直接在文本中使用<img src='cid:图片名'>进行引用
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容(富文本),尽量包含图片在内
* @param imgPath 图片路径,会以Base64的形式上传到邮箱,多张可以改变方法参数,用list或者字符串解析,然后循环指定ContentID再在文本中引用
*/
public static void sendImgEmail(String receiver, String subject, String content, String imgPath) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
// 多个收件人
// message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@sina.com"), new InternetAddress("xxx@sina.com")});
// 一个收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 准备图片数据,必须将图片传上去,才可以在正文中访问,说实话,cid一一对应的写法真麻烦
// 如果是网络图片,可以直接在富文本中写好路径,这样就无需上传了,见sendRichEmail()方法
// 单张图片
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(imgPath));
imagePart.setDataHandler(handler);
// 取个别名,在内容中引用,引用格式:<img src='cid:图片名字'>
// 图片上传了未引用,或者引用的时候别把名字写错了,这两种情况会形成附件形式的邮件,而且附件还是未转码的格式(.bin结尾)
imagePart.setContentID(handler.getName());
// 多张图片
// for (int i = 0; i < 10; i++) {
// MimeBodyPart imagePart = new MimeBodyPart();
// DataHandler handler = new DataHandler(new FileDataSource("/Users/felix/Desktop/xxx.jpg"));
// imagePart.setDataHandler(handler);
// imagePart.setContentID("xxx" + i + ".jpg");// 取个别名,在内容中引用
// }
multipart.addBodyPart(imagePart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码为邮箱登录密码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
/**
* 发送带附件的新浪邮件
*
* @param receiver 接收者邮箱
* @param subject 邮件标题
* @param content 邮件内容
* @param filePath 附件路径,会以Base64的形式上传到邮箱(多个附件需要改写此方法,filePath需要传递多个进来)
*/
public static void sendFileEmail(String receiver, String subject, String content, String filePath) {
try {
// 得到会话对象
Session session = Session.getInstance(properties());
// 获取邮件对象
Message message = new MimeMessage(session);
// 设置发件人邮箱地址
message.setFrom(new InternetAddress(sender));
// 设置收件人邮箱地址
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 设置邮件标题
message.setSubject(subject);
// 设置邮件内容
MimeMultipart multipart = new MimeMultipart();
message.setContent(multipart);
// 准备正文
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
multipart.addBodyPart(textPart);
// 单个附件
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(filePath));
imagePart.setDataHandler(handler);
imagePart.setFileName(handler.getName());// 注意这里:不再需要setContentId了
multipart.addBodyPart(imagePart);
// 得到传输对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect(sender, password);// 密码邮箱登录密码
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
}
}
public static void main(String[] args) {
sendTextEmail("111111111@sina.com", "aaa", "ccccc");
}
}