JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现,也可以使用Spring Boot封装的方法,使用起来更加便捷。

 一、下载JavaMail的架包,并导入项目中,如下:

如果是maven项目,maven依赖如下:

 <dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
</dependency>

如果使用spring的方法,还需要导入以下maven依赖:

 <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>

二、使用JavaMail发邮件的代码例子,如下:

1、在main函数中对各项参数进行赋值(参数说明已进行备注),即可通过send函数进行发送邮件操作。

 public class TestEmail {

     private final static String TIMEOUT_MS = "20000";

     public static void main(String[] args) {
String host = "smtp.exmail.qq.com";
String user = "xxxxxx@qq.com";
String password = "xxxxxx";
String recipients = "xxxxxx@qq.com";
String cc = "";
String subject = "邮件发送测试";
String content = "邮件正文:<br>你好!";
//方式1:通过URL获取附件
// byte[] attachment = FileUtil.getBytesByUrl("http://127.0.0.1/project/test.pdf");
//方式2:通过本地路径获取附件
byte[] attachment = FileUtil.getBytesByFile("c://fujian.pdf"); String attachmentName = "";
try {
attachmentName = MimeUtility.encodeWord("这是附件.pdf");
send(host, user, password, recipients, cc, subject, content, attachment, attachmentName);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @param host 邮件服务器主机名
* @param user 用户名
* @param password 密码
* @param recipients 收件人
* @param cc 抄送人
* @param subject 主题
* @param content 内容
* @param attachment 附件 [没有传 null]
* @param attachmentName 附件名称 [没有传 null]
* @throws Exception
*/
public static void send(final String host, final String user, final String password,
final String recipients, final String cc, final String subject, final String content,
final byte[] attachment,final String attachmentName) throws Exception {
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.timeout", TIMEOUT_MS); Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
};
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(user));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
if (cc != null && cc.length() > 0) {
msg.setRecipients(Message.RecipientType.CC, cc);
}
msg.setSubject(subject);
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(content, "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
// 添加附件的内容
if (attachment!=null) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new ByteArrayDataSource(attachment,"application/octet-stream");
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachmentName));
multipart.addBodyPart(attachmentBodyPart);
}
// 将multipart对象放到message中
msg.setContent(multipart);
// 保存邮件
msg.saveChanges();
Transport.send(msg, msg.getAllRecipients());
}
}

2、上面的例子中,如果有附件,可对附件进行设置。附件传参类型为byte数组,这里举2个例子,方式1通过网址获取byte数组,如下。方式2通过本地文件获取byte数组。具体可以查看另一篇文章:JAVA中文件与Byte数组相互转换的方法

 public class FileUtil {

     public static byte[] getBytesByUrl(String urlStr) {
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final int BUFFER_SIZE = 2048;
final int EOF = -1;
int c;
byte[] buf = new byte[BUFFER_SIZE];
while (true) {
c = bis.read(buf);
if (c == EOF)
break;
baos.write(buf, 0, c);
}
conn.disconnect();
is.close(); byte[] data = baos.toByteArray();
baos.flush();
return data; } catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

2020-5-26 更新:

三、使用Spring Boot发邮件的代码例子,如下:

 public class MailUtil {

     private static JavaMailSenderImpl javaMailSender;

     private static final String SENDER = "xxxxxx@qq.com";

     static {
javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.qq.com");// 链接服务器
// javaMailSender.setPort(25);// 默认使用25端口发送
javaMailSender.setUsername("xxxxxx@qq.com");// 邮箱账号
javaMailSender.setPassword("xxxxxxxxxx");// 授权码
javaMailSender.setDefaultEncoding("UTF-8");
// javaMailSender.setProtocol("smtp"); // Properties properties = new Properties();
// properties.setProperty("mail.debug", "true");// 启用调试
// properties.setProperty("mail.smtp.timeout", "1000");// 设置链接超时
// 设置通过ssl协议使用465端口发送、使用默认端口(25)时下面三行不需要
// properties.setProperty("mail.smtp.auth", "true");// 开启认证
// properties.setProperty("mail.smtp.socketFactory.port", "465");// 设置ssl端口
// properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // javaMailSender.setJavaMailProperties(properties);
} public static void main(String[] args) throws Exception {
sendSimpleMail(new String[]{"xxxxxx@qq.com"}, "邮件主题", "邮件内容", false);
} /**
* 发送普通邮件
*
* @param to 收件人
* @param subject 主题
* @param text 正文
* @param isHtml 正文是否为html格式
*/
public static void sendSimpleMail(String[] to, String subject, String text, boolean isHtml) throws Exception {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER, "通知");
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text, isHtml);
javaMailSender.send(message);
} /**
* 发送带附件邮件
*
* @param to 收件人
* @param subject 主题
* @param text 正文
* @param files 附件
*/
public static void sendAttachmentMail(String[] to, String subject, String text, Map<String, File> files) throws Exception {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER, "通知");
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
Set<Map.Entry<String, File>> fileSet = files.entrySet();
for (Map.Entry f : fileSet) {
helper.addAttachment((String) f.getKey(), (File) f.getValue());
}
javaMailSender.send(message);
}
}

  注意12行的password不是你邮箱的登录密码,而是在邮箱中生成的授权码。获取授权码方法如下:

