java实现发送邮件工具[通俗易懂]

java实现发送邮件工具[通俗易懂]java实现发送邮件的功能:首先需要导入mail.jar;然后需要写发送方法:1、邮箱发送封装工具类:packagecom.wxjiameng.utils;importjava.util.Date;importjava.util.Properties;importjavax.activation.DataHandler;importjavax.activation.FileDa

大家好,又见面了,我是你们的朋友全栈君。

java实现发送邮件的功能:首先需要导入mail.jar;
然后需要写发送方法:
1、邮箱发送封装工具类:

package com.wxjiameng.utils;

import java.util.Date;
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.MessagingException;
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;

import org.apache.log4j.Logger;


/** * * * @类编号: * @类名称:EmailsUtils * @内容摘要: 发送邮件 * @author:鹿伟伟 * @创建日期:2016年4月25日 下午6:06:15 * @修改人: * @修改日期: * @修改描述:简单描述修改的内容 * @version 1.0.0 * */

public class EmailsUtils { 
   
    public static Logger logger = Logger.getLogger(EmailsUtils.class);
    //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
    private  Multipart mp = new MimeMultipart();
    private  final String CHAR_SET = "UTF-8";    

    /** * * @Description: 发送邮件 * @param EmailParaForm 发件人等发送邮件参数 * @return * @author: YuPeng * @date 2012-5-25 下午5:13:36 */
    public  boolean SendEmails(EmailParaForm emailParaForm){
            boolean isSucc = false;
            if (emailParaForm == null){
                return isSucc;
            }
            try{
                //JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
                //Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中 共享的信息。
                Properties props=new Properties();//也可用Properties props = System.getProperties();
                props.put("mail.smtp.host",emailParaForm.getStmpHost());//存储发送邮件服务器的信息
                props.put("mail.smtp.port", "" + emailParaForm.getTport()); // 端口号
                props.put("mail.transport.protocol",emailParaForm.getProtocol());
                props.put("mail.smtp.auth",emailParaForm.getNeedAuth());//同时通过验证
                if (null != emailParaForm.getAgentIp() && emailParaForm.getAgentIp().length() != 0 && !emailParaForm.getAgentIp().equals("0")) {
                    props.put("mail.agentIp", emailParaForm.getAgentIp());
                }

                if (null != emailParaForm.getAgentPort() && emailParaForm.getAgentPort().length() != 0 && !emailParaForm.getAgentPort().equals("0")) {
                    props.put("mail.agentPort", emailParaForm.getAgentPort());
                }

                //方法二:(如果是在weblogin配置JavaMail:则需指定JNDI名检索
                //Context ctx=new InitialContext();
                //Session s=(Session)ctx.lookup("MailSession");
                //Message msg=new MimeMessage(s);


                //这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。
                //Session类定义全局和每个用户的与邮件相关的属性。这此属性说明了客房机和服务器如何交流信息。
                //Authenticator也是一个抽象类,你需要自己编写子类已备应用。

                Session s = Session.getInstance(props,null);//根据属性新建一个邮件会话,null参数是一种Authenticator(验证程序) 对象
                String isDebug = emailParaForm.getIsDebug();
                if (isDebug != null && isDebug.trim().equalsIgnoreCase("true")){
                    s.setDebug(true);//设置调试标志,要查看经过邮件服务器邮件命令,可以用该方法
                }
                // 一旦创建了自己的Session对象,就是该去创建要发送的消息的 时候了。这时就要用到消息类型(MimeMessage是其中一种类型)。
                // Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
                // Message类表示单个邮件消息,它的属性包括类型,地址信息和所定义的目录结构。

                Message message=new MimeMessage(s);//由邮件会话新建一个消息对象

                //message.setContent("hello","test/plain");//设置消息的内容类型,如果发送的格式有HTML格式就必须设置,
                //message.setText("Hello");//发送一般文本格式的消息

                //设置邮件,一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。
                //如果想让一个名字出现在电子邮件地址后,也可以将其传递给构造器:
                //Address from=new InternetAddress("xmqds@21cn.com","qdison");//发件人的邮件地址

                Address from=new InternetAddress(emailParaForm.getTfrom());//发件人的邮件地址
                message.setFrom(from);//设置发件人

                Address to=new InternetAddress(emailParaForm.getTto());//收件人的邮件地址
                message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO,还有3种预定义类型如下:

                //Message.RecipientType.TO  收件人
                //Message.RecipientType.CC  抄送
                //Message.RecipientType.BCC  暗送
                message.setSubject(emailParaForm.getTtitle());//设置主题
                message.setSentDate(new Date());//设置发信时间
                setBody(emailParaForm.getTcontent());

                //String fileAttachment = "C:\\测试\\中国.txt"; 
                //添加附件
                String fileAttachments = emailParaForm.getFileAttachments();
                if(null!=fileAttachments){
                    String[] fileAttArr = fileAttachments.split(";");
                    for (int i = 0; i < fileAttArr.length; i++){
                        String fileAtt = fileAttArr[i];
                        addFileAffix(fileAtt);
                    }
                }

                message.setContent(mp);
                message.saveChanges();//存储邮件信息
                // Transport 是用来发送信息的,
                // 用于邮件的收发打操作。
                Transport transport=s.getTransport(emailParaForm.getProtocol());
                transport.connect(emailParaForm.getStmpHost(),emailParaForm.getUserName(),emailParaForm.getPassword());//以smtp方式登录邮箱
                transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址
                transport.close();

                isSucc = true;;
        } catch(MessagingException e){
            logger.error(e);
            e.printStackTrace();
        } 
        return isSucc;
    }


