您的位置:首页 > 编程语言 > Java开发

java实现邮件上

2016-04-28 11:35 411 查看
import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

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;

import org.springframework.mail.MailException;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.mail.javamail.MimeMessageHelper;

public static void sendAttachmentEmail(String mailTitle,String mailHostName,String mailAuthorName,String mailAuthorPwd,String mailFrom, String mailContent,String [] mailReceiverAddress,String []attachmentPaths,String []attachmentFileNames)
throws Exception {

      Properties props = new Properties();

      props.put("mail.smtp.host", mailHostName); //设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)

      props.put("mail.smtp.auth", "true"); //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)

      Session session = Session.getDefaultInstance(props); //用刚刚设置好的props对象构建一个session

      session.setDebug(false); //若为true便可以在发送邮件的过程中在console处显示过程信息,供调试使用(你可以在控制台(console)上看到发送邮件的过程)

      MimeMessage mailMessage = new MimeMessage(session); //用session为参数定义消息对象

      Transport transport = null;

      try {

       mailMessage.setFrom(new InternetAddress(mailFrom)); //设置发件人地址

       for (int i = 0; i < mailReceiverAddress.length; i++) { //发送给多个人

      mailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(mailReceiverAddress[i])); //加载收件人地址

       }

       mailMessage.setSubject(MimeUtility.encodeText(mailTitle, "UTF-8", "B")); //设置邮件标题

       Multipart multipart = new MimeMultipart(); //(MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象)向multipart对象中添加邮件的各个部分内容,包括文本内容和附件

       BodyPart bodyPart = new MimeBodyPart(); //创建一个MimeBodyPart对象

       bodyPart.setContent(mailContent, "text/html; charset=UTF-8"); //设置邮件内容

       multipart.addBodyPart(bodyPart); //将邮件内容添加到

       if(attachmentPaths.length!=attachmentFileNames.length){

     throw new Exception("附件绝对路径数量和附件文件名数量不一致!");
       }else{

      for (int i = 0; i < attachmentFileNames.length; i++) {

      bodyPart  = new MimeBodyPart(); //创建一个MimeBodyPart对象,用来添加邮件附件

          DataSource datasource  = new FileDataSource(attachmentPaths[i]+attachmentFileNames[i]); //获取附件文件

          bodyPart.setDataHandler(new DataHandler(datasource)); //将附件添加到邮件中

          bodyPart.setFileName(MimeUtility.encodeWord(attachmentFileNames[i],"gb2312", null)); //(附件名)防止中文附件文件名乱码问题

          multipart.addBodyPart(bodyPart); //将附件添加到
}

       }

       mailMessage.setSentDate(new Date()); //邮件发送时间

       mailMessage.setContent(multipart); //将multipart对象放到mailMessage中

       mailMessage.saveChanges(); //保存邮件

       transport = session.getTransport("smtp"); //发送邮件

       transport.connect(mailHostName, mailAuthorName, mailAuthorPwd); // 连接服务器的邮箱

       transport.sendMessage(mailMessage, mailMessage.getAllRecipients()); //把邮件发送出去

       transport.close(); //关闭邮件流

      } catch (Exception e) {

     log.error("邮件发送异常!!!!");

     throw e;

      }finally{

     if(null != transport){

     try {
transport.close();
} catch (MessagingException e) {
log.error("MessagingException:"+e);


     }

      }

     }

问题1:遇到保存时报空指针

        (1)检查是否有调用空的映射值。(2)检查文件存取路径是否正确。

问题2:javax.mail.AuthenticationFailedException: 535 Authentication failed

(1) 用户名密码不匹配,或者不正确

        (2) 邮件服务器连接失败

        (3) Transport发送对象的connect函数中的主机名不一致,即connect中的host("smtp.xxx.com")要跟发件人的host相同

        (4)邮件的用户名不能用全名,如oa@kingkey.com.cn,这样会导致验证密码错误,而去掉用户全名后,如用:oa,这时邮件正常收发了!

       
(5)邮箱服务器在新环境未验证。

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: