台州网站公司,电子商务网站的建设及规划,如何选择昆明网站建设,高端网站建设内容文章目录一、发邮件流程二、关于邮件协议和端口三、开启邮件协议和端口3.1. QQ邮箱3.2. 163邮箱四、实战发送邮件4.1. 引入依赖4.2. 方法重写4.3. 发送邮件核心类工具类EmailUtils五、QQ邮件发送测试5.1. QQ发送测试5.2. 查看QQ发送邮箱5.3. 查看收件人收件箱六、163邮件发送测…
文章目录一、发邮件流程二、关于邮件协议和端口三、开启邮件协议和端口3.1. QQ邮箱3.2. 163邮箱四、实战发送邮件4.1. 引入依赖4.2. 方法重写4.3. 发送邮件核心类工具类EmailUtils五、QQ邮件发送测试5.1. QQ发送测试5.2. 查看QQ发送邮箱5.3. 查看收件人收件箱六、163邮件发送测试6.1. 163发送测试6.2. 查看163发送邮箱6.3. 查看收件人收件箱七、企业需求实战7.1. Email工具类7.2. 单元测试一、发邮件流程
使用javax.mail包中的api发送邮件大致有5个步骤
1、继承Authenticator类重写getPasswordAuthentication方法。用于登录校验。2、创建一个Properties对象用于存放SMTP服务器地址、端口号3、用步骤1和2得到的对象创建一个Session对象相当于邮箱登录4、创建一个MimeMessage设置发件人、收件人、抄送人、主题、内容添加附件5、Transport发送邮件
二、关于邮件协议和端口
常用的电子协议协议有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 端口25sohu.com:
POP3服务器地址:pop3.sohu.com端口110
SMTP服务器地址:smtp.sohu.com端口25126邮箱
POP3服务器地址:pop.126.com端口110
SMTP服务器地址:smtp.126.com端口25139邮箱
POP3服务器地址POP.139.com端口110
SMTP服务器地址SMTP.139.com(端口25)163.com:
POP3服务器地址:pop.163.com端口110
SMTP服务器地址:smtp.163.com端口25QQ邮箱
POP3服务器地址pop.qq.com端口110
SMTP服务器地址smtp.qq.com 端口25QQ企业邮箱
POP3服务器地址pop.exmail.qq.com SSL启用 端口995
SMTP服务器地址smtp.exmail.qq.comSSL启用 端口587/465yahoo.com:
POP3服务器地址:pop.mail.yahoo.com
SMTP服务器地址:smtp.mail.yahoo.comyahoo.com.cn:
POP3服务器地址:pop.mail.yahoo.com.cn端口995
SMTP服务器地址:smtp.mail.yahoo.com.cn端口587HotMail
POP3服务器地址pop3.live.com 端口995
SMTP服务器地址smtp.live.com 端口587gmail(google.com)
POP3服务器地址:pop.gmail.comSSL启用 端口995
SMTP服务器地址:smtp.gmail.comSSL启用 端口587263.net:
POP3服务器地址:pop3.263.net端口110
SMTP服务器地址:smtp.263.net端口25263.net.cn:
POP3服务器地址:pop.263.net.cn端口110
SMTP服务器地址:smtp.263.net.cn端口25x263.net:
POP3服务器地址:pop.x263.net端口110
SMTP服务器地址:smtp.x263.net端口2521cn.com:
POP3服务器地址:pop.21cn.com端口110
SMTP服务器地址:smtp.21cn.com端口25Foxmail
POP3服务器地址:POP.foxmail.com端口110
SMTP服务器地址:SMTP.foxmail.com端口25china.com:
POP3服务器地址:pop.china.com端口110
SMTP服务器地址:smtp.china.com端口25tom.com:
POP3服务器地址:pop.tom.com端口110
SMTP服务器地址:smtp.tom.com端口25etang.com:
POP3服务器地址:pop.etang.com
SMTP服务器地址:smtp.etang.com三、开启邮件协议和端口
3.1. QQ邮箱 3.2. 163邮箱 四、实战发送邮件
4.1. 引入依赖 dependencygroupIdjavax.mail/groupIdartifactIdmail/artifactIdversion1.4/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.9/versionscopetest/scope/dependency4.2. 方法重写
继承Authenticator并重写getPasswordAuthentication方法
package com.gblfy.mail;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);}
}4.3. 发送邮件核心类工具类EmailUtils
package com.gblfy.mail.util;import com.gblfy.mail.MyAuthenticator;import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.List;
import java.util.Properties;/*** 使用javax.mail发送邮件** author: gblfy* date 2021-06-22** p* 参数列表:* 1.邮件服务器* 2.发件人邮箱* 3.发件人的授权密码* 4.邮件主题* 5.收件人多个收件人以半角逗号分隔* 6.抄送多个抄送以半角逗号分隔* 7.正文可以用html格式的哟* /p*/
public class EmailUtils {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 EmailUtils(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject,String mailBody, ListString 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 attachments 附件路径* return*/public static EmailUtils entity(String smtpHost, String sendUserName, String sendUserPass, String to, String cc,String mailSubject, String mailBody, ListString attachments) {return new EmailUtils(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-equivContent-Type contenttext/html; charsetUTF-8 mailBody,text/html;charsetUTF-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-handlercom.sun.mail.handlers.text_html);mc.addMailcap(text/xml;; x-java-content-handlercom.sun.mail.handlers.text_xml);mc.addMailcap(text/plain;; x-java-content-handlercom.sun.mail.handlers.text_plain);mc.addMailcap(multipart/*;; x-java-content-handlercom.sun.mail.handlers.multipart_mixed; x-java-fallback-entrytrue);mc.addMailcap(message/rfc822;; x-java-content-handlercom.sun.mail.handlers.message_rfc822);CommandMap.setDefaultCommandMap(mc);Thread.currentThread().setContextClassLoader(EmailUtils.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;}
}
五、QQ邮件发送测试
5.1. QQ发送测试
package com.gblfy.mail;import com.gblfy.mail.util.EmailUtils;
import org.junit.Test;import java.util.Arrays;
import java.util.List;public class MailApplicationTests {Testpublic void sendEmail() throws Exception {//QQ邮箱测试String userName 754263923qq.com; // 发件人邮箱String password wzxsscqpvrikbbfa; // 发件人密码其实不一定是邮箱的登录密码对于QQ邮箱来说是SMTP服务的授权文本String smtpHost smtp.qq.com; // 邮件服务器//163邮箱测试// String userName gblfy02163.com; // 发件人邮箱// String password TBFJUSKCUOPEYOYU; // 发件人密码其实不一定是邮箱的登录密码对于QQ邮箱来说是SMTP服务的授权文本// String smtpHost smtp.163.com; // 邮件服务器String to guo_binsinosoft.com.cn; // 收件人多个收件人以半角逗号分隔String cc songzihaosinosoft.com.cn; // 抄送多个抄送以半角逗号分隔String subject 这是邮件的主题 163; // 主题String body 这是邮件的正文163; // 正文可以用html格式的哟ListString attachments Arrays.asList(D:\\安装包\\【繁星课堂】DataX3.0离线同步课件.pdf, D:\\安装包\\权限控制优化需求.docx); // 附件的路径多个附件也不怕EmailUtils emailUtils EmailUtils.entity(smtpHost, userName, password, to, cc, subject, body, attachments);emailUtils.send(); // 发送}}
5.2. 查看QQ发送邮箱 5.3. 查看收件人收件箱 正常发送正常接收
六、163邮件发送测试
6.1. 163发送测试
package com.gblfy.mail;import com.gblfy.mail.util.EmailUtils;
import org.junit.Test;import java.util.Arrays;
import java.util.List;public class MailApplicationTests {Testpublic void sendEmail() throws Exception {//QQ邮箱测试// String userName 754263923qq.com; // 发件人邮箱// String password wzxsscqpvrikbbfa; // 发件人密码其实不一定是邮箱的登录密码对于QQ邮箱来说是SMTP服务的授权文本// String smtpHost smtp.qq.com; // 邮件服务器//163邮箱测试String userName gblfy02163.com; // 发件人邮箱String password TBFJUSKCUOPEYOYU; // 发件人密码其实不一定是邮箱的登录密码对于QQ邮箱来说是SMTP服务的授权文本String smtpHost smtp.163.com; // 邮件服务器String to guo_binxxx.com.cn; // 收件人多个收件人以半角逗号分隔String cc songzihaoxxx.com.cn; // 抄送多个抄送以半角逗号分隔String subject 这是邮件的主题 163; // 主题String body 这是邮件的正文163; // 正文可以用html格式的哟ListString attachments Arrays.asList(D:\\安装包\\【繁星课堂】DataX3.0离线同步课件.pdf, D:\\安装包\\权限控制优化需求.docx); // 附件的路径多个附件也不怕EmailUtils emailUtils EmailUtils.entity(smtpHost, userName, password, to, cc, subject, body, attachments);emailUtils.send(); // 发送}}
6.2. 查看163发送邮箱 6.3. 查看收件人收件箱 七、企业需求实战
7.1. Email工具类
package com.gblfy.email.util;import com.gblfy.email.config.EmailAuthenticatorConfig;import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.List;
import java.util.Properties;/*** 使用javax.mail发送邮件** author: gblfy* date 2021-10-15** p* 参数列表:* 1.邮件服务器* 2.发件人邮箱* 3.发件人的授权密码* 4.邮件主题* 5.收件人多个收件人以半角逗号分隔* 6.抄送多个抄送以半角逗号分隔* 7.正文可以用html格式的哟* /p*/
public class EmailUtils {private String smtpHost; // 邮件服务器地址private String sendUserName; // 发件人的用户名private String sendUserPass; // 发件人密码private MimeMessage mimeMsg; // 邮件对象private Multipart mp;// 附件添加的组件private void init() {// 创建一个密码验证器EmailAuthenticatorConfig authenticator null;authenticator new EmailAuthenticatorConfig(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);props.put(mail.transport.protocol, smtp);// 建立会话Session session Session.getDefaultInstance(props, authenticator);// 置true可以在控制台console)上看到发送邮件的过程session.setDebug(true);// 用session对象来创建并初始化邮件对象mimeMsg new MimeMessage(session);// 生成附件组件的实例mp new MimeMultipart();}private EmailUtils(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject,String mailBody, ListString 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 attachments 附件路径* return*/public static EmailUtils entity(String smtpHost, String sendUserName, String sendUserPass, String to, String cc,String mailSubject, String mailBody, ListString attachments) {return new EmailUtils(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-equivContent-Type contenttext/html; charsetUTF-8 mailBody,text/html;charsetUTF-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-handlercom.sun.mail.handlers.text_html);mc.addMailcap(text/xml;; x-java-content-handlercom.sun.mail.handlers.text_xml);mc.addMailcap(text/plain;; x-java-content-handlercom.sun.mail.handlers.text_plain);mc.addMailcap(multipart/*;; x-java-content-handlercom.sun.mail.handlers.multipart_mixed; x-java-fallback-entrytrue);mc.addMailcap(message/rfc822;; x-java-content-handlercom.sun.mail.handlers.message_rfc822);CommandMap.setDefaultCommandMap(mc);Thread.currentThread().setContextClassLoader(EmailUtils.class.getClassLoader());}/*** 发送邮件** return*/public String send() throws Exception {mimeMsg.setContent(mp);mimeMsg.saveChanges();System.out.println(正在发送邮件....);solveError();try {Transport.send(mimeMsg);return 发送邮件成功;} catch (MessagingException e) {e.printStackTrace();return 发送邮件异常;}}/*** 对账结果通知邮件模板** param named 称呼* param totalNum 对账批次总个数* param succBatchNum 对账成功批次个数* param checkInformSucc 对账成功批次* param checkInformMiddle 对账中批次* param checkInformDiff 对账差异批次* param smtpHost 邮件代理服务器IP* param sendUserName 发送人邮箱* param sendUserPass 发送人邮箱秘钥* param to 收件人邮箱* param cc 抄送人邮箱* param attachments 附件*/public static String checkInformEmailNotice(String named, int totalNum, int succBatchNum, String checkInformSucc,String checkInformMiddle, String checkInformDiff, String smtpHost,String sendUserName, String sendUserPass, String to, String cc,ListString attachments) throws Exception {String subject 【装载结果通知】 DateDeal.getYesterday() 共报送 totalNum 个批次对账成功 succBatchNum 个批次; // 主题String body pre\n named 您好!\n \n 对账状态信息\n 对账成功批次 checkInformSucc 。\n 对账中批次 checkInformMiddle ,请您及时处理。\n 对账存在差异批次 checkInformDiff ,请您及时处理。\n /pre;EmailUtils emailUtils EmailUtils.entity(smtpHost, sendUserName, sendUserPass, to, cc, subject, body, attachments);return emailUtils.send();// 发送}/*** param named 称呼* param totalLoadNum 装载总批次个数* param loadAllSuccNum 装载全部成功批次个数* param loadMiddle 装载中批次* param LoadAllSucc 装载全部成功批次* param partLoadSucc 装载部分成功批次* param withoutLoad 尚未装载批次* param smtpHost 邮件代理服务器IP* param sendUserName 发送人邮箱* param sendUserPass 发送人邮箱秘钥* param to 收件人邮箱* param cc 抄送人邮箱* param attachments 附件* return* throws Exception*/public static String loadEmailNotice(String named, int totalLoadNum, int loadAllSuccNum, String loadMiddle, String LoadAllSucc,String partLoadSucc, String withoutLoad, String smtpHost,String sendUserName, String sendUserPass, String to, String cc,ListString attachments) throws Exception {String subject 【数据装载结果通知】 DateDeal.getToday() 共报送 totalLoadNum 个批次装载全部成功 loadAllSuccNum 个批次; // 主题String body pre\n named 您好!\n \n 数据装载状态信息\n 装载中批次 loadMiddle 。\n 装载全部成功批次 LoadAllSucc 。\n 装载部分成功批次 partLoadSucc \n 尚未装载批次 withoutLoad 。\n /pre;EmailUtils emailUtils EmailUtils.entity(smtpHost, sendUserName, sendUserPass, to, cc, subject, body, attachments);return emailUtils.send();// 发送}
}7.2. 单元测试
package com.gblfy.email.util;import com.gblfy.email.modular.check.dto.Emailsubject;
import org.junit.Test;public class EmailTest {Testpublic void checkInformEmailNoticeTest() throws Exception {//测试模拟数据Emailsubject emailsubject new Emailsubject();emailsubject.setSendEmail(xxxxxx.com);emailsubject.setProxyserverHost(192.168.xxx.xxx);emailsubject.setSendEmailPwd(Gblfy.com);emailsubject.setReceiveEmail(xxxxxx.com);emailsubject.setCcEmail(xxxxxx.com,xxxxxx.com,xxxxxx.com,xxxxxx.com);String msg EmailUtils.checkInformEmailNotice(运维人员, 5, 5, 001,002,0002, 004,00005 , emailsubject.getProxyserverHost(),emailsubject.getSendEmail(), emailsubject.getSendEmailPwd(), emailsubject.getReceiveEmail(), emailsubject.getCcEmail(), null);System.out.println(msg msg);}Testpublic void loadEmailNoticeTest() throws Exception {//测试模拟数据Emailsubject emailsubject new Emailsubject();emailsubject.setSendEmail(xxxxxx.com);emailsubject.setProxyserverHost(192.168.xxx.xxx);emailsubject.setSendEmailPwd(Gblfy.com);emailsubject.setReceiveEmail(xxxxxx.com);emailsubject.setCcEmail(xxxxxx.com,xxxxxx.com,xxxxxx.com,xxxxxx.com);String msg EmailUtils.loadEmailNotice(运维人员, 5, 5, 001,002,003, 004,0005 , 008, emailsubject.getProxyserverHost(),emailsubject.getSendEmail(), emailsubject.getSendEmailPwd(), emailsubject.getReceiveEmail(), emailsubject.getCcEmail(), null);System.out.println(msg msg);}
}