浅谈_Java中的邮件发送

浅谈_Java中的邮件发送

    本博客仅仅是个人工作的一些总结,在创作过程中同样借鉴了一些前辈的文档,如有不全面或是遗漏的地方还望各位读者指正~

相信很多同学都会遇到在程序中需要发送邮件的需求,  这里总结了两种发送邮件的方式:

一:使用JavaxMail进行邮件的发送

二:使用Spring封装的JavaMailSender进行邮件的发送

浅谈_一:使用JavaxMail进行邮件的发送

一__设置好邮箱的SMTP/POP3/IMAP协议的授权

这里要提一下,有些邮箱账号的密码是需要填写生成的授权码的(比如个人的QQ邮箱),

而有些邮箱地址需要填写邮箱账号的登录密码(比如腾讯企业邮箱,新浪邮箱),

网易的邮箱没有进行具体发送邮件的测试,如有需要,请读者自行测试.

新浪邮箱的设置:


个人QQ邮箱的设置:


腾讯企业邮箱不需要设置(官方说明中表明已经做好相应的配置,用户直接使用即可)

二__天才第一步_引入spring_context和javaxmail的依赖
     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.8.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.6.0</version>
    </dependency>

这里使用的是javax.mail-1.6.0.jar

三__工具类代码
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 使用JavaxMail实现发送邮件的工具类
 */

public class MailUtil {

    // properties配置文件地址
    //private static final String PROPERTIES_PATH = "standard_data.properties";

    private static Session session;
    private static Properties props = new Properties();
    //发送邮件的服务器地址
    private static final String HOST = "smtp.sina.com";
    //端口号
    private static int PORT = 587;
    //授权
    private static final String isAUTH = "true";
    //发送端地址
    private static final String FROM = "**************";
    //用户名(邮箱账号)
    private static final String USERNAME = "*********";
    //密码    个人QQ邮箱以及某些邮箱(具体看邮箱的设置)需要授权码,其他邮箱需要登录密码
    private static final String PASSWORD = "************";
    //延迟
    private static final String TIMEOUT = "25000";
    //Debug调试模式
    private static final String DEBUG = "true";