    /** * 邮件添加附件 * * @param filePath 包括路径名的完整本地文件名 * @return boolean */
    public boolean addFileAffix(String filePath) {
        try {
            BodyPart bp = new MimeBodyPart();
            FileDataSource fileds = new FileDataSource(filePath);
            bp.setDataHandler(new DataHandler(fileds));
            String fileNm = fileds.getName();
            bp.setFileName(MimeUtility.encodeText(fileNm));
            mp.addBodyPart(bp);
            return true;
        }
        catch (Exception e) {
            logger.error(e);
            System.err.println("Affix" + filePath + "accour error" + e);
            return false;
        }
    }

    /** * 设置邮件内容 * * @param body 邮件内容 * @return boolean */
    public  boolean setBody(String body) {
        try {
            BodyPart bp = new MimeBodyPart();
            bp.setContent("" + body, "text/html;charset=" + CHAR_SET);
            mp.addBodyPart(bp);
            return true;
        } catch (Exception e) {
            logger.error(e);
            System.err.println("set mail body is error" + e);
            return false;
        }
    }

    /** * 发送邮件 * @param receiveUser 接收人 * @param title 标题 * @param content 内容 * 返回true则发送成功,false发送失败 * @return */
    public  boolean send(String receiveUser,String title,String content){
        boolean isSucc = false;
        EmailParaForm spForm = new EmailParaForm();
        spForm.setId("FFFFFF");
        spForm.setTfrom("***@163.com"); // 发出者邮箱
        spForm.setStmpHost("smtp.163.com"); // 邮箱类型
        spForm.setNeedAuth("true");//是否需要认证
        spForm.setIsDebug("false"); //调试
        spForm.setProtocol("smtp"); //协议
        spForm.setUserName("***@163.com");//用户名
        spForm.setPassword("****");//密码
        spForm.setTport("25");//端口。默认发出
        spForm.setTto(receiveUser);
        spForm.setTcontent(content);
        spForm.setTtitle(title);
        String formPass = spForm.getPassword();
        if (formPass != null ){
            isSucc=SendEmails(spForm);
        }
        return isSucc;
    }


