Java发送电子邮件

Java发送电子邮件,第1张

Java发送电子邮件 导入依赖/jar包

通过maven导入javax.mail和javax.activation的依赖,或者去Maven Repository 下载这两个包(注意包名),这两个包已经完善了,不会再有新版本,可以直接复制粘贴。


    javax.mail
    mail
    1.4.7


    javax.activation
    activation
    1.1.1


申请邮件服务器方的POP3/SMTP授权码

这里以QQ邮箱为例,其他的也差不多。

设置->账户->往下拉->开启POP3/SMTP服务。


发送一封简单邮件

发送一封不带附件的邮件

发件人是固定的,不需要传参哦,如果改变发件人,就要改授权码对应改发件人的授权码

public static void sendMessage(String to, String subject, String msg, boolean log){
    try {
        Properties properties = new Properties();
        // 设置QQ邮件服务器,发件人邮箱地址必须是该邮箱服务器的邮箱
        properties.setProperty("mail.host","smtp.qq.com");  
        properties.setProperty("mail.transport.protocol","smtp");   // 指定发送协议为smtp
        properties.setProperty("mail.smtp.auth","true");        // 需要验证用户名密码

        // 邮件加密
        MailSSLSocketFactory factory = new MailSSLSocketFactory();
        factory.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",factory);

        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发件人邮箱xxxxxxx@xx.xxx","授权码");
            }
        });

        // 开启Session的debug模式,可以看到发送时的日志输出,不设置此属性默认为false,不输出日志
        session.setDebug(log);

        // 通过session获得transport对象,用于发送邮件
        Transport transport = session.getTransport();

        transport.connect("smtp.qq.com","发件人邮箱xxxxxxx@xx.xxx","授权码");

        // 创建邮件对象
        MimeMessage mimeMessage = new MimeMessage(session);

        // 指定发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱xxxxxxx@xx.xxx"));

        // 指定收件人
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(to));

        // 设置邮件主题
        mimeMessage.setSubject(subject);
        
        // 设置邮件正文文本
        mimeMessage.setContent(msg,"text/html;charset=utf-8");

        // 发送邮件
        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        
        // 关闭连接
        transport.close();
    } catch (GeneralSecurityException | MessagingException e) {
        System.out.println("邮件发送失败");
        e.printStackTrace();
    }
}

*发送一封完整的邮件

发送一封完整的邮件,包含主题,正文文本,图片附件,文件附件。

约定:文件路径/图片路径数组各元素必须和其文件名/别名数组一一对应。

也可通过该方法发送简单邮件,把不需要的东西入参时传入null

这个方法我已经封装的尽可能完善了,可以直接拿去用

public static void sendMessage(@NotNull String to,@NotNull String subject, @NotNull String msg,
                               String[] imgPaths, String[] imgAlias,
                               String[] filePaths,String[] fileNames,boolean log){
    try {
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");
        properties.setProperty("mail.transport.protocol","smtp");
        properties.setProperty("mail.smtp.auth","true");

        MailSSLSocketFactory factory = new MailSSLSocketFactory();
        factory.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",factory);

        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发件人邮箱xxxxxxx@xx.xxx","授权码");
            }
        });
        session.setDebug(log);
        Transport transport = session.getTransport();
        transport.connect("smtp.qq.com","发件人邮箱xxxxxxx@xx.xxx","授权码");

        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress("发件人邮箱xxxxxxx@xx.xxx"));
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(to));
        mimeMessage.setSubject(subject);

        MimeMultipart contentParts = new MimeMultipart();   // 正文中的模块
        // 判断入参
        if (imgPaths != null && imgAlias != null && imgPaths.length == imgAlias.length){
            // 向正文中添加图片附件
            for (int i = 0; i < imgPaths.length; i++) {
                MimeBodyPart img = new MimeBodyPart();
                DataHandler handler = new DataHandler(new FileDataSource(imgPaths[i]));
                img.setDataHandler(handler);
                img.setContentID(imgAlias[i]);			// 设置图片别名
                contentParts.addBodyPart(img);
            }
        }
        // 邮件正文文本
        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(msg,"text/html;charset=utf-8");

        // 向正文模块中添加正文文本
        contentParts.addBodyPart(contentText);
        contentParts.setSubType("related");

        // 把正文模块设置到正文中
        MimeBodyPart content = new MimeBodyPart();      // 正文
        content.setContent(contentParts);

        MimeMultipart email = new MimeMultipart();      // 相当于整封邮件
        // 判断入参
        if (filePaths != null && fileNames != null && filePaths.length == fileNames.length){
            // 向邮件中添加文件附件
            for (int i = 0; i < filePaths.length; i++) {
                MimeBodyPart file = new MimeBodyPart();
                DataHandler handler = new DataHandler(new FileDataSource(filePaths[i]));
                file.setDataHandler(handler);
                file.setFileName(fileNames[i]);     // 设置文件名
                email.addBodyPart(file);
            }
        }

        email.addBodyPart(content);
        email.setSubType("mixed");

        mimeMessage.setContent(email);
        mimeMessage.saveChanges();

        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        transport.close();
    } catch (GeneralSecurityException | MessagingException e) {
        System.out.println("邮件发送失败");
        e.printStackTrace();
    }
}

Test

注意content中标签的src属性是"cid:first",就是上面给的图片别名,通过图片别名来引用该图片,因此需要一一对应

String[] imgPaths = {"src/1.jpg","src/2.jpg"};
String[] imgAlias = {"first","second"};
String[] filePaths = {"src/my.xml","src/db.properties"};
String[] fileAlias = {"my.xml","db.properties"};
//正文文本html
String content = "" +
    "张三李四和王五" +
    "";
// 全参数的完整邮件
sendMessage("收件人邮箱地址","完整邮件测试",content,imgPaths,imgAlias,filePaths,fileAlias,true);
// 不带文件附件的邮件
sendMessage("收件人邮箱地址","完整邮件测试",content,imgPaths,imgAlias,null,null,true);
// 不带图片附件的邮件
sendMessage("收件人邮箱地址","完整邮件测试",content,null,null,filePaths,fileAlias,true);
// 仅正文的简单邮件
sendMessage("收件人邮箱地址","完整邮件测试",content,null,null,null,null,true);

...

// 我不知道可不可以发没有正文的邮件,但是我寻思应该没人会发正文都没有的邮件吧。。。

结果

测试时也可以自己给自己发,但是不建议发太多内容重复的邮件,容易被检测成垃圾邮件,如果发送成功找不到邮件,可以去垃圾箱看看。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5562955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存