【java】实现发送带附件email

来源:互联网 发布:北京企业老板数据 编辑:程序博客网 时间:2024/06/11 05:52

一、目标

用java代码实现发送带附件email的功能

二、学习地址

http://wenku.baidu.com/view/0b5acc82e53a580216fcfe4e.html
http://redleaf.iteye.com/blog/78217

三、前期准备:

增加jar包:javamail1_4_5.zip

下载地址:​http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JPR

四、代码

public class SendMailService {    private MailInformation mailInfor;    private static SendMailService sendMailService;        public void setMailInfor(MailInformation mailInfor) {        this.mailInfor = mailInfor;    }            public static SendMailService getService() {        if (sendMailService == null) {            sendMailService = new SendMailService();        }        return sendMailService;    }    /**     * 此段代码用来发送普通带附件电子邮件     */    public void send() throws Exception {        try {            Properties props = new Properties(); // 获取系统环境            Authenticator auth = new Email_Autherticator(); // 进行邮件服务器用户认证            props.put("mail.smtp.host", mailInfor.getHost());            props.put("mail.smtp.auth", "true");            Session session = Session.getDefaultInstance(props, auth);            // 用于在console中显示执行过程信息            session.setDebug(true);            // 设置session,和邮件服务器进行通讯。            MimeMessage message = new MimeMessage(session);            message.setSubject(mailInfor.getMail_subject()); // 设置邮件标题            message.setSentDate(new Date()); // 设置邮件发送日期            Address address = new InternetAddress(mailInfor.getSendEmail(),                    mailInfor.getSendPassword());            message.setFrom(address); // 设置邮件发送者的地址            Address toAddress = new InternetAddress(mailInfor.getMail_to()); // 设置邮件接收方的地址            message.addRecipient(Message.RecipientType.TO, toAddress);// 加载收件人地址            message.setText(mailInfor.getMail_body()); // 设置邮件正文            // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件            Multipart multipart = new MimeMultipart();            // 设置邮件的文本内容            BodyPart contentPart = new MimeBodyPart();            contentPart.setText(mailInfor.getMail_body());            multipart.addBodyPart(contentPart);            multipart.addBodyPart(contentPart);            if (!mailInfor.getFile().isEmpty()) {// 有附件                Enumeration efile = mailInfor.getFile().elements();                while (efile.hasMoreElements()) {                    contentPart = new MimeBodyPart();                    String filename = efile.nextElement().toString(); // 选择出每一个附件名                    FileDataSource fds = new FileDataSource(filename); // 得到数据源                    contentPart.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart                    // contentPart.setFileName(fds.getName());                    // //得到文件名同样至入BodyPart,并解决中文名乱码问题                    contentPart.setFileName(MimeUtility.encodeText(fds                            .getName()));                    multipart.addBodyPart(contentPart);                }                mailInfor.getFile().removeAllElements();            }            // 将multipart对象放到message中            message.setContent(multipart, "text/html;charset=gb2312"); // Multipart加入到信件            // 保存邮件            message.saveChanges();            Transport.send(message); // 发送邮件                        System.out.println("send ok!");        } catch (Exception ex) {            ex.printStackTrace();            throw new Exception(ex.getMessage());        }    }    /**     * 用来进行服务器对用户的认证     */    class Email_Autherticator extends Authenticator {        public Email_Autherticator() {            super();        }        Email_Autherticator(String user, String pwd) {            super();            mailInfor.setSendEmail(user);            mailInfor.setSendPassword(pwd);        }        public PasswordAuthentication getPasswordAuthentication() {            return new PasswordAuthentication(mailInfor.getSendEmail(),                    mailInfor.getSendPassword());        }    }}

javaBean

public class MailInformation {// 发送邮件的邮箱地址服务器    private String host;    // 这个是你的邮箱用户名以及邮件显示发送者邮箱    private String sendEmail ;    // 你的邮箱密码    private String sendPassword ;    //邮件发送者显示姓名    private String sendName ;     //待接收的邮箱    private String mail_to ;    //邮件标题    private String mail_subject;    //邮件内容    private String mail_body ;    //用于保存发送附件的文件名的集合      private Vector<String> file ;    /**     * 建立发邮件实体时传入发件人的email信息     * @param sendEmail email地址     * @param sendPassword email密码     * @param sendName 发送邮件中显示发件人姓名     */    public MailInformation(String sendEmail,String sendPassword,String sendName){        this.sendEmail = sendEmail;        this.sendPassword = sendPassword;        this.sendName = sendName;    }    /**     * 163邮箱的host     */    public void set163Host(){        host = "smtp.163.com";    }    /**     * 126邮箱的host     */    public void set126Host(){        host = "smtp.126.com";    }    /**     * qq邮箱的host     */    public void setQQHost(){        host = "smtp.qq.com";    }    /**     * 雅虎邮箱的host     */    public void setYahooHost(){        host = "smtp.mail.yahoo.com.cn ";    }    /**     * 获得发送邮件的邮箱地址服务器     * @return 地址服务器     */    public String getHost() {        return host;    }    /**     * 设置发送邮件的邮箱地址服务器     * @param host     */    public void setHost(String host) {        this.host = host;    }    /**     * 设置发件人的email     * @param sendEmail email     */    public void setSendEmail(String sendEmail) {        this.sendEmail = sendEmail;    }    /**     * 得到发件人的email     * @return sendEmail email     */    public String getSendEmail() {        return sendEmail ;    }    /**     * 设置发件人的email密码     * @param sendPassword 密码     */    public void setSendPassword(String sendPassword) {        this.sendPassword = sendPassword;    }    /**     * 得到发件人的email密码     * @return sendPassword 密码     */    public String getSendPassword() {        return sendPassword ;    }    /**     * 得到邮件中显示的发件人姓名     * @return 发件人姓名     */    public String getSendName() {        return sendName;    }    /**     * 设置邮件中显示的发件人姓名     * @param sendName 发件人姓名     */    public void setSendName(String sendName) {        this.sendName = sendName;    }    /**     * 得到收件人email     * @return 收件人email     */    public String getMail_to() {        return mail_to;    }    /**     * 设置收件人email     * @param mail_to  收件人email     */    public void setMail_to(String mail_to) {        this.mail_to = mail_to;    }    /**     * 邮件标题     * @return 邮件标题     */    public String getMail_subject() {        return mail_subject;    }    /**     * 设置邮件标题     * @param mail_subject 邮件标题     */    public void setMail_subject(String mail_subject) {        this.mail_subject = mail_subject;    }    /**     * 得到邮件内容     * @return 邮件内容     */    public String getMail_body() {        return mail_body;    }    /**     * 设置邮件内容     * @param mail_body 邮件内容     */    public void setMail_body(String mail_body) {        this.mail_body = mail_body;    }    /**     * 得到附件所在的绝对路径     * @return 绝对路径     */    public Vector<String> getFile() {        return file;    }    /**     * 天剑附件所在的绝对路径     * @return 绝对路径     */    public void setFile(Vector<String> file) {        this.file = file;    }}
五、调用方式
public static void main(String[] args) {        SendMailService sendmail = SendMailService.getService();        MailInformation mailInformation = new MailInformation(                "发件人email", "发件人email密码", "发件人显示姓名");        mailInformation.set163Host();        mailInformation.setMail_subject("测试发送邮件");        mailInformation.setMail_body("这是一封测试是否能够发送带附件邮件的信");        mailInformation.setMail_to("收件人email");        Vector<String> fileStr = new Vector<String>();        fileStr.add("附件地址绝对路径");        mailInformation.setFile(fileStr);        sendmail.setMailInfor(mailInformation);        try {            sendmail.send();        } catch (Exception ex) {            ex.printStackTrace();        }    }
六、问题解决
1、发送邮件的邮箱地址服务器
需要搜索得到发件人邮箱的 SMTP服务器地址,比如126的:http://help.163.com/09/0219/10/52GOPOND007536NI.html

2、中文名附件乱码解决
解决地址:http://ben-sin.iteye.com/blog/387536
方法:contentPart.setFileName(MimeUtility.encodeText(fds.getName()));

原创粉丝点击