今天来记录一下如何使用java来发送邮件

背景

之前项目有个需求,当产品出现故障时会把情况上送给服务器,服务器发送邮件将故障产品的位置以及故障信息等告知维修人员。发送邮件的接口不是我负责的,但是有兴趣了解一下

正文

首先看一下实现的步骤,然后在讲讲有可能遇到的问题

1.引入javax.mail依赖,我用的是springboot,所以依赖是这样引的

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

没用springboot框架的,自己去找一下

2.构建邮件基本信息类

package com.example.demo.comment.sendemail;

import java.util.Properties;

/**
* 发送邮件需要使用的基本信息
*
* @author 860118060
*/
public class MailSenderInfo {
/**
* 发送邮件的服务器的IP和端口
*/
private String mailServerHost;
private String mailServerPort = "25";
/**
* 邮件发送者的地址
*/
private String fromAddress;
/**
* 邮件接收者的地址
*/
private String toAddress;
/**
* 登陆邮件发送服务器的用户名和密码
*/
private String userName;
private String password;
/**
* 是否需要身份验证
*/
private boolean validate = false;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件的文本内容
*/
private String content;
/**
* 邮件附件的文件名
*/
private String[] attachFileNames; /**
* 获得邮件会话属性
*/
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
} public String getMailServerHost() {
return mailServerHost;
} public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
} public String getMailServerPort() {
return mailServerPort;
} public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
} public boolean isValidate() {
return validate;
} public void setValidate(boolean validate) {
this.validate = validate;
} public String[] getAttachFileNames() {
return attachFileNames;
} public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
} public String getFromAddress() {
return fromAddress;
} public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getToAddress() {
return toAddress;
} public void setToAddress(String toAddress) {
this.toAddress = toAddress;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getSubject() {
return subject;
} public void setSubject(String subject) {
this.subject = subject;
} public String getContent() {
return content;
} public void setContent(String textContent) {
this.content = textContent;
}
}

3.构建邮件发送器

package com.example.demo.comment.sendemail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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; /**
* 简单邮件(不带附件的邮件)发送器
*/
public class SimpleMailSender {
/**
* 以文本格式发送邮件
* @param mailInfo 待发送的邮件的信息
*/
public static boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
} /**
* 以HTML格式发送邮件
* @param mailInfo 待发送的邮件信息
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要身份认证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
}

4.构建密码验证器

package com.example.demo.comment.sendemail;
import javax.mail.*; /**
* @author 860118060
*/
public class MyAuthenticator extends Authenticator{
String userName=null;
String password=null; public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
} @Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}

至此准备工作都完成了,下面看一下如何调用吧

5.调用Demo

package com.example.demo.comment.sendemail;

public class SendEmailDemo {
public static void main(String[] args){
//这个类主要是设置邮件
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.163.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
// 发送方邮箱
mailInfo.setUserName("xxxxxxxx@163.com");
// 发送方邮箱密码
mailInfo.setPassword("xxxxxxxx");
// 发送方邮箱
mailInfo.setFromAddress("xxxxxxxx@163.com");
// 接收方邮箱
mailInfo.setToAddress("xxxxxxxx@qq.com");
// 邮件标题
mailInfo.setSubject("测试用邮箱发送邮件");
// 邮件内容
mailInfo.setContent("<h1>邮件内容非常丰富<h1>"); //发送文体格式
SimpleMailSender.sendTextMail(mailInfo);
//发送html格式
SimpleMailSender.sendHtmlMail(mailInfo);
}
}

这里有两种邮件发送格式

问题与总结

如果不出意外的话应该成功发送出两封邮件了,但是凡事都有万一,下面分析一下哪些问题会导致失败呢?

1.mailInfo.setMailServerHost("smtp.163.com");与mailInfo.setFromAddress("xxxxxxxx@163.com");这两句话。即如果你使用163smtp服务器,那么发送邮件地址就必须用163的邮箱,如果不的话,是不会发送成功的。

2.不要使用你刚刚注册过的邮箱在程序中发邮件,如果你的163邮箱是刚注册不久,那你就不要使用“smtp.163.com”。因为你发不出去。刚注册的邮箱是不会给你这种权限的,也就是你不能通过验证。要使用你经常用的邮箱,而且时间比较长的

