JavaMail 发送邮件

昨天在项目中用到发邮件的功能,今天将发邮件的代码整理了一下。只是简单的示例,还请多多指教。
package xxxx.mail;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Properties;
import java.util.StringTokenizer;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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;

public class SendAttachMail {
    /**
     * Logger for this class
     */
    private static final Logger logger = LoggerFactory.getLogger(SendAttachMail.class);

    private String SMTPHost = ""; // SMTP服务器
    private int SMTPPort = 25; // SMTP服务器端口
    private String user = ""; // 登录SMTP服务器的帐号
    private String password = ""; // 登录SMTP服务器的密码
    private static SendAttachMail sendMail = new SendAttachMail();

    // 无参数构造方法
    private SendAttachMail() {
    }

    // 返回本类对象的实例
    public static SendAttachMail getSendMailInstantiate() {
        return sendMail;
    }


    private ArrayList<String> getFilename(ArrayList<String> filename) {
        Iterator<String> iterator = filename.iterator();
        ArrayList<String> attachArrayList = new ArrayList<String>();
        while (iterator.hasNext()) {
            String attachment = iterator.next();
            try {
                // 解决文件名的中文问题
                attachment = MimeUtility.decodeText(attachment);
                // 将文件路径中的'\'替换成'/'
                attachment = attachment.replaceAll("\\\\", "/");
                attachArrayList.add(attachment);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return attachArrayList;
    }

   
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSMTPHost() {
        return SMTPHost;
    }

    public void setSMTPHost(String host) {
        SMTPHost = host;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    private Address[] getAddresses(String to){
        int i = 0;
        Address[] addresses = null;
        StringTokenizer tokenizer = new StringTokenizer(to, ";");
        addresses = new Address[tokenizer.countTokens()];// 动态的决定数组的长度
        while (tokenizer.hasMoreTokens()) {
            String d = tokenizer.nextToken();
            try {
                d = MimeUtility.encodeText(d);
                addresses[i] = new InternetAddress(d);// 将字符串转换为整型
            } catch (Exception e) {
                e.printStackTrace();
            }
            i++;
        }
        
        return addresses;
    }

    public void connect() throws Exception {

        
        
        
    }

    // 发送邮件
    public boolean send(String from, String to, String cp_to, String subject, String content, ArrayList<String> attachments) {
        boolean issend = false;
        Transport transport = null;
        try {
            // 连接smtp服务器
            // 创建一个属性对象
            Properties props = new Properties();
            // 指定SMTP服务器
            props.put("mail.smtp.host", SMTPHost);
            // 指定SMTP服务器
            props.put("mail.smtp.port", SMTPPort);
            // 指定是否需要SMTP验证
            props.put("mail.smtp.auth", "true");
            // 创建一个授权验证对象
            SmtpPop3Auth auth = new SmtpPop3Auth();
            auth.setAccount(user, password);
            // 创建一个Session对象
            Session mailSession = Session.getDefaultInstance(props, auth);
            // 设置是否调试
            mailSession.setDebug(false);
            // 创建一个Transport对象
            transport = mailSession.getTransport("smtp");
            // 连接SMTP服务器
            transport.connect(SMTPHost, user, password);
            // 创建一个MimeMessage 对象
            MimeMessage message = new MimeMessage(mailSession);

            // 指定发件人邮箱
            message.setFrom(new InternetAddress(from));
            // 指定收件人邮箱
            message.addRecipients(Message.RecipientType.TO, getAddresses(to));
            if (cp_to!=null && !"".equals(cp_to))
                // 指定抄送人邮箱
                message.addRecipients(Message.RecipientType.CC, getAddresses(cp_to));
            // 指定邮件主题
            
            try {
                // 解决标题的中文问题
                subject = MimeUtility.encodeText(subject);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            
            message.setSubject(subject);
            // 指定邮件发送日期
            message.setSentDate(new Date());
            // 指定邮件优先级 1:紧急 3:普通 5:缓慢
            message.setHeader("X-Priority", "1");
            message.saveChanges();
            // 判断附件是否为空
            if (attachments!=null && !attachments.isEmpty()) {
                
                attachments = getFilename(attachments);
                
                // 新建一个MimeMultipart对象用来存放多个BodyPart对象
                Multipart container = new MimeMultipart();
                // 新建一个存放信件内容的BodyPart对象
                BodyPart textBodyPart = new MimeBodyPart();
                // 给BodyPart对象设置内容和格式/编码方式
                textBodyPart.setContent(content, "text/html;charset=gbk");
                // 将含有信件内容的BodyPart加入到MimeMultipart对象中
                container.addBodyPart(textBodyPart);
                Iterator<String> fileIterator = attachments.iterator();
                while (fileIterator.hasNext()) {// 迭代所有附件
                    String attachmentString = fileIterator.next();
                    // 新建一个存放信件附件的BodyPart对象
                    BodyPart fileBodyPart = new MimeBodyPart();
                    // 将本地文件作为附件
                    FileDataSource fds = new FileDataSource(attachmentString);
                    fileBodyPart.setDataHandler(new DataHandler(fds));
                    // 处理邮件中附件文件名的中文问题
                    String attachName = fds.getName();
                    attachName = MimeUtility.encodeText(attachName);
                    // 设定附件文件名
                    fileBodyPart.setFileName(attachName);
                    // 将附件的BodyPart对象加入到container中
                    container.addBodyPart(fileBodyPart);
                }
                // 将container作为消息对象的内容
                message.setContent(container);
            } else {// 没有附件的情况
                message.setContent(content, "text/html;charset=gbk");
            }
            // 发送邮件
            Transport.send(message, message.getAllRecipients());
            if (transport != null)
                transport.close();

            issend = true;
        } catch (Exception ex) {
            logger.error("send mail error:",ex);
        }
        return issend;
    }
}

package xxx.mail;


import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;


/**
 * 类说明:SMTP/POP3授权验证类 
 * 
 */


class SmtpPop3Auth extends Authenticator {
	String user, password;


	// 设置帐号信息
	void setAccount(String user, String password) {
		this.user = user;
		this.password = password;
	}


	// 取得PasswordAuthentication对象
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(user, password);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值