欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA--发送Google邮件

程序员文章站 2024-03-20 10:54:46
...


1、介绍

网上的Google邮件发送也有很多, 这里也只是把我自己碰到的一些问题给记录一下

2、邮箱配置

1、直接使用应用专用密码: 先开启两步验证, 在配置应用专用密码.

JAVA--发送Google邮件

2、启用邮箱POP

JAVA--发送Google邮件

2、代码

package com.tolern.base.util.email;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * @author Tomorrow
 * @date 2020/11/2 17:41
 */
public class GoogleTest {
    /*
     * gmail邮箱SSL方式
     */
    private static void gmailssl(Properties props) {
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        props.put("mail.debug", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");
    }


    //gmail邮箱的TLS方式
    private static void gmailtls(Properties props) {
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");
    }

    /**
     * 创建邮件内容 需*
     *
     * @param sentToEmail 接收人邮箱
     * @return
     * @throws Exception
     */
    public static boolean getMimeMessage(String sentToEmail) throws Exception {
        //1.创建一封邮件的实例对象
        Properties props = new Properties();
        //选择ssl方式
        gmailtls(props);

        final String username = "aaa@qq.com";// gmail 邮箱
        final String password = "123132";// Google应用专用密码
        // 当做多商户的时候需要使用getInstance, 如果只是一个邮箱发送的话就用getDefaultInstance
        // Session.getDefaultInstance 会将username,password保存在session会话中
        // Session.getInstance 不进行保存
        Session session = Session.getInstance(props,
                new Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        MimeMessage msg = new MimeMessage(session);
        //2.设置发件人地址
        msg.setFrom(new InternetAddress(sentToEmail));
        /**
         * 3.设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
         * MimeMessage.RecipientType.TO:发送
         * MimeMessage.RecipientType.CC:抄送
         * MimeMessage.RecipientType.BCC:密送
         */
        msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(sentToEmail));
        //4.设置邮件主题
        msg.setSubject("To reset your password!", "UTF-8");

        // 6. 创建文本"节点"
        MimeBodyPart text = new MimeBodyPart();
        // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent("<p>亲爱的用户:</p>" +
                        "<p>&nbsp; &nbsp; 您好! 您正在进行重置密码操作, 本次生成的密码为:</p>" +
                        "<p>&nbsp;&nbsp;&nbsp;&nbsp;\u200B" + 1234 + "&nbsp;(为了保障您帐号的安全性,请尽快修改密码)</p>" +
                        "<p><br></p><p>该邮件为系统自动发送, 请勿进行回复!</p>" +
                        "<p><br></p>",
                "text/html;charset=UTF-8");

        // 7. (文本+图片)设置 文本 和 图片"节点"的关系(将 文本 和 图片"节点"合成一个混合"节点")
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(text);
        mm_text_image.setSubType("related");    // 关联关系


        // 11. 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
        msg.setContent(mm_text_image);
        //设置邮件的发送时间,默认立即发送
        msg.setSentDate(new Date());

        Transport.send(msg);
        return true;
    }

    public static void main(String[] args) throws Exception {
        boolean mimeMessage = getMimeMessage("aaa@qq.com");
        System.out.println(mimeMessage);
    }
}

内容也可以是这样的:

<div>
			<div style="text-align: center; border-bottom: 2px solid #ccc; padding: 20px 0;">
				<img style="width: 225px;" src="https://***-image.oss-eu-central-1***m/***/***.png" />
			</div>
			<div style="padding: 10px 25px;">
				<p style="font-size: 20px; font-family: 'arial'; color: rgba(0,0,0,0.9);">Hi (CLIENT_NAME)!</p>
				<div style="height: 5px;"></div>
				<p style="font-size: 20px; font-family: 'arial'; color: rgba(0,0,0,0.9);">Please click on the link below to verify your email address:</p>
				<div style="height: 10px;"></div>
				<a href="BINDING_EMAIL" style="display: block; text-decoration: none; background: #61B9AA;  text-align: center; height: 70px; line-height: 70px; margin: 0 auto; border-radius: 10px;" target="_blank" style="text-align:center;">
					<span style="font-family: arial; color: #fff;font-size: 22px;">
						Verify Email
					</span>
				</a>
				</p>
				<div style="height: 5px;"></div>
				<p style="font-size: 20px; font-family: 'arial'; color: rgba(0,0,0,0.9);">Or, if the link is not working, copy and paste this code in the app: <span style="color: #61B9AA;">NUMBER_EMAIL</span></p>
				<div style="height: 5px;"></div>
				<p style="font-size: 20px; font-family: 'arial'; color: rgba(0,0,0,0.9);">Happy charging!</p>
				<div style="height: 5px;"></div>
				<p style="font-size: 20px; font-family: 'arial'; color: rgba(0,0,0,0.9);">The Chargie Team</p>
			</div>
		</div>

3、注意点

1、因为我们做的是多商户, 当时发件人一直切换不成功, 最后发现用错了方法. Session.getInstance
2、应用专用密码, 避免Google的安全检查
3、如果不开启两步验证, 需要做如下操作:
开启安全性较低的应用的访问权限: https://myaccount.google.com/lesssecureapps
JAVA--发送Google邮件
允许安全性较低的应用的访问权限: https://accounts.google.com/DisplayUnlockCaptcha
JAVA--发送Google邮件

4、服务器发送邮件

1、安装mailx:yum install -y mailx
2、编辑配置文件:vim /etc/mail.rc
在最后面添加:
set smtp=smtps://smtp.gmail.com:465
set smtp-auth=login
set smtp-auth-user=cm646236438@gmail.com(自己的邮箱)
set smtp-auth-password=123132(应用专用密码)
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
3、验证发送邮件:echo "测试测试测试测试测试测试" | mail -v -s "测试测试测试测试" 646236438@qq.com