    // 初始化session
    static {
        //设置邮件会话属性
        props.put("mail.smtp.host", HOST);
        props.put("mail.smtp.port", PORT);
        props.put("mail.smtp.auth", isAUTH);
        props.put("fromer", FROM);
        props.put("username", USERNAME);
        props.put("password", PASSWORD);
        props.put("mail.smtp.timeout", TIMEOUT);
        props.put("mail.debug", DEBUG);
        //通过在session中注册一个用户名,密码的认证器,初始化session
        session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });
        //设置调试模式,发布时取消
        //session.setDebug(true);
    }



    /**
     *
     * @Title sendEmail
     * @Description 通过isHtml判断发送的邮件的内容
     * @param to 邮件接收者
     * @param content 邮件内容
     * @param isHtml 是否发送html
     * @throws MessagingException
     * @throws IOException
     * @throws FileNotFoundException
     * @throws EmailException
     */
    public static void sendEmail(String to, String title, String content, boolean isHtml)
            throws FileNotFoundException, IOException, MessagingException {
        String fromer = props.getProperty("fromer");
        if (isHtml) {
            sendHtmlEmail(to, title, content);
        } else {
            sendTextEmail(to, title, content);
        }
    }

    // 发送纯文字邮件
    public static void sendTextEmail(String to, String subject, String content)
            throws FileNotFoundException, IOException, MessagingException {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(FROM));
        message.setRecipient(RecipientType.TO, new InternetAddress(to));
        message.setSubject(subject);
        message.setText(content);
        message.setSentDate(new Date());
        Transport.send(message);
    }

    // 发送有HTML格式邮件
    public static void sendHtmlEmail(String to, String subject, String htmlConent)
            throws FileNotFoundException, IOException, MessagingException {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(FROM));
        message.setRecipient(RecipientType.TO, new InternetAddress(to));
        message.setSubject(subject);
        message.setSentDate(new Date());

        Multipart multi = new MimeMultipart();
        BodyPart html = new MimeBodyPart();
        html.setContent(htmlConent, "text/html; charset=utf-8");
        multi.addBodyPart(html);
        message.setContent(multi);
        Transport.send(message);
    }

    // 发送带附件的邮件
    public static void sendFileEmail(String to, String subject, String htmlConent, File attachment)
            throws FileNotFoundException, IOException, MessagingException {

        Message message = new MimeMessage(session);
        String fromer = props.getProperty("fromer");
        message.setFrom(new InternetAddress(fromer));
        message.setRecipient(RecipientType.TO, new InternetAddress(to));
        message.setSubject(subject);
        message.setSentDate(new Date());
        // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
        Multipart multipart = new MimeMultipart();
        // 添加邮件正文
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(htmlConent, "text/html;charset=UTF-8");
        multipart.addBodyPart(contentPart);
        // 添加附件的内容
        if (attachment != null) {
            BodyPart attachmentBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(attachment);
            attachmentBodyPart.setDataHandler(new DataHandler(source));

            // 网上流传的解决文件名乱码的方法,其实用MimeUtility.encodeWord就可以很方便的搞定
            // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
            //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
            //attachmentBodyPart.setFileName("=?GBK?B?" + enc.encode(attachment.getName().getBytes()) + "?=");
            // MimeUtility.encodeWord可以避免中文文件名乱码
            attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
            multipart.addBodyPart(attachmentBodyPart);
        }
        message.setContent(multipart);
        Transport.send(message);
    }


    // 发送纯文字邮件,可以添加抄送地址
    public static void sendTextEmailAndCC(String to, Address[] CCs,String subject, String content)
            throws FileNotFoundException, IOException, MessagingException {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(FROM));
        message.setRecipient(RecipientType.TO, new InternetAddress(to));

        if(CCs != null && CCs.length > 0) {
            message.addRecipients(Message.RecipientType.CC,CCs);
        }

        /*//添加抄送地址
        String cc1 = "zouchunzheng@315che.com";
        Address address_cc1 = new InternetAddress(cc1);
        Address[] cc = {address_cc1};
        message.addRecipients(Message.RecipientType.CC,cc);*/

        message.setSubject(subject);
        message.setText(content);
        message.setSentDate(new Date());
        Transport.send(message);
    }


}

浅谈_二:使用Spring封装的JavaMailSender进行邮件的发送

一__设置好邮箱的SMTP/POP3/IMAP协议的授权

此处如上所述,略

二__引入依赖

此处如上所述,略

三__配置applicationContext-mail.xml文件(可选操作,也可以在类中进行配)
<!-- 邮件服务 -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.qq.com"/>
        <property name="port" value="587"/>//或许你可以用465端口,默认的25不适合
        <property name="protocol" value="smtp"/>
        <property name="username" value="*********@qq.com"/>//邮箱账号
        <property name="password" value="xxxxxxxxxxxx"/>//QQ个人邮箱需要授权码,腾讯企业邮箱需要登录密码
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="javaMailProperties">  
            <props>  
                <prop key="mail.smtp.auth">true</prop> 
                <prop key="mail.smtp.timeout">25000</prop>  
            </props>  
        </property>  

    </bean>
四__工具类代码
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.File;
import java.util.Date;
import java.util.Properties;

/**
 * 使用Spring的JavaMail发送邮件的工具类
 */
public class EmailUtil {