3.qq邮箱作为发送方是有可能需要授权验证的。

授权如下:

在设置里面找到账户,往下拉找到并按照提示开启授权,然后将得到的授权码作为邮箱密码,即可成功发送邮件

最后顺便附上常用邮箱:

常用的邮箱服务器(SMTP、POP3)地址、端口

sina.com:

POP3服务器地址:pop3.sina.com.cn(端口:110) SMTP服务器地址:smtp.sina.com.cn(端口:25)

sinaVIP:

POP3服务器:pop3.vip.sina.com (端口:110) SMTP服务器:smtp.vip.sina.com (端口:25)

sohu.com:

POP3服务器地址:pop3.sohu.com(端口:110) SMTP服务器地址:smtp.sohu.com(端口:25)

126邮箱:

POP3服务器地址:pop.126.com(端口:110) SMTP服务器地址:smtp.126.com(端口:25)

139邮箱:

POP3服务器地址:POP.139.com(端口:110) SMTP服务器地址:SMTP.139.com(端口:25)

163.com:

POP3服务器地址:pop.163.com(端口:110) SMTP服务器地址:smtp.163.com(端口:25)

QQ邮箱

POP3服务器地址:pop.qq.com(端口:110)

SMTP服务器地址:smtp.qq.com (端口:25)

QQ企业邮箱

POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995) SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)

yahoo.com:

POP3服务器地址:pop.mail.yahoo.com SMTP服务器地址:smtp.mail.yahoo.com

yahoo.com.cn:

POP3服务器地址:pop.mail.yahoo.com.cn(端口:995) SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587

HotMail

POP3服务器地址:pop3.live.com (端口:995) SMTP服务器地址:smtp.live.com (端口:587)

gmail(google.com)

POP3服务器地址:pop.gmail.com(SSL启用 端口:995) SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)

263.net:

POP3服务器地址:pop3.263.net(端口:110) SMTP服务器地址:smtp.263.net(端口:25)

263.net.cn:

POP3服务器地址:pop.263.net.cn(端口:110) SMTP服务器地址:smtp.263.net.cn(端口:25)

x263.net:

POP3服务器地址:pop.x263.net(端口:110) SMTP服务器地址:smtp.x263.net(端口:25)

21cn.com:

POP3服务器地址:pop.21cn.com(端口:110) SMTP服务器地址:smtp.21cn.com(端口:25)

Foxmail:

POP3服务器地址:POP.foxmail.com(端口:110) SMTP服务器地址:SMTP.foxmail.com(端口:25)

china.com:

POP3服务器地址:pop.china.com(端口:110) SMTP服务器地址:smtp.china.com(端口:25)

tom.com:

POP3服务器地址:pop.tom.com(端口:110) SMTP服务器地址:smtp.tom.com(端口:25)

etang.com:

POP3服务器地址:pop.etang.com SMTP服务器地址:smtp.etang.com

在多说一句,本文档不属于教程,只是对自己学习的记录,大家可以参考一下,如果有什么错误欢迎指出

有时间在看看怎么在邮件中添加附件并分享出来

本次学习主要参考:https://www.cnblogs.com/kiwifly/p/4435867.html

上次时间有限就没有看如何添加附件,这次有时间整出来了,因为太简单了所以就接着写了。

只需要将发送html邮件的方法改动一下就行了,看一下代码

