【更新】Java发送邮件:个人邮箱(QQ & 网易163)+企业邮箱+Android
这次把两种情况仔细说一下,因为好多人问啦。
第一种:企业邮箱
这里在这一篇已经说的很清楚了,这次不过是建立个maven工程,引入了最新的javamail依赖,代码优化了一下。直接上代码
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId>
<artifactId>javamail-update</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build> </project>
CompanyEmail.properties
e.account=***@***.cn
e.pass=***
e.host=smtp.exmail.qq.com
e.port=465
e.protocol=smtp
SendEmailCompanyUtils
package com.demo; import com.sun.mail.util.MailSSLSocketFactory;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.util.StringUtils; 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.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties; /**
* 企业邮箱
*/
public class SendEmailCompanyUtils { private static String account; //登录用户名
private static String pass; //登录密码
private static String host; //服务器地址(邮件服务器)
private static String port; //端口
private static String protocol; //协议 static{
Properties prop = new Properties();
// InputStream instream = ClassLoader.getSystemResourceAsStream("CompanyEmail.properties");//测试环境
try {
// prop.load(instream);//测试环境
prop = PropertiesLoaderUtils.loadAllProperties("CompanyEmail.properties");//生产环境
} catch (IOException e) {
System.out.println("加载属性文件失败");
}
account = prop.getProperty("e.account");
pass = prop.getProperty("e.pass");
host = prop.getProperty("e.host");
port = prop.getProperty("e.port");
protocol = prop.getProperty("e.protocol");
} static class MyAuthenticator extends Authenticator {
String u = null;
String p = null; private MyAuthenticator(String u,String p){
this.u=u;
this.p=p;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(u,p);
}
} private String to; //收件人
private String subject; //主题
private String content; //内容
private String fileStr; //附件路径 public SendEmailCompanyUtils(String to, String subject, String content, String fileStr) {
this.to = to;
this.subject = subject;
this.content = content;
this.fileStr = fileStr;
} public void send(){
Properties prop = new Properties();
//协议
prop.setProperty("mail.transport.protocol", protocol);
//服务器
prop.setProperty("mail.smtp.host", host);
//端口
prop.setProperty("mail.smtp.port", port);
//使用smtp身份验证
prop.setProperty("mail.smtp.auth", "true");
//使用SSL,企业邮箱必需!
//开启安全协议
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
} Session session = Session.getDefaultInstance(prop, new MyAuthenticator(account, pass));
session.setDebug(true);
MimeMessage mimeMessage = new MimeMessage(session);
try {
//发件人
mimeMessage.setFrom(new InternetAddress(account,"XXX")); //可以设置发件人的别名
//mimeMessage.setFrom(new InternetAddress(account)); //如果不需要就省略
//收件人
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
//主题
mimeMessage.setSubject(subject);
//时间
mimeMessage.setSentDate(new Date());
//容器类,可以包含多个MimeBodyPart对象
Multipart mp = new MimeMultipart(); //MimeBodyPart可以包装文本,图片,附件
MimeBodyPart body = new MimeBodyPart();
//HTML正文
body.setContent(content, "text/html; charset=UTF-8");
mp.addBodyPart(body); //添加图片&附件
if(!StringUtils.isEmpty(fileStr)){
body = new MimeBodyPart();
body.attachFile(fileStr);
mp.addBodyPart(body);
} //设置邮件内容
mimeMessage.setContent(mp);
//仅仅发送文本
//mimeMessage.setText(content);
mimeMessage.saveChanges();
Transport.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
CompanySending
package com.demo; /**
* 发送线程
*/
public class CompanySending implements Runnable { private String to; //收件人
private String subject; //主题
private String content; //内容
private String fileStr; //附件路径 public CompanySending(String to, String subject, String content, String fileStr) {
this.to = to;
this.subject = subject;
this.content = content;
this.fileStr = fileStr;
} public void run() {
SendEmailCompanyUtils sendEmail = new SendEmailCompanyUtils(to, subject, content, fileStr);
sendEmail.send();
}
}
CompanySendingPool
package com.demo; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* 发送线程池
*/
public class CompanySendingPool {
private CompanySendingPool() {
}
private static class Inner{
private static CompanySendingPool instance = new CompanySendingPool();
} public static CompanySendingPool getInstance(){
return Inner.instance;
} /**
* 核心线程数:5
* 最大线程数:10
* 时间单位:秒
* 阻塞队列:10
*/
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
10,
0L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10)); public CompanySendingPool addThread(CompanySending sending){
executor.execute(sending);
return getInstance();
} public void shutDown(){
executor.shutdown();
}
}
测试
package com.demo; public class MyTest { public static void main(String[] args) {
CompanySendingPool pool = CompanySendingPool.getInstance();
pool.addThread(new CompanySending("***@qq.com", "AAA", createEmail().toString(), "file/1.jpg")).shutDown();
} private static StringBuilder createEmail() {
return new StringBuilder("<!DOCTYPE html><html><head><meta charset='UTF-8'><title>快来买桃子</title><style type='text/css'> .container{ font-family: 'Microsoft YaHei'; width: 600px; margin: 0 auto; padding: 8px; border: 3px dashed #db303f; border-radius: 6px; } .title{ text-align: center; color: #db303f; } .content{ text-align: justify; color: #717273; font-weight: 600; } footer{ text-align: right; color: #db303f; font-weight: 600; font-size: 18px; }</style></head><body><div class='container'><h2 class='title'>好吃的桃子</h2><p class='content'>桃子含有维生素A、维生素B和维生素C,儿童多吃桃子可使身体健康成长,因为桃子含有的多种维生索可以直接强化他们的身体和智力。</p><footer>联系桃子:11110000</footer></div></body></html>");
}
}
第二种:个人邮箱
--
--
--
--
--
记下授权码,一毛钱呢。下面上代码
PersonalEmail.properties
# 发件邮箱
e.account=from@qq.com
# 不需要密码
#e.pass=***
e.host=smtp.qq.com
e.port=25
e.protocol=smtp
# 授权码
e.authorizationCode=fvwmtg***bchb
SendEmailPersonalUtils
package com.demo; import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.util.StringUtils; 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.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties; /**
* 关于授权码:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
* 个人邮箱
*/
public class SendEmailPersonalUtils { private static String account; //登录用户名
private static String pass; //登录密码
private static String host; //服务器地址(邮件服务器)
private static String port; //端口
private static String protocol; //协议 static{
Properties prop = new Properties();
// InputStream instream = ClassLoader.getSystemResourceAsStream("PersonalEmail.properties");//测试环境
try {
// prop.load(instream);//测试环境
prop = PropertiesLoaderUtils.loadAllProperties("PersonalEmail.properties");//生产环境
} catch (IOException e) {
System.out.println("加载属性文件失败");
}
account = prop.getProperty("e.account");
// 个人邮箱需要授权码,而不是密码。在密码的位置上填写授权码
pass = prop.getProperty("e.authorizationCode");
host = prop.getProperty("e.host");
port = prop.getProperty("e.port");
protocol = prop.getProperty("e.protocol");
} static class MyAuthenticator extends Authenticator {
String u = null;
String p = null; private MyAuthenticator(String u,String p){
this.u=u;
this.p=p;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(u,p);
}
} private String to; //收件人
private String subject; //主题
private String content; //内容
private String fileStr; //附件路径 public SendEmailPersonalUtils(String to, String subject, String content, String fileStr) {
this.to = to;
this.subject = subject;
this.content = content;
this.fileStr = fileStr;
} public void send(){
Properties prop = new Properties();
//协议
prop.setProperty("mail.transport.protocol", protocol);
//服务器
prop.setProperty("mail.smtp.host", host);
//端口
prop.setProperty("mail.smtp.port", port);
//使用smtp身份验证
prop.setProperty("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(prop, new SendEmailPersonalUtils.MyAuthenticator(account, pass));
session.setDebug(true);
MimeMessage mimeMessage = new MimeMessage(session);
try {
//发件人
mimeMessage.setFrom(new InternetAddress(account,"XXX")); //可以设置发件人的别名
//mimeMessage.setFrom(new InternetAddress(account)); //如果不需要就省略
//收件人
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
//主题
mimeMessage.setSubject(subject);
//时间
mimeMessage.setSentDate(new Date());
//容器类,可以包含多个MimeBodyPart对象
Multipart mp = new MimeMultipart(); //MimeBodyPart可以包装文本,图片,附件
MimeBodyPart body = new MimeBodyPart();
//HTML正文
body.setContent(content, "text/html; charset=UTF-8");
mp.addBodyPart(body); //添加图片&附件
if(!StringUtils.isEmpty(fileStr)){
body = new MimeBodyPart();
body.attachFile(fileStr);
mp.addBodyPart(body);
} //设置邮件内容
mimeMessage.setContent(mp);
//仅仅发送文本
//mimeMessage.setText(content);
mimeMessage.saveChanges();
Transport.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
PersonalSending
package com.demo; /**
* 发送线程
*/
public class PersonalSending implements Runnable {
private String to; //收件人
private String subject; //主题
private String content; //内容
private String fileStr; //附件路径 public PersonalSending(String to, String subject, String content, String fileStr) {
this.to = to;
this.subject = subject;
this.content = content;
this.fileStr = fileStr;
} public void run() {
SendEmailPersonalUtils sendEmail = new SendEmailPersonalUtils(to, subject, content, fileStr);
sendEmail.send();
}
}
PersonalSendingPool
package com.demo; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* 发送线程池
*/
public class PersonalSendingPool { private PersonalSendingPool() {
}
private static class Inner{
private static PersonalSendingPool instance = new PersonalSendingPool();
} public static PersonalSendingPool getInstance(){
return PersonalSendingPool.Inner.instance;
} /**
* 核心线程数:5
* 最大线程数:10
* 时间单位:秒
* 阻塞队列:10
*/
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
10,
0L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10)); public PersonalSendingPool addThread(PersonalSending sending){
executor.execute(sending);
return getInstance();
} public void shutDown(){
executor.shutdown();
}
}
测试:
package com.demo; public class MyTest { public static void main(String[] args) {
PersonalSendingPool pool = PersonalSendingPool.getInstance();
pool.addThread(new PersonalSending("***@qq.com", "BBB", createEmail().toString(), "file/1.jpg")).shutDown();
} private static StringBuilder createEmail() {
return new StringBuilder("<!DOCTYPE html><html><head><meta charset='UTF-8'><title>快来买桃子</title><style type='text/css'> .container{ font-family: 'Microsoft YaHei'; width: 600px; margin: 0 auto; padding: 8px; border: 3px dashed #db303f; border-radius: 6px; } .title{ text-align: center; color: #db303f; } .content{ text-align: justify; color: #717273; font-weight: 600; } footer{ text-align: right; color: #db303f; font-weight: 600; font-size: 18px; }</style></head><body><div class='container'><h2 class='title'>好吃的桃子</h2><p class='content'>桃子含有维生素A、维生素B和维生素C,儿童多吃桃子可使身体健康成长,因为桃子含有的多种维生索可以直接强化他们的身体和智力。</p><footer>联系桃子:11110000</footer></div></body></html>");
}
}
如果是网易邮箱
进入设置
点击开启
不得不说,网易良心啊,不用短信费,输入正确的验证码之后
输入授权码(自己定义)
到此授权码设置完成。
然后呢,只需要打开PersonalEmail.properties属性文件。修改三个地方即可。
收到的
GitHub地址:https://github.com/Mysakura/JavaMail-Update
第三种:Android(有Android专门支持的jar包)
https://javaee.github.io/javamail/#JavaMail_for_Android
在中央仓库里也可以看见哦
https://mvnrepository.com/artifact/com.sun.mail/android-mail
https://mvnrepository.com/artifact/com.sun.mail/android-activation
【更新】Java发送邮件:个人邮箱(QQ & 网易163)+企业邮箱+Android的更多相关文章
- python 发送邮件 <QQ+腾讯企业邮箱>
一.使用QQ邮箱或者腾讯企业邮箱 python 发送邮件属于网络编程方向的,在工作中,我需要经常用邮件来检测我的程序运行状况.使用起来十分方便,这里我就用腾讯企业邮箱作为我的收发邮箱来使用. 使用py ...
- 网易免费企业邮箱Foxmail设置方法
网易免费企业邮箱Foxmail7.0设置方法 第一步:启动 Foxmail 邮件客户端,点击工具->账号管理,弹出如下页面. 点击新建,如下: 填写自己企业邮箱账号,然后下一步,邮箱类型选择PO ...
- foxmail收取163企业邮箱设置,不能直接用foxmail默认的配置,否则一直提示帐号密码错误
foxmail收取163企业邮箱设置,不能直接用foxmail默认的配置,否则一直提示帐号密码错误,收件.发件服务器配置需要用imap.ym.163.com,smtp.ym.163.com三级域名,帐 ...
- Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...
- web开发(九) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6506027.html>,在此仅供学习参考之用. 一.发送 ...
- phpcms邮箱smtp配置163企业邮测试可用
前面我们给phpcms加了https,但是修改邮箱smtp配置一直提交不了,提示请填写接口地址,格式为:http://www.abc.com,结尾不包含"/",找了一下phpsso ...
- jenkins 邮箱配置---腾讯企业邮箱
一,简单设置 1.登陆jenkins--> 系统管理 ---> 系统设置 2.邮箱就是发送者的邮箱,密码是登陆邮箱的密码 3.设置完以后,可以点击‘test configuration’, ...
- mac下163企业邮箱客户端的配置
一 添加账户 添加账户->添加其他邮件账户->输入电子邮件地址和密码.(全名随意起). 二 收件服务器和发件服务器的设置 收件服务器:pop.qiye.163. ...
- Java实现网易企业邮箱发送邮件
最近项目需要用网易企业邮箱发送邮件,特意来将实现过程记录一下: maven导入jar包 <!-- javax.mai 核心包 --> <dependency> <grou ...
随机推荐
- (1)树莓派3B+引脚
http://shumeipai.nxez.com/raspberry-pi-pins-version-40
- (尚029)Vue_案例_交互footer组件功能
需要实现界面截图: 难点分析:sAllCheck必须定义为计算属性 1.想到问题: 一旦写一个组件,需要接收哪些属性?? 因为只有属性确定了,标签才好写 todos属性可以确定三个方面的显示 2.做交 ...
- A1102 | 反转二叉树
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> # ...
- Pytest权威教程19-编写钩子(Hooks)方法函数
目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...
- linux高性能服务器编程 (六) --高级I/O函数
第六章 高级I/O函数 Linux提供了很多高级的I/O函数,它不是基础的I/O函数(open/read) 1.创建文件描述符的函数比如:pipe.dup/dup2函数 2.读写数据的函数比如:rea ...
- 【Spring Boot】内嵌容器
Spring Boot内嵌容器支持Tomcat.Jetty.Undertow. tomcat容器 spring boot 的web应用开发必须使用spring-boot-starter-web,其默认 ...
- 11 JavaScript Utility Libraries you Should Know in 2019
11 Useful Javascript utility libraries to speed your development.
- mysql 后台运行命令
nohup mysql -u sa -pabcd1234 -e 'source /db.sql' &
- 【深入学习linux】CentOS 7 最小化安装后程序必须安装的组件
centos平台编译环境使用如下指令 安装make: yum -y install gcc automake autoconf libtool make 安装g++: yum install gcc ...
- java base64编码解码
第一种.DatatypeConverter 使用JDK自带DatatypeConverter.java类实现,JDK版本必须>=1.6 /** * @Description base64编码 * ...