    //邮箱发送服务器   QQ企业邮箱
    private static final String HOST = "smtp.exmail.qq.com";
    //邮箱接收服务器   QQ企业邮箱
    private static final String REV = "imap.exmail.qq.com";
    //协议类型
    private static final String PROTOCOL = "smtp";
    //端口
    private static final int PORT = 587;//465
    //发送邮件地址
    private static final String FROM = "**********";
    //用户名
    private static final String USERNAME = "**********";
    //密码_QQ邮箱必须填写授权码_QQ企业邮箱填写登录密码即可
    private static final String PASSWORD = "*********";
    //字符集
    private static final String ENCODE = "UTF-8";
    //邮件抄送地址
    private static final String CC = "**********";
    //邮件密送地址
    private static final String BCC = "********";
    //系统属性
    private static final String AUTH = "true";
    private static final String TIMEOUT = "25000";

    //创建一个JavaMailSenderImpl对象,该对象实现了JavaMailSender接口
    private static JavaMailSenderImpl sender = new JavaMailSenderImpl();

    //创建一个系统属性集
    private static Properties prop = new Properties();

    static {
        //设置邮件服务器参数
        sender.setHost(HOST);
        sender.setProtocol(PROTOCOL);
        sender.setPort(PORT);
        sender.setUsername(USERNAME);
        sender.setPassword(PASSWORD);
        sender.setDefaultEncoding(ENCODE);
        //设置系统属性
        prop.put("mail.smtp.auth",AUTH);
        prop.put("mail.smtp.timeout",TIMEOUT);
        prop.put("mail.smtps.ssl.enable", "true");
        //设置调试模式可以在控制台查看发送过程
        prop.put("mail.debug", "true");
        sender.setJavaMailProperties(prop);
    }

    /**
     * 发送普通文本的邮件
     * @param to
     * @param subject
     * @param text
     * @return
     */
    public static boolean sendTextMail(String[] to,String subject,String text) {
        boolean result = true;
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(FROM);
        message.setTo(to);
        message.setSubject(subject);
        message.setSentDate(new Date());
        message.setText(text);
        try {
            sender.send(message);
        } catch (MailException e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }

    /**
     * 发送html格式的邮件
     * @param to
     * @param subject
     * @param html
     * @return
     */
    public static boolean sendHtmlMail(String[] to,String subject,String html) {
        boolean result = true;
        MimeMessage mimeMessage = sender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
        try {
            messageHelper.setFrom(FROM);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(html,true);
            messageHelper.setSentDate(new Date());
            sender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }

    /**
     * 发送带内嵌图片的邮件
     * html中src:cid的数据需要与addInline()中第一个参数一致
     * @param to
     * @param subject
     * @param filePath
     * @param html
     * @return
     */
    public static boolean sendPicMail(String[] to,String subject,String filePath,String html) {
        boolean result = true;
        MimeMessage mailMessage = sender.createMimeMessage();
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true);
            messageHelper.setFrom(FROM);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(html,true);
            //FileSystemResource file = new FileSystemResource(new File(filePath));
            FileSystemResource file = new FileSystemResource(filePath);
            String filename = file.getFilename();
            messageHelper.addInline(filename,file);
            sender.send(mailMessage);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }


    /**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param filePath
     * @param html
     * @return
     */
    public static boolean sendFileMail(String[] to,String subject,String filePath,String html) {
        boolean result = true;
        MimeMessage mailMessage = sender.createMimeMessage();
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true,"UTF-8");
            messageHelper.setFrom(FROM);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(html,true);
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String filename = file.getFilename();
            //如果附件的中文名乱码
            //String filename = MimeUtility.encodeWord(file.getFilename());
            messageHelper.addAttachment(filename,file);
            sender.send(mailMessage);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }


}

注:在发送带内嵌图片的邮件时,传入的html参数中的<img src='cid:name.png'>,需要与addInline()方法中的第一个参数完全一致,否则图片无法显示!!!

这里附上借鉴的另一篇关于发送邮件的优秀博客:

https://blog.csdn.net/caimengyuan/article/details/51224269点击打开链接

JavaAPI的详解:

https://blog.csdn.net/imain/article/details/1453677点击打开链接

Ps : javax.mail.jar的版本过低会出现问题,最开始用的1.3.0的版本就出现了各种问题,搞了好久发现是版本过低了.............难过



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值