? ? ? 零零散散利用业余时间带着看了一阵子java,是时候用实际应用来练练手了。应一个朋友需求,想通过邮件群发方式推广自己的公众号,为啥用邮件推广嘛,大家都清楚:免费。现在找个媒体发广告,那可是要投入成本的,最终效果还不一定有效。邮件现在效果远不如以前,但毕竟免费。
? ? ? 一、需求分析与功能模块定位
? ? ? 首先要解决同一个发件人发很多邮件后被邮件服务器屏蔽的问题,思路就是准备一批发邮件账号,充分利用各个环节随机的做法来规避邮件服务器的屏蔽,每个发件人账号每天发送有限的几封邮件,把每天定时任务的发送起始时间随机化,每个账号发送上限数量内随机数量邮件,发送间隔随机产生,邮件标题随机从数据库读取,邮件内容随机从数据库读取,反正一切都是在预先设定的范围内随机。
? ? ? 这个思路定下来之后,要准备的工作有:1、先写个邮件发送的类,用于被调用;2、准备发件人邮箱账号,越多越好,存放在excel表中,规定格式;3、准备数据库,存放收件人目标邮箱账号,存放随机读取的邮件标题和邮件内容,目标邮箱如何产生嘛,以qq号为例,挨个排下去,自行理解。
? ? ? 二、分步实现之邮件发送类
? ? ? 1、引入mail.jar和activateon.jar两个jar包,idea开发环境中,使用maven管理,pom.xml依赖中添加:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
? ? ? 2、SendMailSmtp类
/*
* Class Name: SendMailSmtp
* Description: 使用smtp协议发送邮件,依赖两个jar包:mail,activation;导入import javax.activation.,import javax.mail.
* 四类发送方式,只发送文本,发送文本和图片,发送文本和附件,发送文本、图片、附件,附件只支持一个。
* 使用方法,先GetTransport()创建与邮件服务器连接,然后Sendxxxx()发送邮件,最后CloseTransport()关闭连接。
* Date: 2021-09-03 13:30
* Copyright: 秦坤明
*/
package QinMing.Mail;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Random;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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 SendMailSmtp {
String MailSmtpServer;
String MailUser;
String MailPass;
String MailSender;
Session session;
Transport ts;
public String getMailSmtpServer() {
return MailSmtpServer;
}
public void setMailSmtpServer(String mailSmtpServer) {
MailSmtpServer = mailSmtpServer;
}
public String getMailUser() {
return MailUser;
}
public void setMailUser(String mailUser) {
MailUser = mailUser;
}
public String getMailPass() {
return MailPass;
}
public void setMailPass(String mailPass) {
MailPass = mailPass;
}
public String getMailSender() {
return MailSender;
}
public void setMailSender(String mailSender) {
MailSender = mailSender;
}
/*
*连接smtp邮件服务器
*/
public String GetTransport() {
try {
Properties ppt = new Properties();
ppt.setProperty("mail.host", MailSmtpServer);
ppt.setProperty("mail.transport.protocol", "smtp");
ppt.setProperty("mail.smtp.auth", "true");
//1、创建session
session = Session.getInstance(ppt);
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
//session.setDebug(true);
//2、通过session得到transport对象
ts = session.getTransport();
//3、连上邮件服务器
ts.connect(MailSmtpServer, MailUser, MailPass);
return "success";
}catch (MessagingException e){
return e.toString();
}
}
/*
*断开与smtp邮件服务器的连接
*/
public String CloseTransport() {
try {
//5、断开与邮件服务器连接
ts.close();
return "success";
}catch (MessagingException e){
return e.toString();
}
}
/*
*通过smtp邮件服务器发送文本/html格式邮件,不带图片和附件
* @MailReceiver 收件人
* @MailSubject 邮件主题
* @MailContent 邮件内容
*/
public String SendText(String MailReceiver, String MailSubject, String MailContent){
try {
//4、创建邮件对象并发送邮件
MimeMessage mm = new MimeMessage(session);
//指明邮件的发件人
mm.setFrom(new InternetAddress(MailSender));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver));
//邮件的标题
mm.setSubject(MailSubject);
//邮件的文本内容
mm.setContent(MailContent, "text/html;charset=UTF-8");
//发送邮件
ts.sendMessage(mm, mm.getAllRecipients());
//发送成功返回success
return "success";
}
catch(MessagingException e){
return e.toString();
}
}
/*
*通过smtp邮件服务器发送文本/html格式邮件,带图片
* @MailReceiver 收件人
* @MailSubject 邮件主题
* @MailContent 邮件内容
* @ImageFile 图片文件
*/
public String SendImage(String MailReceiver, String MailSubject, String MailContent, String ImageFile){
try {
//4、创建邮件对象并发送邮件
MimeMessage mm = new MimeMessage(session);
//指明邮件的发件人
mm.setFrom(new InternetAddress(MailSender));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver));
//邮件的标题
mm.setSubject(MailSubject);
// 准备邮件相关
// 准备邮件正文数据,图片指定名称需和下面image.setContentID中命名的保持一致
MimeBodyPart text = new MimeBodyPart();
text.setContent(MailContent + "<img src='cid:welcome.jpg'>", "text/html;charset=UTF-8");
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(ImageFile));
image.setDataHandler(dh);
image.setContentID("welcome.jpg");
// 描述数据关系
MimeMultipart mmt = new MimeMultipart();
mmt.addBodyPart(text);
mmt.addBodyPart(image);
mmt.setSubType("related");
mm.setContent(mmt);
mm.saveChanges();
//发送邮件
ts.sendMessage(mm, mm.getAllRecipients());
//发送成功返回success
return "success";
}
catch(MessagingException e){
return e.toString();
}
}
/*
*通过smtp邮件服务器发送文本/html格式邮件,带附件
* @MailReceiver 收件人
* @MailSubject 邮件主题
* @MailContent 邮件内容
* @AttachFile 附件文件
*/
public String SendAttach(String MailReceiver, String MailSubject, String MailContent, String AttachFile){
try {
//4、创建邮件对象并发送邮件
MimeMessage mm = new MimeMessage(session);
//指明邮件的发件人
mm.setFrom(new InternetAddress(MailSender));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver));
//邮件的标题
mm.setSubject(MailSubject);
// 准备邮件相关
// 准备邮件正文数据,图片指定名称需和下面image.setContentID中命名的保持一致
MimeBodyPart text = new MimeBodyPart();
text.setContent(MailContent, "text/html;charset=UTF-8");
//创建邮件附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(AttachFile));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());
// 描述数据关系
MimeMultipart mmt = new MimeMultipart();
mmt.addBodyPart(text);
mmt.addBodyPart(attach);
mmt.setSubType("mixed");
mm.setContent(mmt);
mm.saveChanges();
//发送邮件
ts.sendMessage(mm, mm.getAllRecipients());
//发送成功返回success
return "success";
}
catch(MessagingException e){
return e.toString();
}
}
/*
*通过smtp邮件服务器发送文本/html格式邮件,带附件
* @MailReceiver 收件人
* @MailSubject 邮件主题
* @MailContent 邮件内容
* @ImageFile 图片文件
* @AttachFile 附件文件
*/
public String SendImageAndAttach(String MailReceiver, String MailSubject, String MailContent, String ImageFile, String AttachFile){
try {
//4、创建邮件对象并发送邮件
MimeMessage mm = new MimeMessage(session);
//指明邮件的发件人
mm.setFrom(new InternetAddress(MailSender));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver));
//邮件的标题
mm.setSubject(MailSubject);
//准备邮件相关
//正文
MimeBodyPart text = new MimeBodyPart();
text.setContent(MailContent + "<img src='cid:welcome.jpg'>", "text/html;charset=UTF-8");
//图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource(ImageFile)));
image.setContentID("welcome.jpg");
//附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(AttachFile));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());
//描述关系:正文和图片
MimeMultipart mmt1 = new MimeMultipart();
mmt1.addBodyPart(text);
mmt1.addBodyPart(image);
mmt1.setSubType("related");
//描述关系:正文和附件
MimeMultipart mmt2 = new MimeMultipart();
mmt2.addBodyPart(attach);
//代表正文的body part
MimeBodyPart content = new MimeBodyPart();
content.setContent(mmt1);
mmt2.addBodyPart(content);
mmt2.setSubType("mixed");
mm.setContent(mmt2);
mm.saveChanges();
//发送邮件
ts.sendMessage(mm, mm.getAllRecipients());
//发送成功返回success
return "success";
}
catch(MessagingException e){
return e.toString();
}
}
}
? ? ? 3、使用上面的类发送测试邮件
? ? ? (1)发送只包含文本的邮件
//发送一封文本测试邮件
SendMailSmtp sms = new SendMailSmtp();
sms.setMailSmtpServer("smtp.qq.com");
sms.setMailSender("xxxx@qq.com");
sms.setMailUser("xxxx");
sms.setMailPass("mail pass");
String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。"
+ "</br>下面列举几个优惠券供参考:</br></br>"
+ "<img src='http://url/test.jpg'/>";
if(sms.GetTransport() == "success"){
System.out.println(sms.SendText("xx@qq.com", "test mail", mailcontent));
sms.CloseTransport();
}
? ? ? (2)发送包含文本及图片的邮件
//发送一封文本+图片测试邮件
SendMailSmtp sms = new SendMailSmtp();
sms.setMailSmtpServer("smtp.qq.com");
sms.setMailSender("xxxx@qq.com");
sms.setMailUser("xxxx");
sms.setMailPass("mail pass");
String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。"
+ "</br>下面列举几个优惠券供参考:</br></br>"
+ "<img src='http://url/test.jpg'/>";
if(sms.GetTransport() == "success"){
System.out.println(sms.SendImage("xx@qq.com", "test image mail", mailcontent, "f:/test.jpg"));
sms.CloseTransport();
}
? ? ? (3)发送包含文本和附件的邮件
//发送一封文本+附件测试邮件
SendMailSmtp sms = new SendMailSmtp();
sms.setMailSmtpServer("smtp.qq.com");
sms.setMailSender("xxxx@qq.com");
sms.setMailUser("xxxx");
sms.setMailPass("mail pass");
String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。"
+ "</br>下面列举几个优惠券供参考:</br></br>"
+ "<img src='http://url/test.jpg'/>";
if(sms.GetTransport() == "success"){
System.out.println(sms.SendAttach("xx@qq.com", "test attach mail", mailcontent, "f:/test.txt"));
sms.CloseTransport();
}
? ? ? (4)发送包含文本+图片+附件的邮件
//发送一封文本+图片+附件测试邮件
SendMailSmtp sms = new SendMailSmtp();
sms.setMailSmtpServer("smtp.qq.com");
sms.setMailSender("xxxx@qq.com");
sms.setMailUser("xxxx");
sms.setMailPass("mail pass");
String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。"
+ "</br>下面列举几个优惠券供参考:</br></br>"
+ "<img src='http://url/test.jpg'/>";
if(sms.GetTransport() == "success"){
System.out.println(sms.SendImageAndAttach("xx@qq.com", "test image and attach mail", mailcontent, "f:/test.jpg", "f:/test.txt"));
sms.CloseTransport();
}
? ? ? 好了,第一步发送邮件的基础已准备完备,下面的步骤就是如何制定定时任务开展群发,本篇就到这里,完整应用请看下一篇。顺带帮朋友的公众号推广一下,猿友们可以用微信扫码下面二维码关注公众号,吃喝玩乐优惠券什么都有,最低只要一折,真的是超级优惠。
?
|