Java发送带附件邮件示例程序

本文介绍了如何使用JavaMail API和Java Activation Framework发送带有附件的电子邮件。详细步骤包括安装必要的jar包,提供服务器、端口、账号和密码等信息,并展示了支持多收件人和多种内容格式的代码示例。特别指出,使用腾讯企业邮箱、腾讯QQ邮箱和网易163邮箱时,需要开启相应服务并获取授权码,如腾讯企业邮箱使用SMTP服务器smtp.exmail.qq.com和SSL验证,而QQ和163邮箱则使用465端口和非登录密码的授权码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用Java应用程序发送E-mail十分简单,但是需要依赖jar包。

安装JavaMail API,使用其中的mail.jar;

安装Java Activation Framework(JAF)中的activation.jar。

(详细内容请参考:菜鸟教程——Java 发送邮件


一个Java代码示例:


这个示例代码中,构造方法需要传入服务器、端口、账号、密码、发送者显示的名称。 可以支持一次发送多人、添加多个附件、支持各种内容格式。

包含一个内部类,用于账号密码认证。

package com.ebtrust.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * java send mail demo
 * 
 */
public class MailUtil {
	
	String smtp, smtp_port, servername, serverpaswd, personal;
	final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; 
    
	/**
	 * 构造方法
	 * @param smtp 发送服务器
	 * @param smtp_port 端口号
	 * @param servername 发送者账号
	 * @param serverpaswd 发送者密码
	 * @param personal 发件人名称显示
	 */
	public MailUtil(String smtp, String smtp_port,String servername, String serverpaswd, String personal){
		this.smtp = smtp;
		this.smtp_port = smtp_port;
		this.servername = servername;
		this.serverpaswd = serverpaswd;
		this.personal = personal;
	}
	
	public void sendMail(String subject, String email, String content){
		this.sendMail(subject, servername, new String[]{email}, content, new String[0], "text/html;charset=gb2312");
	}
	
    /**
     * send mail
     * @param subject 邮件主题
     * @param from 邮件发送来源方
     * @param to 邮件发送目标方,可以为多个
     * @param text 邮件内容
     * @param filenames 附件名称数组 每个元素的格式为 d:\a.doc;b.doc  , 其中<span style="font-family: Arial, Helvetica, sans-serif;">d:\a.doc为本身文件路径, b.doc为附件中显示的名字</span>; 
     * @param mimeType 文件格式
     */
    private void sendMail(String subject, String from, String[] to, String text, String[] filenames, String mimeType) {
        try {
        	//邮件发送者必须与账号相同
        	from = servername;   // 邮件发送者
            Properties props = new Properties();
            javax.mail.Session mailSession = null; // 邮件会话对象
            javax.mail.internet.MimeMessage mimeMsg = null; // MIME邮件对象
            
            props = java.lang.System.getProperties(); // 获得系统属性对象
            props.put("mail.smtp.host", smtp); // 设置SMTP主机
            
            //以下三行设置ssl连接。目前测试过qq企业邮箱、qq邮箱和163邮箱,只有qq企业邮箱需要设置SSL连接
            if (smtp.equals("smtp.exmail.qq.com")) {
            	props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); 
                props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
                props.setProperty("mail.smtp.socketFactory.port", smtp_port); 
			}
            
            props.setProperty("mail.smtp.port", smtp_port); 
            props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证
            // 到服务器验证发送的用户名和密码是否正确
            SmtpAuthenticator myEmailAuther = new SmtpAuthenticator(servername, serverpaswd);
            // 设置邮件会话 注意这里将认证信息放进了Session的创建参数里
            mailSession = javax.mail.Session.getInstance(props,
                    (Authenticator) myEmailAuther);
            // 设置传输协议
            javax.mail.Transport transport = mailSession.getTransport("smtp");
            // 设置from、to等信息
            mimeMsg = new javax.mail.internet.MimeMessage(mailSession);
            if (null != from && !"".equals(from)) {
                InternetAddress sentFrom = new InternetAddress(from);
                sentFrom.setPersonal(personal);
                mimeMsg.setFrom(sentFrom); // 设置发送人地址
            }
            InternetAddress[] sendTo = new InternetAddress[to.length];
            for (int i = 0; i < to.length; i++) {
                System.out.println("发送到:" + to[i]);
                sendTo[i] = new InternetAddress(to[i]);
            }
            mimeMsg.setRecipients(
                    javax.mail.internet.MimeMessage.RecipientType.TO, sendTo);
            mimeMsg.setSubject(subject, "gb2312");
            MimeBodyPart messageBodyPart1 = new MimeBodyPart();
            // messageBodyPart.setText(UnicodeToChinese(text));
            messageBodyPart1.setContent(text, mimeType);
            // 附件传输格式
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart1);
            for (int i = 0; i < filenames.length; i++) {
                MimeBodyPart messageBodyPart2 = new MimeBodyPart();
                String filename = filenames[i].split(";")[0];
                String displayname = filenames[i].split(";")[1];
                // 得到数据源
                FileDataSource fds = new FileDataSource(filename);
                // BodyPart添加附件本身
                messageBodyPart2.setDataHandler(new DataHandler(fds));
                // BodyPart添加附件文件名
                messageBodyPart2.setFileName(MimeUtility
                        .encodeText(displayname));
                multipart.addBodyPart(messageBodyPart2);
            }
            mimeMsg.setContent(multipart);
            // 设置信件头的发送日期
            mimeMsg.setSentDate(new Date());
            mimeMsg.saveChanges();
            // 发送邮件
            Transport.send(mimeMsg);
            transport.close();
            System.out.println("发送到成功!!!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String title = "title";// 所发送邮件的标题
        String from = "xxx@qq.com";// 从那里发送
        String sendTo[] = { "xxx@163.com" };// 发送到那里
        // 邮件的文本内容,可以包含html标记则显示为html页面
        String content = "test java send mail !!!!!!<br><a href=\"http://sjsky.javaeye.com/\">My blog</a>";
        // 所包含的附件,及附件的重新命名
        String fileNames[] = {"/Users/penie_shen/Desktop/1.png;test.png"};
   
        //MailUtil test = new MailUtil("smtp.qq.com", "465", "xxx@qq.com", "wdliwltgllaedecf", "你的好朋友");
        MailUtil test = new MailUtil();
        try {
            // MailSender mailsender = new MailSender();
            test.sendMail(title, test.servername, sendTo, content, fileNames,
                    "text/html;charset=gb2312");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

        
    /**
     * Smtp认证
     */
    class SmtpAuthenticator extends Authenticator {
        String username = null;
        String password = null;

        /**
         * SMTP身份验证
         * @param username
         * @param password
         */
        public SmtpAuthenticator(String username, String password) {
            super();
            this.username = username;
            this.password = password;
        }

        /**
         * @return pass
         */
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(this.username, this.password);
        }
    }


}

笔者试着用过腾讯企业邮箱、腾讯qq邮箱、网易163邮箱,注意点说明如下:


首先,记得到邮箱内开启相关服务。

其次,相关设置内容如下:

  • 腾讯企业邮箱:smtp服务器:smtp.exmail.qq.com;端口:465;
  • 腾讯qq邮箱:smtp服务器:smtp.qq.com;端口:465;密码非邮箱登录密码,而是获取到的授权码:为16位随机字母;
  • 网易163邮箱:smtp服务器:smtp.qq.com; 端口:25(25为大多数邮箱服务器smtp服务默认端口),密码非邮箱登录密码,而是另外设置的授权码。

腾讯企业邮箱中开启了SSL验证,而qq和163邮箱没有开启,所以在代码中,设置如下:

//以下三行设置ssl连接。目前测试过qq企业邮箱、qq邮箱和163邮箱,只有qq企业邮箱需要设置SSL连接
            if (smtp.equals("smtp.exmail.qq.com")) {
            	props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); 
                props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
                props.setProperty("mail.smtp.socketFactory.port", smtp_port); 
			}
            



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值