/**
* 以HTML格式发送邮件
* @param mailInfo 待发送的邮件信息
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要身份认证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html); //添加邮件
// 注意这里是MimeBodyPart
MimeBodyPart part = new MimeBodyPart();
// 这里放附件的路径(我就直接放桌面了)
part.attachFile("C:\\Users\\xxxxx\\Desktop\\123.PNG");
//多个附件也是一样的,创建多个MimeBodyPart ,最后放入mainPart 里面
mainPart.addBodyPart(part); // 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}

java发送邮件(一)--补充添加附件的更多相关文章

  1. 定时执行自动化脚本-(二)ant发送邮件及邮件中添加附件

    发送邮件及邮件添加附件均需要用java来实现 1.idea创建一个maven的java项目,目录结构如下 2.pom.xml文件添加依赖的javax.mail <dependencies> ...

  2. Java发送邮件(带附件)

    实现java发送邮件的过程大体有以下几步: 准备一个properties文件,该文件中存放SMTP服务器地址等参数. 利用properties创建一个Session对象 利用Session创建Mess ...

  3. java发送邮件带附件

    package com.smtp; import java.util.Vector; public class MailBean { private String to; // 收件人 private ...

  4. ASP.NET用QQ,网易发送邮件以及添加附件

    教程:ASP.NET用QQ,网易发送邮件以及添加附件 这是我用QQ邮箱出现的异常: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !无法从传输连接中读 ...

  5. java基础67 JavaScript通过关系找节点、添加附件(网页知识)

    1.通过关系找节点(父子关系,兄弟关系) 1.1.常用方法 parentNode:获取当前元素的父节点.    childNodes:获取当前元素的所有下一级子元素    firstChild:获取当 ...

  6. Java发送邮件初窥

    一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...

  7. 161013、java实现邮件群发带附件

    要完成Java群发邮件功能,首先须加入mail.jar和activation.jar这两个包 下面是邮件的例子: import java.io.File; import java.util.Prope ...

  8. Java发送邮件,所遇到的常见需求

    明天要做关于发送邮件的接口,虽然我之前已用Java Mail做过许多关于邮件的发送.但同事说有点难点,虽我还不知难点在哪,还是要复习下.凡事预则立,不预则废嘛~ 所需的包: Java Mail : 目 ...

  9. 用java发送邮件(黄海已测试通过)

    /** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...

随机推荐

  1. SpringBoot集成Druid实现监控

    application.properties文件完整信息 #连接数据库 spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spri ...

  2. flask调试模式

    想要启用调试模式,发现安装目前网上流行的两种方式均无法在Pycharm中打开调试模式. 1)直接在对象上设置 flask 更新到1.0以后 不支持使用debug =True 来开启调试模式了. Pri ...

  3. 题解 [51nod1607] 卷积和

    题面 解析 神仙LZF随机找出的毒瘤题. 一开始读题过于草率导致\(naive\)了. step 1 看上去特别像数位DP(实际上也有一点). 先预处理出有\(i\)位的数(最高位不为\(0\))的数 ...

  4. Javascritp 数据结构和二叉树算法

    1,所有圆圈都是一个节点,里面的数字就是节点的值.8上面没有父节点,那么8就是根节点,而4,7,13没有子节点了,称之为叶子结点.其他的称之为:中间结点. 2,8节点是3和10的父节点,3是8的左孩子 ...

  5. BZOJ 2834: 回家的路 Dijkstra

    按照横,竖为方向跑一个最短路即可,算是水题~ #include <bits/stdc++.h> #define N 200005 #define E 2000000 #define set ...

  6. iptables 有关计算机名解析问题

    遇到一奇怪现象: 1.开启防火墙(iptables)所有的用计算机名解析的连接全部是失效,但是用IP的一切正常.ping计算机名不通.但是ping IP地址一切OK: 2.关闭防火墙(iptables ...

  7. AngularJs 拦截器,拦截请求

    问题前述 我在项目中遇到这样一个问题: 在Angular项目中,会有很多需要用户点击操作的地方,如果用户点击过快会产生多次相同请求,会吃服务器带宽,如果这是其他涉及钱有关的操作,这会产生一个致命的问题 ...

  8. 使用 suspend 和 resume 暂停和恢复线程

    suspend 和 resume 的使用 在 Thread 类中有这样两个方法:suspend 和 resume,这两个方法是成对出现的. suspend() 方法的作用是将一个线程挂起(暂停), r ...

  9. 关于php文件操作的几个小trick

    记录一些ctf题目中近期遇到的一些文件操作trick,不定时更新 1.move_uploaded_file 一般用来保存上传的文件,第二个参数一般是最终保存的文件名,针对此函数,若在一定条件下$new ...

  10. 黑马vue---18、v-for指令的四种使用方式

    黑马vue---18.v-for指令的四种使用方式 一.总结 一句话总结: (item, i) in list:什么in什么的形式,前面是各种参数 1.v-for循环普通数组? <p v-for ...