    public static void main(String[] args){
        EmailsUtils e = new EmailsUtils();
        e.send("**@qq.com", "维基百科", "自由的百科全书:维基百科是一个内容自由、任何人都能参与、并有多种语言的百科全书协作计划...");
    }
}

2、邮箱发送信息实体类:

package com.wxjiameng.utils;


public class EmailParaForm {
    //编号
    private String id;
    //发件人
    private String  tfrom;
    //收件人,以分号分隔
    private String tto;
    //主题
    private String ttitle;
    //内容
    private String tcontent;
    //发送邮件服务器
    private String stmpHost;
    //接受邮件服务器
    private String popHost;
    //协议
    private String protocol;
    //是否需要认证
    private String needAuth;
    //验证类名
    //private String authClassNm;
    private String isDebug;
    //抄送,以分号分隔
    private String tcc;
    //暗送,以分号分隔
    private String tbcc;
    //多附件以分号分隔
    private String fileAttachments;
    //用户名
    private String userName;
    //密码
    private String password;
    //代理服务器IP
    private String agentIp;
    //代理服务器端口号
    private String agentPort;
    //weblogin配置JavaMail:则需指定JNDI名检索
    private String jndiNm;
    //接收协议
    private String pprotocol;
    //发送邮件服务器端口
    private String tport;
    //接收邮件服务器端口
    private String pport;

    //set get方法

}

在使用的时候会出现以下异常:
这里写图片描述
需要检查发送者的邮箱是否开通pop3/smtp权限,开通后即可发送成功;不明白可以私信给我,相互学习!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146726.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • easycode mybatis 在线激活码(JetBrains全家桶)[通俗易懂]

    (easycode mybatis 在线激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~L…

    2022年4月1日
    99
  • itextpdf设置页码_word页码相同怎么改

    itextpdf设置页码_word页码相同怎么改项目需要样式比较复杂,刚开始因为时间比较紧所以采用了Itextpdf插件代码生成pdf,实话说过程十分繁琐,因为pdf文件样式比较多,表格也比较多,各种的表格,还有就是页眉页脚页码都要自己找页面位置坐标但是又不能像html那样方便更改查看样式,只能改一点导出来看看合适不,然后再改再导出来看。私下调研了很多,现在罗列一下我所用到的一些样式处理,希望可以帮助需要做这个功能的朋友少踩坑,少尝试,直接出完美pdf报告。封面首页封面右上角那个图片可以换成logo,我做的大概是这样的一个样子,上代码/

    2022年10月3日
    3
  • 什么是CMS_SiteServer CMS

    什么是CMS_SiteServer CMS纵观现如今国内CMS程序,大有百花争艳的感觉,随着企业建站需求的复杂度和功能的不断扩展,传统的三五个人写一段代码即告网站建已经行不通,于是以内容管理为应用核心的CMS产品大行其道。  这些CMS系统大体上基于两套框架编写:PHP+MySQL和.NET+MSSQL。在PHP中比较有名的就有DeDeCMS、PHP168、帝国CMS、Supesite等,在.NET方面就有zoomla!…

    2022年9月29日
    2
  • c++ eigen库_modbus指令库

    c++ eigen库_modbus指令库测试程序:#include<iostream>#include<Eigen/Eigen>usingnamespacestd;#definepi3.14159265359intmain(){ cout<<“##——————-搞清旋转关系——————-##”<<en…

    2022年10月18日
    3
  • 复试的时候面试官问我还有什么问题(和面试官聊得很好但没有录用)

    我是一名程序员,我的主要编程语言是Java,我更是一名Web开发人员,所以我必须要了解HTTP,所以本篇文章就来带你从HTTP入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得05年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学xxx家里有网,每…

    2022年4月17日
    45
  • Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏[通俗易懂]

    Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏[通俗易懂]Linux操作系统资源+技术专栏大合集—吐血整理,建议收藏,以备不时之需。

    2022年5月9日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号