准备工作;发送方开通邮件服务
在设置>>账户 中找到下图POP3/IMAP/SMTP设置,点击要使用的服务,点击开启,会让你发送一个短信,发送后会给你一个16位的密码,这个密码是在下方代码中要使用到的(其他的邮箱服务如163邮箱,126邮箱等也是同样有该设置的.)
上方发送短信后,点击下我已发送
按钮,会弹出一个含有密码的提示框,一定要记住该密码
.
运行java发送邮件代码
下方代码修改下包名,发送方邮箱地址及密码,以及测试的图片和地址即可运行
package jpgk.text.demo;
import com.jpgk.common.utils.StringUtils;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.security.GeneralSecurityException;
import java.util.Properties;
/**
* 通过服务器地址向收件人发送邮件,不同邮箱服务器之间也可发送
* 发送方:
* 1.开启POP3/SMTP/IMAP中要使用的服务,可以在邮箱设置中找到,开启后会有服务密码
* 2.确定服务器地址(地址一般是pop.163.com,smtp.163.com,smtp.qq.com等)
* 3.确定服务器类型,类型一般是服务器地址点号的前几位
*/
public class JavaEmailUtils {
private static final String MAILHOST = "smtp.qq.com";//邮件服务器地址
private static final String MAILTRANSPORTPROTOCOL = "smtp";//邮件服务器类型
private static final String MAILSMTPAUTH = "true";//是否校验
private static final String MAILSMTPSSLENABLE = "true";//邮件是否设置SSL加密
private static final String USERNAME = "******@qq.com";//开通邮件服务的用户
private static final String PASSWORD = "*******";//开通邮件服务的用户密码,16位
private static final String TEXTTYPE = "text/html;charset=UTF-8";//发送文本邮件内容格式
/**
* 发送邮件
*
* @param receiverEmail 接收方邮件地址
* @param mailTitle 邮件主题
* @param content 邮件内容
* @param imagePath 邮件正文中的图片路径,图片路径可传可不传
* @param filePath 邮件中的附件路径,附件路径可传可不传
*/
public static void sendEmail(String receiverEmail, String mailTitle, String content, String imagePath, String filePath) {
//获取配置信息Properties对象
Properties properties = getProperties();
//创建一个session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
//session.setDebug(true);//开启debug模式
//获取连接对象
Transport transport;
try {
transport = session.getTransport();
//连接服务器,参数:邮件服务器,服务器用户,用户服务密码
transport.connect("smtp.qq.com", USERNAME, PASSWORD);
MimeMessage mimeMessage = new MimeMessage(session); //消息的固定信息
mimeMessage.setFrom(new InternetAddress(USERNAME));//发件人
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmail));//收件人
mimeMessage.setSubject(mailTitle);//邮件标题
//组装消息内容
mimeMessage = setEmailBody(session, receiverEmail, mailTitle, content, imagePath, filePath);
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());//发送邮件
transport.close();//关闭连接
} catch (NoSuchProviderException e) {
System.err.println("没有获取到transport");
e.printStackTrace();
} catch (MessagingException e) {
System.err.println("发送邮件异常");
e.printStackTrace();
}
}
/**
* 获取Properties对象
*
* @return
*/
public static Properties getProperties() {
//创建一个配置文件并保存
Properties properties = new Properties();
properties.setProperty("mail.host", MAILHOST);
properties.setProperty("mail.transport.protocol", MAILTRANSPORTPROTOCOL);
properties.setProperty("mail.smtp.auth", MAILSMTPAUTH);
//设置SSL加密
MailSSLSocketFactory socketFactory;
try {
socketFactory = new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", MAILSMTPSSLENABLE);
properties.put("mail.smtp.ssl.socketFactory", socketFactory);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return properties;
}
/**
* 设置发送邮件的主体内容
*
* @param session
* @param receiverEmail 接收方邮件地址
* @param mailTitle 邮件主题
* @param content 邮件内容
* @param imagePath 邮件正文中的图片
* @param filePath 邮件中的附件
* @return
* @throws MessagingException
*/
public static MimeMessage setEmailBody(Session session, String receiverEmail, String mailTitle, String content, String imagePath, String filePath) throws MessagingException {
MimeMessage mimeMessage = new MimeMessage(session); //消息的固定信息
mimeMessage.setFrom(new InternetAddress(USERNAME));//发件人
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmail));//收件人
mimeMessage.setSubject(mailTitle);//邮件标题
MimeMultipart mimeMultipart = new MimeMultipart();//正文部分,包含文本和图片
MimeBodyPart text = new MimeBodyPart();//正文文本
if (!StringUtils.isEmpty(imagePath)) {
MimeBodyPart image = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(imagePath));
image.setDataHandler(handler);
String imageId = String.valueOf(System.currentTimeMillis());
image.setContentID(imageId); //设置图片id
text.setContent(content + "<img src='cid:" + imageId + "'>", TEXTTYPE);
mimeMultipart.addBodyPart(image);//正文图片
} else {
text.setContent(content, TEXTTYPE);
}
mimeMultipart.addBodyPart(text);
mimeMultipart.setSubType("related");//文本和图片内嵌成功
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);//设置正文内容
MimeMultipart allFile = new MimeMultipart();//邮件主体,包含正文和附件
if (!StringUtils.isEmpty(filePath)) {
MimeBodyPart appendix = new MimeBodyPart();
appendix.setDataHandler(new DataHandler(new FileDataSource(filePath)));
appendix.setFileName(new File(filePath).getName());
allFile.addBodyPart(appendix);//附件
}
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
/**
* 测试发送邮件
*
* @param args
*/
public static void main(String[] args) {
sendEmail("123456@163.com", "测试", "测试发送邮件", "D:\\test.png", "D:\\test.xls");
}
}
上述代码已经简单封装成工具类,有需要优化的大神可以继续进行优化.