首页   >   代码编程

Java发送新浪邮件图文教程

前面分别讲过了Java发送QQ邮件和Java发送163邮件,本文接着来看一下Java发送新浪邮件,一样需要在设置中开启IMAP/SMTP服务,不过新浪邮箱跟QQ邮箱和网易邮箱不一样,它这里不需要授权码,直接点击开启就完事,后面就直接使用账号密码来发送。

Java发送新浪邮件图文教程

新浪邮箱的配置简直不要太简单,不多说,直接上代码

package com.wolffy.reader.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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 java.util.Properties;

/**
 * 发送新浪邮件工具类,可发送纯文本、富文本、附件格式的邮件
 * Created by wolffy on 2019/4/10
 */
@Slf4j
public class SinaMailUtil {

    /**
     * 发送者邮箱
     */
    private static final String sender = "发送者邮箱";

    /**
     * 邮箱密码
     */
    private static final String password = "邮箱密码";

    private static Properties properties() {
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");// 连接协议
        properties.put("mail.smtp.host", "smtp.sina.com");// 主机名,必须要,也可以使用smtp.sina.com.cn
        properties.put("mail.smtp.port", 465);// 端口号,写不写无所谓,不确定的情况下,可以不写
        properties.put("mail.smtp.auth", "true");// 是否鉴权,必须要
        properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接,一般都使用
        properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息,其中就包含了port
        return properties;
    }

