使用javax.mail发送邮件

it2022-05-09  58

作为一个Java开发工程师,发送邮件是必须掌握,因为很多的网站使用邮箱来注册,或者使用邮箱来重置密码,使用非常普遍。

1、步骤总结

使用javax.mail包中的api发送邮件,大致有5个步骤

1、继承Authenticator类,重写getPasswordAuthentication方法。用于登录校验。

2、创建一个Properties对象,用于存放SMTP服务器地址、端口号

3、用步骤1和2得到的对象创建一个Session对象,相当于邮箱登录

4、创建一个MimeMessage,设置发件人、收件人、抄送人、主题、内容,添加附件

5、Transport发送邮件

2、关于邮件协议和端口

常用的电子协议协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP簇,默认状态下,分别通过TCP端口25、110和143建立连接。

发送邮件基于SMTP协议。下面列出了常用的邮件服务器地址和端口。(感谢数据的整理者):

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

3、发送邮件

接下来上干货。

3.1、添加依赖

我的工程师Maven工程,所以在pom.xml中直接添加依赖

<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency>

3.2、继承Authenticator并重写getPasswordAuthentication方法

import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; 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; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, password); } }

3.3、发送邮件核心类Email

import java.util.List; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.activation.MailcapCommandMap; import javax.mail.BodyPart; import javax.mail.Message; 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; import javax.mail.internet.MimeUtility; public class Email { private String smtpHost; // 邮件服务器地址 private String sendUserName; // 发件人的用户名 private String sendUserPass; // 发件人密码 private MimeMessage mimeMsg; // 邮件对象 private Multipart mp;// 附件添加的组件 private void init() { // 创建一个密码验证器 MyAuthenticator authenticator = null; authenticator = new MyAuthenticator(sendUserName, sendUserPass); // 实例化Properties对象 Properties props = System.getProperties(); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); // 需要身份验证 props.put("mail.smtp.starttls.enable", "true"); // 建立会话 Session session = Session.getDefaultInstance(props, authenticator); // 置true可以在控制台(console)上看到发送邮件的过程 session.setDebug(true); // 用session对象来创建并初始化邮件对象 mimeMsg = new MimeMessage(session); // 生成附件组件的实例 mp = new MimeMultipart(); } private Email(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject, String mailBody, List<String> attachments) { this.smtpHost = smtpHost; this.sendUserName = sendUserName; this.sendUserPass = sendUserPass; init(); setFrom(sendUserName); setTo(to); setCC(cc); setBody(mailBody); setSubject(mailSubject); if (attachments != null) { for (String attachment : attachments) { addFileAffix(attachment); } } } /** * 邮件实体 * * @param smtpHost * 邮件服务器地址 * @param sendUserName * 发件邮件地址 * @param sendUserPass * 发件邮箱密码 * @param to * 收件人,多个邮箱地址以半角逗号分隔 * @param cc * 抄送,多个邮箱地址以半角逗号分隔 * @param mailSubject * 邮件主题 * @param mailBody * 邮件正文 * @param attachmentPath * 附件路径 * @return */ public static Email entity(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject, String mailBody, List<String> attachments) { return new Email(smtpHost, sendUserName, sendUserPass, to, cc, mailSubject, mailBody, attachments); } /** * 设置邮件主题 * * @param mailSubject * @return */ private boolean setSubject(String mailSubject) { try { mimeMsg.setSubject(mailSubject); } catch (Exception e) { return false; } return true; } /** * 设置邮件内容,并设置其为文本格式或HTML文件格式,编码方式为UTF-8 * * @param mailBody * @return */ private boolean setBody(String mailBody) { try { BodyPart bp = new MimeBodyPart(); bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>" + mailBody, "text/html;charset=UTF-8"); // 在组件上添加邮件文本 mp.addBodyPart(bp); } catch (Exception e) { System.err.println("设置邮件正文时发生错误!" + e); return false; } return true; } /** * 添加一个附件 * * @param filename * 邮件附件的地址,只能是本机地址而不能是网络地址,否则抛出异常 * @return */ public boolean addFileAffix(String filename) { try { if (filename != null && filename.length() > 0) { BodyPart bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(filename); bp.setDataHandler(new DataHandler(fileds)); bp.setFileName(MimeUtility.encodeText(fileds.getName(), "utf-8", null)); // 解决附件名称乱码 mp.addBodyPart(bp);// 添加附件 } } catch (Exception e) { System.err.println("增加邮件附件:" + filename + "发生错误!" + e); return false; } return true; } /** * 设置发件人地址 * * @param from * 发件人地址 * @return */ private boolean setFrom(String from) { try { mimeMsg.setFrom(new InternetAddress(from)); } catch (Exception e) { return false; } return true; } /** * 设置收件人地址 * * @param to收件人的地址 * @return */ private boolean setTo(String to) { if (to == null) return false; try { mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); } catch (Exception e) { return false; } return true; } /** * 设置抄送 * * @param cc * @return */ private boolean setCC(String cc) { if (cc == null) { return false; } try { mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); } catch (Exception e) { return false; } return true; } /** * no object DCH for MIME type multipart/mixed报错解决 */ private void solveError() { MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap( "multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); Thread.currentThread().setContextClassLoader(Email.class.getClassLoader()); } /** * 发送邮件 * * @return */ public boolean send() throws Exception { mimeMsg.setContent(mp); mimeMsg.saveChanges(); System.out.println("正在发送邮件...."); solveError(); Transport.send(mimeMsg); System.out.println("发送邮件成功!"); return true; } }

3.4、测试类

import java.util.Arrays; import java.util.List; import org.junit.Test; public class EmailTest { @Test public void sendEmail() throws Exception { String userName = "1658633515@qq.com"; // 发件人邮箱 String password = "************"; // 发件人密码,其实不一定是邮箱的登录密码,对于QQ邮箱来说是SMTP服务的授权文本 String smtpHost = "smtp.qq.com"; // 邮件服务器 String to = "3527824124@qq.com"; // 收件人,多个收件人以半角逗号分隔 String cc = "2779653121@qq.com"; // 抄送,多个抄送以半角逗号分隔 String subject = "这是邮件的主题"; // 主题 String body = "这是邮件的正文"; // 正文,可以用html格式的哟 List<String> attachments = Arrays.asList("D:\\安装包\\测试附件1.pdf", "D:\\安装包\\测试附件2.doc"); // 附件的路径,多个附件也不怕 Email email = Email.entity(smtpHost, userName, password, to, cc, subject, body, attachments); email.send(); // 发送! } }

 

 

本文参考:https://blog.csdn.net/sivanl/article/details/80459228


最新回复(0)