零零散散利用业余时间带着看了一阵子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、创建sessionsession = 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());//发送成功返回successreturn "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());//发送成功返回successreturn "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());//发送成功返回successreturn "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 partMimeBodyPart content = new MimeBodyPart();content.setContent(mmt1);mmt2.addBodyPart(content);mmt2.setSubType("mixed");mm.setContent(mmt2);mm.saveChanges();//发送邮件ts.sendMessage(mm, mm.getAllRecipients());//发送成功返回successreturn "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();}

好了,第一步发送邮件的基础已准备完备,下面的步骤就是如何制定定时任务开展群发,本篇就到这里,完整应用请看下一篇。

java实战:邮件群发推广微信公众号(一),内含java操作mail.jar和activateon.jar相关推荐

  1. java实战:邮件群发推广微信公众号(二),内含java操作excel及java操作mysql

    上一篇写好了用于发送邮件的类,本篇把余下的设定定时任务.从excel读取发件人账号.从mysql读取收件人邮箱以及随机标题和内容来实现.先看整个应用的文件框架结构,如下图: 上图中log4j.prop ...

  2. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  3. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  4. 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】

    学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...

  5. 九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解...

    封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import j ...

  6. 新手如何运营推广微信公众号

    自媒体的快速发展,流量向短视频平台倾斜,头条系列在一场厮杀中如日中天.公众号作为最老牌的自媒体平台,成为营销人的一大阵地,公司和个人,如果没有参与公众号,就少了一个粉丝聚集地.没有它,你的粉丝就像一个 ...

  7. 如何推广微信公众号(快速增加粉丝数量)?

    已经开通微信公众号有一段时间了,但是关注的人非常少,可以用少的可怜来形容.在网上搜索了半天,找了找解决问题的办法,在这里做一下整理,虽然这些办法没有经过本人的验证,但也算是给大家一个启发吧.后面我会进 ...

  8. 如何推广微信公众号 微信公众号推广技巧

    在2012年中国互联网大会上,腾讯公司董事会主席兼首席执行官马化腾表示,微信在去年年初推出,仅仅用了14个月,在今年三月份超过1亿的注册用户,目前微信已经达到2亿用户.微信的火不亚于当年的微博,从微信 ...

  9. 深入探索微信公众号开发:Java代码实现与最佳实践

    微信公众号是一种基于微信生态的社交工具,它可以帮助企业和个人实现信息传播.客户互动和营销推广等目标.本文将深入探讨微信公众号的开发流程.核心功能和Java代码实现,同时提供一些最佳实践,帮助你更好地应 ...

最新文章

  1. 根据ip获取地理位置
  2. using namspace std的使用
  3. ansys fluent udf manual 下载_Fluent内置流固耦合01 使用流程
  4. 取得Access自增标识字段在插入数据后的id值
  5. 如何用 J-Link 来串口调试?
  6. P1600 天天爱跑步
  7. 前端学习(1605):组件传值
  8. r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化
  9. 什么叫企业级即时通讯软件
  10. 数据结构-一元多项式加减程序
  11. 库克斯坦福大学毕业演讲批评硅谷现状:我们有责任改变方向
  12. MindFusion教程:如何构建Java Swing中的区域图
  13. android studio 2048游戏
  14. C++ Primer 中文版(第 5 版)练习解答合集
  15. ping-pong机制
  16. python多元逻辑回归_Python机器学习的练习四:多元逻辑回归
  17. 【JavaScript】 数组 重要方法详解篇(一)
  18. SCA声明办理 TSCA限用物质检测 TSCA有毒物质控制法案检测
  19. 菜鸟打造智慧物流平台 引领物流新风潮
  20. 问题 K: 古罗马数字

热门文章

  1. 数模美赛如何找数据 | 2023年美赛数学建模必备数据库
  2. sony直营店可以享受到什么体验和服务?
  3. springboot 添加第三方jar包
  4. 网页扫描二维码登录页面的原理(通俗、易懂)
  5. 以太坊智能合约编程之菜鸟教程
  6. Java SSM毕设 公寓宿舍后勤管理系统(含源码+论文)
  7. SpringBoot应用开发框架搭建
  8. 87work   项目实战2
  9. kindle无法开机
  10. 数字图像处理MATLAB大作业:基础版