    /**
     * 发送纯文本类型的新浪邮件
     *
     * @param receiver 接收者邮箱
     * @param subject  邮件标题
     * @param content  邮件内容
     */
    public static void sendTextEmail(String receiver, String subject, String content) {
        try {
            // 得到会话对象
            Session session = Session.getInstance(properties());
            // 获取邮件对象
            Message message = new MimeMessage(session);
            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress(sender));
            // 设置收件人邮箱地址
            // 多个收件人
            // message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@sina.com"), new InternetAddress("xxx@sina.com")});
            // 一个收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));// 发送
            // message.setRecipient(Message.RecipientType.CC, new InternetAddress(receiver));// 抄送
            // message.setRecipient(Message.RecipientType.BCC, new InternetAddress(receiver));// 暗送
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件内容
            message.setText(content);

            // setText等同于如下写法,将mimeType封装起来了,提供出一个简单的API
            // MimeBodyPart textPart = new MimeBodyPart();
            // textPart.setContent(content, "text/plain;charset=UTF-8");
            // MimeMultipart multipart = new MimeMultipart();
            // multipart.addBodyPart(textPart);
            // message.setContent(multipart);

            // 将创建好的邮件写入到磁盘盘以文件的形式进行保存
            // message.saveChanges();
            // message.writeTo(new FileOutputStream("/Users/felix/Desktop/sina_email.eml"));

            // 得到传输对象
            Transport transport = session.getTransport();
            // 连接自己的邮箱账户
            transport.connect(sender, password);// 密码为邮箱登录密码
            // 发送邮件
            transport.sendMessage(message, message.getAllRecipients());
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    /**
     * 发送富文本类型的新浪邮件
     *
     * @param receiver 接收者邮箱
     * @param subject  邮件标题
     * @param content  邮件内容,一段html
     */
    public static void sendRichEmail(String receiver, String subject, String content) {
        try {
            // 得到会话对象
            Session session = Session.getInstance(properties());
            // 获取邮件对象
            Message message = new MimeMessage(session);
            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress(sender));
            // 设置收件人邮箱地址
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件内容
            MimeMultipart multipart = new MimeMultipart();
            message.setContent(multipart);
            // 准备正文
            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
            multipart.addBodyPart(textPart);
            // 得到传输对象
            Transport transport = session.getTransport();
            // 连接自己的邮箱账户
            transport.connect(sender, password);// 密码为邮箱登录密码
            // 发送邮件
            transport.sendMessage(message, message.getAllRecipients());
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    /**
     * 发送带图片的新浪邮件,此种方式需要对文本内容详细规划,不能直接拷贝一段html来发送(本质上来说还是发送附件:sendFileEmail(),附件就是图片,只不过图片不以附件的方式展示出来),
     * 如果不想要上传那图片,只是想引用一下其他地方(比如OSS)的图片,可使用sendRichEmail()方法,在html文本中使用img标签进行图片引入
     * <p>
     * 具体表现为:
     * <p>
     * 文本中用到的图片,都需要以附件的方式上传到服务器,但是并不以附件的方式展示出来,而是需要指定一个唯一的ContentID,然后直接在文本中使用<img src='cid:图片名'>进行引用
     *
     * @param receiver 接收者邮箱
     * @param subject  邮件标题
     * @param content  邮件内容(富文本),尽量包含图片在内
     * @param imgPath  图片路径,会以Base64的形式上传到邮箱,多张可以改变方法参数,用list或者字符串解析,然后循环指定ContentID再在文本中引用
     */
    public static void sendImgEmail(String receiver, String subject, String content, String imgPath) {
        try {
            // 得到会话对象
            Session session = Session.getInstance(properties());
            // 获取邮件对象
            Message message = new MimeMessage(session);
            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress(sender));
            // 设置收件人邮箱地址
            // 多个收件人
            // message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("xxx@sina.com"), new InternetAddress("xxx@sina.com")});
            // 一个收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件内容
            MimeMultipart multipart = new MimeMultipart();
            message.setContent(multipart);

            // 准备正文
            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
            multipart.addBodyPart(textPart);

            // 准备图片数据,必须将图片传上去,才可以在正文中访问,说实话,cid一一对应的写法真麻烦
            // 如果是网络图片,可以直接在富文本中写好路径,这样就无需上传了,见sendRichEmail()方法
            // 单张图片
            MimeBodyPart imagePart = new MimeBodyPart();
            DataHandler handler = new DataHandler(new FileDataSource(imgPath));
            imagePart.setDataHandler(handler);
            // 取个别名,在内容中引用,引用格式:<img src='cid:图片名字'>
            // 图片上传了未引用,或者引用的时候别把名字写错了,这两种情况会形成附件形式的邮件,而且附件还是未转码的格式(.bin结尾)
            imagePart.setContentID(handler.getName());
            // 多张图片
            // for (int i = 0; i < 10; i++) {
            //     MimeBodyPart imagePart = new MimeBodyPart();
            //     DataHandler handler = new DataHandler(new FileDataSource("/Users/felix/Desktop/xxx.jpg"));
            //     imagePart.setDataHandler(handler);
            //     imagePart.setContentID("xxx" + i + ".jpg");// 取个别名,在内容中引用
            // }
            multipart.addBodyPart(imagePart);
            // 得到传输对象
            Transport transport = session.getTransport();
            // 连接自己的邮箱账户
            transport.connect(sender, password);// 密码为邮箱登录密码
            // 发送邮件
            transport.sendMessage(message, message.getAllRecipients());
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    /**
     * 发送带附件的新浪邮件
     *
     * @param receiver 接收者邮箱
     * @param subject  邮件标题
     * @param content  邮件内容
     * @param filePath 附件路径,会以Base64的形式上传到邮箱(多个附件需要改写此方法,filePath需要传递多个进来)
     */
    public static void sendFileEmail(String receiver, String subject, String content, String filePath) {
        try {
            // 得到会话对象
            Session session = Session.getInstance(properties());
            // 获取邮件对象
            Message message = new MimeMessage(session);
            // 设置发件人邮箱地址
            message.setFrom(new InternetAddress(sender));
            // 设置收件人邮箱地址
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件内容
            MimeMultipart multipart = new MimeMultipart();
            message.setContent(multipart);
            // 准备正文
            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setContent(content, "text/html;charset=UTF-8");// 指定文本格式为html
            multipart.addBodyPart(textPart);
            // 单个附件
            MimeBodyPart imagePart = new MimeBodyPart();
            DataHandler handler = new DataHandler(new FileDataSource(filePath));
            imagePart.setDataHandler(handler);
            imagePart.setFileName(handler.getName());// 注意这里:不再需要setContentId了
            multipart.addBodyPart(imagePart);
            // 得到传输对象
            Transport transport = session.getTransport();
            // 连接自己的邮箱账户
            transport.connect(sender, password);// 密码邮箱登录密码
            // 发送邮件
            transport.sendMessage(message, message.getAllRecipients());
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            log.error("发送新浪邮件失败:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    public static void main(String[] args) {
        sendTextEmail("111111111@sina.com", "aaa", "ccccc");
        sendImgEmail( "111111111@sina.com", "test-image-1", "大风起兮云飞扬,威加海内兮归故乡,<img src='cid:intresting.jpg'>苟利国家生死以,起因祸福趋避之。", "/Users/felix/Desktop/intresting.jpg");
        sendRichEmail("111111111@sina.com", "test-image-2", "大风起兮云飞扬,威加海内兮归故乡,<img src='http://cdn.jiweichengzhu.com/upload/image/20190410/3cfdb6ff-14d0-4030-b8eb-7fb4ddb03957.jpg'>苟利国家生死以,起因祸福趋避之。");
        sendFileEmail("111111111@sina.com", "test-file", "测试附件来喽", "/Users/felix/Desktop/intresting.jpg");
    }

}

运行结果如下:

Java发送新浪邮件图文教程

看到了醒目的250,发送成功!

不过需要注意一点,新浪邮箱比较特立独行,指定了cid引用附件图片,甚至也没有指定fileName,也依旧还是将图片当做附件显示出来了,所以说,在新浪邮箱中,cid的方式几乎没有任何的鸟用~

Java发送新浪邮件图文教程

但是跟网易邮箱一样,如果不在浏览器中登录邮箱,就没有任何问题,使用客户端查看邮件时,不管是否第一次打开,都是正常的。

刺激,真可称得上是:因缺斯厅!!!

QQ群: 686430774  /  718410762

站长Q: 1347384268

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-04-13

永久地址:https://www.jiweichengzhu.com/article/e323069771f54ef3b3e042f4d2bc9a58

评论