登录QQ邮箱→设置→账户→POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务→开启“POP3/SMTP服务”,获取到一个授权码。

JAVA中发送电子邮件的方法的更多相关文章

  1. 转: "SMTP 服务器无法识别在 Mac 2011 Outlook 中发送电子邮件时错误。错误 17092"

    在 Mac 2011 Outlook 中发送电子邮件时,您可能会收到下面的错误消息: 无法发送邮件.SMTP 服务器无法识别任何 Outlook 所支持的身份验证方法.请尝试更改帐户设置中的 SMTP ...

  2. 在ASP.NET中发送电子邮件的实例教程

    首先.导入命名空间: 代码如下 复制代码 using System.Net.Mail; 定义发送电子邮件的方法[网上很多不同的,可以对比着看一下,WinForm的也适用]: 代码如下 复制代码 /// ...

  3. java中substring的使用方法

    java中substring的使用方法 str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str ...

  4. Java中Set的contains()方法

    Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...

  5. mutt+msmtp实现在shell环境中发送电子邮件

    作者:邓聪聪 为了自动化接收服务端的文件备份信息,利用mutt+msmtp在shell环境中发送电子邮件,轻松高效的完成运维工作. 下载msmtp wget http://downloads.sour ...

  6. [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较

    java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0);  设置长度为0 2. buffer.delete(0, buffer.length() ...

  7. java中BorderLayout的使用方法

    相关设置: 使用BorderLayout布局上下左右中布局5个按键,单击中间的那个按键时就关闭窗口 代码: /**** *java中BorderLayout的使用方法 * 使用BorderLayout ...

  8. 【Java】Java中常用的String方法

    本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...

  9. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

随机推荐

  1. SpringMVC handleMapping 处理器映射器 属性清单

    映射器的属性清单 defaultHandler         在映射与所有处理器都不匹配的情况下,指定默认的处理器(处理器即你定义的Controller(action)类) order        ...

  2. ADO对SQL Server 2008数据库的基础操作

    最近在学习ADO与数据库的相关知识,现在我将自己学到的东西整理写出来,也算是对学习的一种复习. 这篇文章主要说明如何遍历某台机器上所有的数据库服务,遍历某个服务中所有的数据库,遍历数据库中的所有表以及 ...

  3. spring 实现邮箱发送

    使用spring mail 实现的邮箱发送功能,包括附件的发送(附件发送要保证附件存在的路径是真实),使用maven集成jar包,通过spring mvc 实现前后台的调用,发送方使用的是163邮箱, ...

  4. msfvenom向apk注入payload

    首先安装apt-get install apkinjector 这个东西,msfvenom重新组装apk的时候会自动调用 msfvenom -x /路径/apk android/meterpreter ...

  5. 【批处理学习笔记】第二十九课:ASCII码

    前面的例子中,我们已经使用过一次ASCII码了,也就是那个笑脸.ASCII码是图形化的符号,可以用来点缀我们的批处理的.    在cmd窗口中我们可以通过任意一个字符的ASCII码来输入该字符,比如C ...

  6. train problem I (栈水题)

    杭电1002http://acm.hdu.edu.cn/showproblem.php?pid=1022 Train Problem I Time Limit: 2000/1000 MS (Java/ ...

  7. flume1.8 Sinks类型介绍(三)

    1. Flume Sinks 1.1 HDFS Sink 该sink把events写进Hadoop分布式文件系统(HDFS).它目前支持创建文本和序列文件.它支持在两种文件类型压缩.文件可以基于数据的 ...

  8. 《You dont know JS》值相关总结

    值 一:和数组相关的几个需要关注的点 数组可以容纳任何类型的值. 数组声明时不需要预先设置大小.可以动态改变. 使用delete运算符可以将数组中的某个元素删除,但是这个操作不会改变数组的length ...

  9. 十二个 ASP.NET Core 例子——配置操作

    目录: 简单配置(利用configration 键值读取) 使用选项和配置对象(自定义类绑定配置文件实现读取) IOptionsSnapshot(配置文件更改时也变化) 内存数据放到配置对象中 实体框 ...

  10. Lucene学习笔记1(V7.1)

    Lucene是一个搜索类库,solr.nutch和elasticsearch都是基于Lucene.个人感觉学习高级搜索引擎应用程序之前 有必要了解Lucene. 开发环境:idea maven spr ...