使用Java程序发送邮件|发送有附件的邮件|进行邮件群发

Posted 炒冷饭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java程序发送邮件|发送有附件的邮件|进行邮件群发相关的知识,希望对你有一定的参考价值。

今天公司某一个业务需要给顾客发邮件进行营销,并且需要附带附件,公司当前对该功能还没有进行封装。我暂时对于使用Java程序发送邮件练习一个小demo。

本文涉及到的知识点:
1.如何使用Java程序发送邮件
2.如何发送有附件的邮件
3.如何进行群发邮件
4.如何携带多个附件

一、开启邮箱服务

  • 打开QQ邮箱客户端,点击设置

image-20210720005837720

  • 打开服务,并获取授权码(注意授权码很重要,为了保证传输的安全,我们后续使用传输中需要使用授权码作为密码的校验)
    • 注意这一步可能需要我们使用绑定邮箱的手机号发送短信,然后返回页面查看授权码就OK了

image-20210720010029306

编写发送邮件程序

import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Properties;
 
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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 com.alibaba.druid.util.StringUtils;
import com.sun.mail.util.MailSSLSocketFactory;
 
/**
* 发送邮件工具类
*
* @author leiyu
*/
public class SendMailAcceUtils {
 
    /**
     * 发送带附件的邮件
     *
     * @param receive  收件人
     * @param subject  邮件主题
     * @param msg      邮件内容
     * @param filename 附件地址
     * @return
     * @throws GeneralSecurityException
     */
    public static boolean sendMail(String receive, String subject, String msg, String filename)
            throws GeneralSecurityException {
        if (StringUtils.isEmpty(receive)) {
            return false;
        }
 
        // 发件人电子邮箱
        final String from = "1010866409@qq.com";
        // 发件人电子邮箱密码
        final String pass = "xxxxxxxxxx";//注意这部分就是你获取的授权码
 
        // 指定发送邮件的主机为 smtp.qq.com
        String host = "smtp.qq.com"; // 邮件服务器
 
        // 获取系统属性
        Properties properties = System.getProperties();
 
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);
 
        properties.put("mail.smtp.auth", "true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
                return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
            }
        });
 
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
 
            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from));
 
            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
 
            // Set Subject: 主题文字
            message.setSubject(subject);
 
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
 
            // 消息
            messageBodyPart.setText(msg);
 
            // 创建多重消息
            Multipart multipart = new MimeMultipart();
 
            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);
 
            // 附件部分
            messageBodyPart = new MimeBodyPart();
            // 设置要发送附件的文件路径
            DataSource source = new FileDataSource(filename);
            messageBodyPart.setDataHandler(new DataHandler(source));
 
            // messageBodyPart.setFileName(filename);
            // 处理附件名称中文(附带文件路径)乱码问题
            messageBodyPart.setFileName(MimeUtility.encodeText(filename));
            multipart.addBodyPart(messageBodyPart);
 
            // 发送完整消息
            message.setContent(multipart);
 
            // 发送消息
            Transport.send(message);
            // System.out.println("Sent message successfully....");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }
    public static void main(String[] args) {
        String receive="1010866409@qq.com";
        String subject ="邮件主题";
        String msg ="邮件内容";
        String filename ="E:\\\\a.excel";
        try {
            SendMailAcceUtils.sendMail(receive, subject, msg, filename);
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
    }
}

发送邮件— 实现群发

实现邮件的群发,实际上就是发件人的邮箱是多个,我们可能有多种方式进行邮件的发送,这里举例是使用最简单遍历的方式实现邮件的群发。

    public static void main(String[] args) {
        /******实现Java邮件的群发*****/
        ArrayList<String> strings = new ArrayList<String>();
        strings.add("1010866409@qq.com");
        strings.add("1010866409@qq.com");
        /*****************/
//        String receive="1010866409@qq.com";

        for (int i = 0; i < strings.size() ; i++) {
            String receive=strings.get(i);
            String subject ="这是一个邮件主题(欢迎您选择我们得营销策略)";
            String msg ="邮件内容(欢迎来店选购适合您的产品)";
            String filename ="E:\\\\a.md";
            try {
                SendMailAcceUtils.sendMail(receive, subject, msg, filename);
            } catch (GeneralSecurityException e) {
                e.printStackTrace();
            }
        }
    }

在这里插入图片描述

以上是关于使用Java程序发送邮件|发送有附件的邮件|进行邮件群发的主要内容,如果未能解决你的问题,请参考以下文章

Mime 和 Office365

使用 Java 发送邮件

使用 Java 发送邮件附件

Java使用javax.mail.jar发送邮件并同意发送附件

从任何电子邮件程序发送带有附件的电子邮件

java发送邮件