这里主要介绍两种邮件发送:qq邮箱,163邮箱
一、环境准备
pom文件中引入Java邮件依赖:
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
二、qq邮件发送
进入qq邮箱,首页--设置--账户,下拉找到下图,开启第一个服务获取授权码(记录下来后续要用),我这里已经开启了。
代码实现如下:
package com.zy.demo.controller.javamail;
import com.sun.mail.util.MailSSLSocketFactory;
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.MimeMessage;
import java.util.Properties;
public class SendQQEmail {
public static void main(String[] args) throws Exception{
System.out.println("------------开始发送----------");
send();
System.out.println("------------发送成功----------");
}
public static void send() throws Exception{
Properties prop = new Properties();
// 开启debug调试,以便控制台查看
prop.setProperty("mail.debug","false");
// 设置邮件服务器主机名
prop.setProperty("mail.host","smtp.qq.com");
// 发送服务器需要身份验证
prop.setProperty("mail.smtp.auth","true");
// 发送邮件协议名称
prop.setProperty("mail.transport.protocol","smtp");
// 开启SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
// 创建session
Session session = Session.getInstance(prop);
// 通过session得到transport对象
Transport transport = session.getTransport();
// 连接邮件服务器:邮箱类型,账号,授权码(此处只能是授权码,而不是邮箱密码)
transport.connect("smtp.qq.com","1xxxxxxxx5","vmrxxxqkkeembxbi");
// 创建邮件
Message message = createSimpleMail(session);
// 发送邮件
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}
public static MimeMessage createSimpleMail(Session session) throws MessagingException {
// 创建邮件对象
MimeMessage mimeMessage = new MimeMessage(session);
// 发件人
mimeMessage.setFrom(new InternetAddress("1536310835@qq.com"));
// 收件人
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("zxxxxxxx1@163.com"));
// 标题
mimeMessage.setSubject("这里是老公");
// 文本内容
mimeMessage.setContent("媳妇儿,打赏一点吧","text/html;charset=UTF-8");
return mimeMessage;
}
}
三、163邮件发送
第一步同样要开始smtp服务,记录授权码,步骤同qq邮箱类似,这里不再展开
此处采用加载配置文件方式,要特别注意的是文件编码格式,不然容易出现中文乱码的情况。
配置文件如下:
subject=我是小明
host=smtp.163.com
from=zxxxxxxxx1@163.com
to=1xxxxxx5@qq.com
affix=
affixName=
user=zxxxxxxxx1
pwd=ZOFKxxxxxxxxxJYM
注意其中user可以加“@163.com”,加不加都行,效果一样
java代码如下:
package com.zy.demo.controller.javamail;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.InputStreamReader;
import java.util.Properties;
public class SendMailUtil {
static String HOST = ""; // smtp服务器
static String FROM = ""; // 发件人地址
static String TO = ""; // 收件人地址
static String AFFIX = ""; // 附件地址
static String AFFIXNAME = ""; // 附件名称
static String USER = ""; // 用户名
static String PWD = ""; // 163的授权码
static String SUBJECT = ""; // 邮件标题
static String[] TOS = null;
static {
try {
Properties props = new Properties();
//从自定义配置文件获取相关参数
props.load(new InputStreamReader(SendMailUtil.class.getClassLoader().getResourceAsStream("email.properties"),"UTF-8"));
// props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("xiao.properties"));用此方法取出的中文乱码,是ISO-8859-1格式
HOST=props.getProperty("host");
FROM=props.getProperty("from");
TO=props.getProperty("to");
TOS=TO.split(",");
AFFIX=props.getProperty("affix");
AFFIXNAME=props.getProperty("affixName");
USER=props.getProperty("user");
PWD=props.getProperty("pwd");
SUBJECT=props.getProperty("subject");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送邮件
*/
public static void send(String context) {
Properties props = new Properties();
props.put("mail.smtp.host", HOST);//设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
props.put("mail.smtp.auth", "true"); //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
Session session = Session.getDefaultInstance(props);//用props对象构建一个session
session.setDebug(true);
MimeMessage message = new MimeMessage(session);//用session为参数定义消息对象
try {
message.setFrom(new InternetAddress(FROM));// 加载发件人地址
InternetAddress[] sendTo = new InternetAddress[TOS.length]; // 加载收件人地址
for (int i = 0; i < TOS.length; i++) {
sendTo[i] = new InternetAddress(TOS[i]);
}
message.addRecipients(Message.RecipientType.TO, sendTo);
message.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(FROM));//设置在发送给收信人之前给自己(发送方)抄送一份,不然会被当成垃圾邮件,报554错
System.out.println("------名称:"+SUBJECT);
message.setSubject(SUBJECT);//加载标题
Multipart multipart = new MimeMultipart();//向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
BodyPart contentPart = new MimeBodyPart();//设置邮件的文本内容
contentPart.setText(context);
multipart.addBodyPart(contentPart);
if (!AFFIX.isEmpty()) {//添加附件
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(AFFIX);
messageBodyPart.setDataHandler(new DataHandler(source));//添加附件的内容
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();//添加附件的标题
messageBodyPart.setFileName("=?GBK?B?" + enc.encode(AFFIXNAME.getBytes()) + "?=");
multipart.addBodyPart(messageBodyPart);
}
message.setContent(multipart);//将multipart对象放到message中
message.saveChanges(); //保存邮件
Transport transport = session.getTransport("smtp");//发送邮件
System.out.println("HOST:"+HOST);
System.out.println("USER:"+USER);
System.out.println("PWD:"+PWD);
transport.connect(HOST, USER, PWD);//连接服务器的邮箱
transport.sendMessage(message, message.getAllRecipients());//把邮件发送出去
transport.close();//关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
send("小花,我爱你");
}
}
听着挺高大上的,实现了就简单了。嘻嘻