这次把两种情况仔细说一下,因为好多人问啦。

第一种:企业邮箱

这里在这一篇已经说的很清楚了,这次不过是建立个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的更多相关文章

  1. python 发送邮件 <QQ+腾讯企业邮箱>

    一.使用QQ邮箱或者腾讯企业邮箱 python 发送邮件属于网络编程方向的,在工作中,我需要经常用邮件来检测我的程序运行状况.使用起来十分方便,这里我就用腾讯企业邮箱作为我的收发邮箱来使用. 使用py ...

  2. 网易免费企业邮箱Foxmail设置方法

    网易免费企业邮箱Foxmail7.0设置方法 第一步:启动 Foxmail 邮件客户端,点击工具->账号管理,弹出如下页面. 点击新建,如下: 填写自己企业邮箱账号,然后下一步,邮箱类型选择PO ...

  3. foxmail收取163企业邮箱设置,不能直接用foxmail默认的配置,否则一直提示帐号密码错误

    foxmail收取163企业邮箱设置,不能直接用foxmail默认的配置,否则一直提示帐号密码错误,收件.发件服务器配置需要用imap.ym.163.com,smtp.ym.163.com三级域名,帐 ...

  4. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  5. web开发(九) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6506027.html>,在此仅供学习参考之用. 一.发送 ...

  6. phpcms邮箱smtp配置163企业邮测试可用

    前面我们给phpcms加了https,但是修改邮箱smtp配置一直提交不了,提示请填写接口地址,格式为:http://www.abc.com,结尾不包含"/",找了一下phpsso ...

  7. jenkins 邮箱配置---腾讯企业邮箱

    一,简单设置 1.登陆jenkins--> 系统管理 ---> 系统设置 2.邮箱就是发送者的邮箱,密码是登陆邮箱的密码 3.设置完以后,可以点击‘test configuration’, ...

  8. mac下163企业邮箱客户端的配置

    一 添加账户       添加账户->添加其他邮件账户->输入电子邮件地址和密码.(全名随意起).   二 收件服务器和发件服务器的设置       收件服务器:pop.qiye.163. ...

  9. Java实现网易企业邮箱发送邮件

    最近项目需要用网易企业邮箱发送邮件,特意来将实现过程记录一下: maven导入jar包 <!-- javax.mai 核心包 --> <dependency> <grou ...

随机推荐

  1. 对ABBYY FineReader功能的探究

    ABBYY FineReader,一个强大的PDF阅读器和OCR识别器! 阅读主界面 OCR主界面 资源就不贴了,不过提示一下大家:Google Search 懒 得 勤 快,就可以找到. 经过研究, ...

  2. 22-1 web传输视频 Opencv+usb摄像头 树莓派+Flask实现视频流媒体WEB服务器

    第一篇 讲解原理 https://blog.miguelgrinberg.com/post/video-streaming-with-flask 第二篇 加入多线程可以直接用 https://gith ...

  3. Boring counting HDU - 3518 (后缀自动机)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  4. luogu_4762: [CERC2014]Virus synthesis

    洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. ...

  5. rundeck配置salt-api

    Rundeck 安装: 系统: # cat /etc/issue CentOS release 6.7 (Final) 内核: # uname -r -.el6.x86_64 IP 地址: 172.1 ...

  6. Vue项目预渲染机制

    我们知道SPA有很多优点,不过一个缺点就是对(不是Google的)愚蠢的搜索引擎的SEO不友好,为了照顾这些引擎,目前主要有两个方案:服务端渲染(Server Side Rendering).预渲染( ...

  7. 使用List中remove方法时需要注意的问题

    String str1 = new String("1"); String str2 = new String("2"); String str3 = new ...

  8. pyqt(day2)

    一.安装python 二.安装pyqt5 pip install pyqt5 三.安装pycharm 四.第一个pyqt程序 import sys from PyQt5.QtWidgets impor ...

  9. 【转】Spring Boot @Condition 注解,组合条件你知道吗

    原文:https://www.cnblogs.com/FraserYu/p/11280420.html 上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一 ...

  10. spring-boot 知识集锦

    1.spring-boot项目在外部tomcat环境下部署 https://blog.csdn.net/james_wade63/article/details/51009423 https://bl ...