java发邮件如何写一个JAVA类可以实现邮件发送功能,也可以实现群发功能
java发邮件 时间:2021-09-04 阅读:(
)
如何利用java发送163邮件,最好不要javamail
import?java.util.Properties;
import?javax.activation.DataHandler;
import?javax.activation.FileDataSource;
import?javax.mail.Address;
import?javax.mail.BodyPart;
import?javax.mail.Message;
import?javax.mail.Multipart;
import?javax.mail.Session;
import?javax.mail.Transport;
import?Address;
import?.MimeBodyPart;
import?.MimeMessage;
import?.MimeMultipart;
public?class?Mail?{
private?MimeMessage?mimeMsg;?//?MIME邮件对象
private?Session?session;?//?邮件会话对象
private?Properties?props;?//?系统属性
//?smtp认证用户名和密码
private?String?username;
private?String?password;
private?Multipart?mp;?//?Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
/**
?*?Constructor
?*?
?*?@param?smtp
?*????????????邮件发送服务器
?*/
public?Mail(String?smtp)?{
setSmtpHost(smtp);
createMimeMessage();
}
/**
?*?设置邮件发送服务器
?*?
?*?@param?hostName
?*????????????String
?*/
public?void?setSmtpHost(String?hostName)?{
if?(props?==?null)
props?=?System.getProperties();?//?获得系统属性对象
props.put("mail.smtp.host",?hostName);?//?设置SMTP主机
}
/**
?*?创建MIME邮件对象
?*?
?*?@return
?*/
public?boolean?createMimeMessage()?{
try?{
session?=?Session.getDefaultInstance(props,?null);?//?获得邮件会话对象
}?catch?(Exception?e)?{
System.err.println("获取邮件会话对象时发生错误!"?+?e);
return?false;
}
try?{
mimeMsg?=?new?MimeMessage(session);?//?创建MIME邮件对象
mp?=?new?MimeMultipart();
return?true;
}?catch?(Exception?e)?{
System.err.println("创建MIME邮件对象失败!"?+?e);
return?false;
}
}
/**
?*?设置SMTP是否需要验证
?*?
?*?@param?need
?*/
public?void?setNeedAuth(boolean?need)?{
if?(props?==?null)
props?=?System.getProperties();
if?(need)?{
props.put("mail.smtp.auth",?"true");
}?else?{
props.put("mail.smtp.auth",?"false");
}
}
/**
?*?设置用户名和密码
?*?
?*?@param?name
?*?@param?pass
?*/
public?void?setNamePass(String?name,?String?pass)?{
username?=?name;
password?=?pass;
}
/**
?*?设置邮件主题
?*?
?*?@param?mailSubject
?*?@return
?*/
public?boolean?setSubject(String?mailSubject)?{
try?{
mimeMsg.setSubject(mailSubject);
return?true;
}?catch?(Exception?e)?{
System.err.println("设置邮件主题发生错误!");
return?false;
}
}
/**
?*?设置邮件正文
?*?
?*?@param?mailBody
?*????????????String
?*/
public?boolean?setBody(String?mailBody)?{
try?{
BodyPart?bp?=?new?MimeBodyPart();
bp.setContent(""?+?mailBody,?"text/html;charset=utf-8");
mp.addBodyPart(bp);
return?true;
}?catch?(Exception?e)?{
System.err.println("设置邮件正文时发生错误!"?+?e);
return?false;
}
}
/**
?*?添加附件
?*?
?*?@param?filename
?*????????????String
?*/
public?boolean?addFileAffix(String?filename)?{
try?{
BodyPart?bp?=?new?MimeBodyPart();
FileDataSource?fileds?=?new?FileDataSource(filename);
bp.setDataHandler(new?DataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
return?true;
}?catch?(Exception?e)?{
System.err.println("增加邮件附件:"?+?filename?+?"发生错误!"?+?e);
return?false;
}
}
/**
?*?设置发信人
?*?
?*?@param?from
?*????????????String
?*/
public?boolean?setFrom(String?from)?{
try?{
mimeMsg.setFrom(new?Address(from));?//?设置发信人
return?true;
}?catch?(Exception?e)?{
return?false;
}
}
/**
?*?设置收信人
?*?
?*?@param?to
?*????????????String
?*/
public?boolean?setTo(String?to)?{
if?(to?==?null)
return?false;
try?{
mimeMsg.setRecipients(Message.RecipientType.TO,
Address.parse(to));
return?true;
}?catch?(Exception?e)?{
return?false;
}
}
/**
?*?设置抄送人
?*?
?*?@param?copyto
?*????????????String
?*/
public?boolean?setCopyTo(String?copyto)?{
if?(copyto?==?null)
return?false;
try?{
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[])?Address.parse(copyto));
return?true;
}?catch?(Exception?e)?{
return?false;
}
}
/**
?*?发送邮件
?*/
public?boolean?sendOut()?{
try?{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
Session?mailSession?=?Session.getInstance(props,?null);
Transport?transport?=?mailSession.getTransport("smtp");
transport.connect((String)?props.get("mail.smtp.host"),?username,
password);
transport.sendMessage(mimeMsg,
mimeMsg.getRecipients(Message.RecipientType.TO));
// 如果抄送人为null??不添加抄送人
if(mimeMsg.getRecipients(Message.RecipientType.CC)?!=?null)
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));
//?transport.send(mimeMsg);
System.out.println("发送邮件成功!");
transport.close();
return?true;
}?catch?(Exception?e)?{
System.err.println("邮件发送失败!"?+?e);
e.printStackTrace();
return?false;
}
}
/**
?*?调用sendOut方法完成邮件发送
?*?
?*?@param?smtp
?*?@param?from
?*?@param?to
?*?@param?subject
?*?@param?content
?*?@param?username
?*?@param?password
?*?@return?boolean
?*/
public?static?boolean?send(String?smtp,?String?from,?String?to,
String?subject,?String?content,?String?username,?String?password)?{
Mail?theMail?=?new?Mail(smtp);
theMail.setNeedAuth(true);?//?需要验证
if?(!theMail.setSubject(subject))
return?false;
if?(!theMail.setBody(content))
return?false;
if?(!theMail.setTo(to))
return?false;
if?(!theMail.setFrom(from))
return?false;
theMail.setNamePass(username,?password);
if?(!theMail.sendOut())
return?false;
return?true;
}
/**
?*?调用sendOut方法完成邮件发送,带抄送
?*?
?*?@param?smtp
?*?@param?from
?*?@param?to
?*?@param?copyto
?*?@param?subject
?*?@param?content
?*?@param?username
?*?@param?password
?*?@return?boolean
?*/
public?static?boolean?sendAndCc(String?smtp,?String?from,?String?to,
String?copyto,?String?subject,?String?content,?String?username,
String?password)?{
Mail?theMail?=?new?Mail(smtp);
theMail.setNeedAuth(true);?//?需要验证
if?(!theMail.setSubject(subject))
return?false;
if?(!theMail.setBody(content))
return?false;
if?(!theMail.setTo(to))
return?false;
if?(!theMail.setCopyTo(copyto))
return?false;
if?(!theMail.setFrom(from))
return?false;
theMail.setNamePass(username,?password);
if?(!theMail.sendOut())
return?false;
return?true;
}
/**
?*?调用sendOut方法完成邮件发送,带附件
?*?
?*?@param?smtp
?*?@param?from
?*?@param?to
?*?@param?subject
?*?@param?content
?*?@param?username
?*?@param?password
?*?@param?filename
?*????????????附件路径
?*?@return
?*/
public?static?boolean?send(String?smtp,?String?from,?String?to,
String?subject,?String?content,?String?username,?String?password,
String?filename)?{
Mail?theMail?=?new?Mail(smtp);
theMail.setNeedAuth(true);?//?需要验证
if?(!theMail.setSubject(subject))
return?false;
if?(!theMail.setBody(content))
return?false;
if?(!theMail.addFileAffix(filename))
return?false;
if?(!theMail.setTo(to))
return?false;
if?(!theMail.setFrom(from))
return?false;
theMail.setNamePass(username,?password);
if?(!theMail.sendOut())
return?false;
return?true;
}
/**
?*?调用sendOut方法完成邮件发送,带附件和抄送
?*?
?*?@param?smtp
?*?@param?from
?*?@param?to
?*?@param?copyto
?*?@param?subject
?*?@param?content
?*?@param?username
?*?@param?password
?*?@param?filename
?*?@return
?*/
public?static?boolean?sendAndCc(String?smtp,?String?from,?String?to,
String?copyto,?String?subject,?String?content,?String?username,
String?password,?String?filename)?{
Mail?theMail?=?new?Mail(smtp);
theMail.setNeedAuth(true);?//?需要验证
if?(!theMail.setSubject(subject))
return?false;
if?(!theMail.setBody(content))
return?false;
if?(!theMail.addFileAffix(filename))
return?false;
if?(!theMail.setTo(to))
return?false;
if?(!theMail.setCopyTo(copyto))
return?false;
if?(!theMail.setFrom(from))
return?false;
theMail.setNamePass(username,?password);
if?(!theMail.sendOut())
return?false;
return?true;
}
public?static?void?main(String[]?args)?{
//// SMTP服务器
String?smtp?=?"xxx";
// 发信人
String?from?=?"xxx";
String?to?=?"xxx";
String?subject?=?"xxx";
String?content?=?"xxx";
String?username?=?"xxx";
String?password?=?"xxx";
Mail.send(smtp,?from,?to,?subject,?content,?username,?password);
}
}这个是我现在在用的如何写一个JAVA类可以实现邮件发送功能,也可以实现群发功能
package byd.core;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import .Socket;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import sun.misc.BASE64Encoder;
/**
* 该类使用Socket连接到邮件服务器, 并实现了向指定邮箱发送邮件及附件的功能。
*
* @author Kou Hongtao
*/
public class Email {
/**
* 换行符
*/
private static final String LINE_END = "
";
/**
* 值为“true”输出高度信息(包括服务器响应信息),值为“ false”则不输出调试信息。
*/
private boolean isDebug = true;
/**
* 值为“true”则在发送邮件{@link Mail#send()} 过程中会读取服务器端返回的消息,
* 并在邮件发送完毕后将这些消息返回给用户。
*/
private boolean isAllowReadSocketInfo = true;
/**
* 邮件服务器地址
*/
private String host;
/**
* 发件人邮箱地址
*/
private String from;
/**
* 收件人邮箱地址
*/
private List to;
/**
* 抄送地址
*/
private List;
/**
* 暗送地址
*/
private List ;
/**
* 邮件主题
*/
private String subject;
/**
* 用户名
*/
private String user;
/**
* 密码
*/
private String password;
/**
* MIME邮件类型
*/
private String contentType;
/**
* 用来绑定多个邮件单元{@link #partSet}
* 的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元 。
*/
private String boundary;
/**
* 邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识 。
*/
private String boundaryNextPart;
/**
* 传输邮件所采用的编码
*/
private String contentTransferEncoding;
/**
* 设置邮件正文所用的字符集
*/
private String charset;
/**
* 内容描述
*/
private String contentDisposition;
/**
* 邮件正文
*/
private String content;
/**
* 发送邮件日期的显示格式
*/
private String simpleDatePattern;
/**
* 附件的默认MIME类型
*/
private String defaultAttachmentContentType;
/**
* 邮件单元的集合,用来存放正文单元和所有的附件单元。
*/
private List partSet;
private List alternativeList;
private String mixedBoundary;
private String mixedBoundaryNextPart;
/**
* 不同类型文件对应的{@link MIME} 类型映射。
在添加附件
* {@link #addAttachment(String)} 时,程序会在这个映射中查找对应文件的
* {@link MIME} 类型,如果没有, 则使用
* {@link #defaultAttachmentContentType} 所定义的类型。
*/
private static Map contentTypeMap;
private static enum TextType {
PLAIN("plain"), HTML("html");
private String v;
private TextType(String v) {
this.v = v;
}
public String getValue() {
return this.v;
}
}
static {
// MIME Media Types
contentTypeMap = new HashMap();
contentTypeMap.put("xls", "application/vnd.ms-excel");
contentTypeMap.put("xlsx", "application/vnd.ms-excel");
contentTypeMap.put("xlsm", "application/vnd.ms-excel");
contentTypeMap.put("xlsb", "application/vnd.ms-excel");
contentTypeMap.put("doc", "application/msword");
contentTypeMap.put("dot", "application/msword");
contentTypeMap.put("docx", "application/msword");
contentTypeMap.put("docm", "application/msword");
contentTypeMap.put("dotm", "application/msword");
}
/**
* 该类用来实例化一个正文单元或附件单元对象,他继承了 {@link Mail}
* ,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象 ,使程序易读一些。
* 这些邮件单元全部会放到partSet 中,在发送邮件 {@link #send()}时, 程序会调用
* {@link #getAllParts()} 方法将所有的单元合并成一个符合MIME格式的字符串。
*
* @author Kou Hongtao
*/
private class MailPart extends Email {
public MailPart() {
}
}
/**
* 默认构造函数
*/
public Email() {
defaultAttachmentContentType = "application/octet-stream";
simpleDatePattern = "yyyy-MM-dd HH:mm:ss";
boundary = "--=_NextPart_zlz_3907_" + System.currentTimeMillis();
boundaryNextPart = "--" + boundary;
contentTransferEncoding = "base64";
contentType = "multipart/mixed";
charset = Charset.defaultCharset().name();
partSet = new ArrayList();
alternativeList = new ArrayList();
to = new ArrayList();
= new ArrayList();
= new ArrayList();
mixedBoundary = "=NextAttachment_zlz_" + System.currentTimeMillis();
mixedBoundaryNextPart = "--" + mixedBoundary;
}
/**
* 根据指定的完整文件名在 {@link #contentTypeMap} 中查找其相应的MIME类型,
* 如果没找到,则返回 {@link #defaultAttachmentContentType}
* 所指定的默认类型。
*
* @param fileName
* 文件名
* @return 返回文件对应的MIME类型。
*/
private String getPartContentType(String fileName) {
String ret = null;
if (null != fileName) {
int flag = fileName.lastIndexOf(".");
if (0 <= flag && flag < fileName.length() - 1) {
fileName = fileName.substring(flag + 1);
}
ret = contentTypeMap.get(fileName);
}
if (null == ret) {
ret = defaultAttachmentContentType;
}
return ret;
}
/**
* 将给定字符串转换为base64编码的字符串
*
* @param str
* 需要转码的字符串
* @param charset
* 原字符串的编码格式
* @return base64编码格式的字符
*/
private String toBase64(String str, String charset) {
if (null != str) {
try {
return toBase64(str.getBytes(charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return "";
}
/**
* 将指定的字节数组转换为base64格式的字符串
*
* @param bs
* 需要转码的字节数组
* @return base64编码格式的字符
*/
private String toBase64(byte[] bs) {
return new BASE64Encoder().encode(bs);
}
/**
* 将给定字符串转换为base64编码的字符串
*
* @param str
* 需要转码的字符串
* @return base64编码格式的字符
*/
private String toBase64(String str) {
return toBase64(str, Charset.defaultCharset().name());
}
/**
* 将所有的邮件单元按照标准的MIME格式要求合并。
*
* @return 返回一个所有单元合并后的字符串。
*/
private String getAllParts() {
StringBuilder sbd = new StringBuilder(LINE_END);
sbd.append(mixedBoundaryNextPart);
sbd.append(LINE_END);
sbd.append("Content-Type: ");
sbd.append("multipart/alternative");
sbd.append(";");
sbd.append("boundary="");
sbd.append(boundary).append("""); // 邮件类型设置
sbd.append(LINE_END);
sbd.append(LINE_END);
sbd.append(LINE_END);
addPartsToString(alternativeList, sbd, getBoundaryNextPart());
sbd.append(getBoundaryNextPart()).append("--");
sbd.append(LINE_END);
addPartsToString(partSet, sbd, mixedBoundaryNextPart);
sbd.append(LINE_END);
sbd.append(mixedBoundaryNextPart).append("--");
sbd.append(LINE_END);
// sbd.append(boundaryNextPart).
// append(LINE_END);
alternativeList.clear();
partSet.clear();
return sbd.toString();
}
优林怎么样?优林好不好?优林 是一家国人VPS主机商,成立于2016年,主营国内外服务器产品。云服务器基于hyper-v和kvm虚拟架构,国内速度还不错。今天优林给我们带来促销的是国内西南地区高防云服务器!全部是独享带宽!续费同价!官方网站:https://www.idc857.com地区CPU内存硬盘流量带宽防御价格购买地址德阳高防4核4g50G无限流量10M100G70元/月点击购买德阳高防...
轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。活动规则:用户购买任意全区域云服务器月付以上享受免费更换IP服...
Friendhosting商家在前面的篇幅中也又陆续介绍到,是一家保加利亚主机商,主要提供销售VPS和独立服务器出租业务,数据中心分布在:荷兰、保加利亚、立陶宛、捷克、乌克兰和美国洛杉矶等。这不近期黑色星期五活动,商家也有推出了黑五优惠,VPS全场一次性45折,虚拟主机4折,全球多机房可选,老用户续费可获9折加送1个月使用时长,VDS折后最低仅€14.53/年,有需要的可以看看。Friendhos...
java发邮件为你推荐
容灾备份我想知道异地容灾备份谁知道呢,有没有好一点的?fast路由器如何设置fast路由器用户名和密码win10发布win10什么时候发布正式版nvidia官方网站官网NVIDIA驱动和win10系统不兼容,怎么解决?招行信用卡还款招商银行信用卡有哪几个还款方式呢?全球随机视频网全球随机视频网的发展方向网络限速软件谁有网络限速的软件,路由器。很卡~别人一看电影什么都干不了。提供个限速的软件。下载成功给分!主板说明书主板各个接口,插口的详细说明对联广告代码HTMl教程:实现网页左右两侧居中的对联广告代码gps简介GPS是什么
ip代理地址 域名论坛 域名解析服务器 万网域名管理 搬瓦工官网 轻博客 监控宝 godaddy优惠券 windows2003iso 云图标 私有云存储 圣诞节促销 ibox官网 七夕促销 服务器是干什么的 如何用qq邮箱发邮件 hdd 上海服务器 Updog 如何建立邮箱 更多