`

使用spring发送邮件例

阅读更多
使用javamail來發送信件的主要流程是由 web server 將 email 先傳送至 SMTP server
接著再由 smtp server 將此信件傳送出去
所以email會發送失敗主要可分為兩個情況
一是由web server 到 smtp server 這一段發生錯誤
二是由smtp server 到destination po 這一段發生錯誤
而使用javamail可以控制的就只有由 web server 到 smtp server 這一段的傳送
如果 smtp server 能夠正確的接收由 web server 傳送過來的 email
對使用javamail 的 web server 來說就是發送成功了
在第一種情況中主要會發生發送失敗的原因主要可能是web server 和 smtp server間的網路不通或是smtp server 需要authentication才能幫你發信

但一般來說email發送失敗的原因主要都是由第二種情況所產生的
像是錯誤的email address , 信箱爆滿, 防火牆或是防毒的blocking....等等
這些錯誤訊息只有smtp server端才會知道
使用javamail是沒有辦法得知這類形的發送錯誤
如果你真需要知道這類形的錯誤訊息
有一個做法就是去作退信處理

good luck




做了个spring发送纯文本文件以及发送带附件的邮件的例子,共享之。
      1. SpringMail类
      import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;

import javax.mail.internet.MimeMessage;
import javax.mail.MessagingException;
import javax.mail.Message;
import javax.mail.internet.InternetAddress;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.Multipart;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

/** *//**
* spring的邮件发送例子
* @author Amigo Xie(xiexingxing1121@126.com)
* @since 2007/04/28 11:30
*/
public class SpringMail {

    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new FileSystemXmlApplicationContext(
                "src/applicationContext.xml");
        JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");
        SpringMail springMail = new SpringMail();
       
        //测试发送只有文本信息的简单测试
        springMail.sendTextMail(sender);
       
        //测试发送带附件的邮件
        springMail.sendMimeMessage(sender);
    }
   
    /** *//**
     * 测试发送只有文本信息的简单测试
     * @param sender 邮件发送器
     * @throws Exception
     */
    private void sendTextMail(JavaMailSender sender) throws Exception {
        SimpleMailMessage mail = new SimpleMailMessage();
        mail.setTo("xiexingxing1121@126.com");
        mail.setFrom("xiexingxing1121@126.com");
        mail.setSubject("test by amigo");
        mail.setText("spring Mail的简单测试");
        sender.send(mail);
       
        System.out.println("成功发送文本文件!");
    }
   
    /** *//**
     * 发送带附件的邮件
     * @param sender 邮件发送器
     * @throws Exception
     */
    private void sendMimeMessage(final JavaMailSender sender) throws Exception {
        //附件文件集合
        final List files = new ArrayList();
        MimeMessagePreparator mimeMail = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws MessagingException {
                mimeMessage.setRecipient(Message.RecipientType.TO,
                        new InternetAddress("xiexingxing1121@126.com"));
                mimeMessage.setFrom(new InternetAddress("xiexingxing1121@126.com"));
                mimeMessage.setSubject("Spring发送带附件的邮件", "gb2312");
               
                Multipart mp = new MimeMultipart();
               
                //向Multipart添加正文
                MimeBodyPart content = new MimeBodyPart();
                content.setText("内含spring邮件发送的例子,请查收!");
               
                //向MimeMessage添加(Multipart代表正文)
                mp.addBodyPart(content);
                files.add("src/SpringMail.java");
                files.add("src/applicationContext.xml");
               
                //向Multipart添加附件
                Iterator it = files.iterator();
                while(it.hasNext()) {
                    MimeBodyPart attachFile = new MimeBodyPart();
                    String filename = it.next().toString();
                    FileDataSource fds = new FileDataSource(filename);
                    attachFile.setDataHandler(new DataHandler(fds));
                    attachFile.setFileName(fds.getName());
                    mp.addBodyPart(attachFile);
                }
               
                files.clear();
               
                //向Multipart添加MimeMessage
                mimeMessage.setContent(mp);
                mimeMessage.setSentDate(new Date());
            }
        };

        //发送带附件的邮件
        sender.send(mimeMail);
       
        System.out.println("成功发送带附件邮件!");
    }
}

      2. spring的配置文件
      <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host">
            <value>smtp.126.com</value>
        </property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.timeout">25000</prop>
            </props>
        </property>
        <property name="username">
            <value>xiexingxing1121</value>
        </property>
        <property name="password">
            <value><!-- 此处填写密码 --></value>
        </property>
    </bean>
</beans>
    刚才发现一bug,当附件名为中文时,会出现中文乱码问题,对sendMimeMessage方法进行了部分修改,如下:
                   sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
                files.add("src/SpringMail.java");
                files.add("src/applicationContext.xml");
                files.add("src/谢星星.xml");
               
                //向Multipart添加附件
                Iterator it = files.iterator();
             while (it.hasNext()) {
                    MimeBodyPart attachFile = new MimeBodyPart();
                    String filename = it.next().toString();
                    FileDataSource fds = new FileDataSource(filename);
                    attachFile.setDataHandler(new DataHandler(fds));
                    attachFile.setFileName("=?GBK?B?"+enc.encode(fds.getName().getBytes())+"?=");
                    mp.addBodyPart(attachFile);
                }
posted on 2007-04-28 13:23 阿蜜果 阅读(3995) 评论(6)  编辑  收藏 所属分类: Spring




FeedBack:
# re: 使用spring发送邮件例
2007-04-28 14:07 | 王凌华

:) 我直接用javamail也写了一个类似的东西。(ThreadPool实现的压力测试小工具),这里我有几问题:
a.
但是我用126的mailserver的时候,出现这样的错误:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.126.com, port: 25
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:855)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:156)
at javax.mail.Service.connect(Service.java:256)
at javax.mail.Service.connect(Service.java:135)
at javax.mail.Service.connect(Service.java:87)
at com.sun.mail.smtp.SMTPTransport.connect(SMTPTransport.java:93)
at MailSender.run(MailSender.java:172)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


我用我公司的的两台mailserver都可以顺畅的发mail。

  回复  更多评论
 
# re: 使用spring发送邮件例[未登录]
2007-04-28 15:03 | ronghai

看看是不是需要SSl验证  回复  更多评论
 
# re: 使用spring发送邮件例
2007-04-29 12:47 | 王凌华

据我所知,gmail的发送和接受是需要ssl验证的.

所以我刚才花了点时间去看了一下javamail里面ssl里面是怎么写的.
这是代码片段:

----------------------------------------------------------------------------------
prop.put("mail.smtp.starttls.enable", "true");
prop.put("mail.smtp.socketFactory.fallback", "false");
// props.put("mail.smtp.debug", "true");
prop.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
prop.put("mail.smtp.port", "465");
prop.put("mail.smtp.socketFactory.port", "465");
prop.put("mail.smtps.auth", needAuth);
prop.put("mail.transport.protocol", "smtp");
prop.put("mail.smtp.host", mailServer);
----------------------------------------------------------------------------------

----------------------------------------------------------------------------------
SMTPTransport transport = (SMTPTransport) session
.getTransport("smtps");
----------------------------------------------------------------------------------
我的努力换来的是发送期间的TimeOut, 没有任何迹象表明代码哪里有问题.
... ... ...

最后我终于明白这里用到了465 port. 而我在公司内网内,这个port默认情况下是禁用的. -真倒霉.  回复  更多评论
 
# re: 使用spring发送邮件例
2007-04-29 12:50 | 王凌华

顺便贴出gmail的配置URL. 大家有兴趣也可以试试:

http://mail.google.com/support/bin/answer.py?answer=13287  回复  更多评论
 
# spring发送内嵌邮件的图片无法正常显示的问题
2007-09-14 08:27 | LG

import java.io.File;
import javax.mail.MessagingException;
import javax.mail.internet.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;



public class SpringMail {
public static void main(String[] args) throws Exception{

ApplicationContext ctx=new FileSystemXmlApplicationContext("src/applicationContext.xml");

JavaMailSenderImpl sender = (JavaMailSenderImpl)ctx.getBean("mailSender");


SpringMail springMail=new SpringMail();

springMail.sendInit(sender);
}

private void sendInit(JavaMailSenderImpl sender) throws MessagingException {

MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message,true,"GB2312");
helper.setFrom("dongweiyi1125@sina.com");
helper.setTo("dongweiyi1125@sina.com");
helper.setSubject("Test");
helper.setText("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\"></head><body><h1><a href='#'>郁闷!"
+ "<img src=\"cid:identifier\"></body></html>", true);

FileSystemResource res = new FileSystemResource(new File("c:/weiyi.jpg"));
helper.addInline("identifier", res);


try {
sender.send(message);
} catch (MailException e) {
e.printStackTrace();
}
System.out.println("成功发送内嵌文件");
}
}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">


<beans>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>smtp.sina.com</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>dongweiyi1125</value>
</property>
<property name="password">
<value>邮箱密码</value>
</property>
</bean>
</beans>


以上代码给新浪邮箱发送邮件时图片总不能正常显示,但是给QQ邮箱发送邮件时却可以正常显示,不知什么原因,请大虾出来帮忙……  回复  更多评论
 
# re: 使用spring发送邮件例 AuthenticationFailedException
2008-07-12 08:51 | Jayden

和上面的代码一样 怎么老是报AuthenticationFailedException 异常啊  回复  更多评论
分享到:
评论

相关推荐

    Spring Boot整合邮件发送并保存历史发送邮箱

    项目主要是使用 Spring Boot 发送邮件,主要的技术点有: 1、Spring Boot +mybatis的整合 2、Spring Boot项目中jsp的使用 3、Spring Boot 发送邮件(文本格式的邮件、发送HTML格式的邮件、发送带附件 的邮件、...

    用spring发送邮件

    本教程将详细讲解如何使用Spring发送邮件,以及在遇到问题时如何排查。 首先,我们需要在Spring项目中引入邮件服务相关的依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.spring...

    struts2+spring3.0+mybatis3.0.4集成的邮件发送实例(可上传附件)

    总之,这个实例结合了Struts2、Spring和Mybatis的强大功能,提供了一个完整的邮件发送系统,包括邮件的创建、附件上传和数据库操作。对这个实例的学习和实践,可以帮助开发者深入理解Java企业级应用的开发流程和技巧...

    springboot实现发送邮件(QQ邮箱为例)

    本文主要介绍了如何使用 Spring Boot 框架实现发送邮件, 以 QQ 邮箱为例,通过代码示例详细介绍了发送邮件的过程,并提供了完整的代码实现供读者参考。 知识点 1: Spring Boot 邮件发送依赖 在 Spring Boot 项目...

    Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)

    在Spring Boot应用中,利用JavaMailSender发送邮件是一种常见的需求,Spring ...Spring Boot的`spring-boot-starter-mail`模块简化了邮件发送的配置和使用,使得开发者能够更加专注于业务逻辑,而不是底层通信细节。

    spring发送邮件

    ### Spring框架发送邮件知识点详解 #### 一、Spring框架邮件发送功能概述 ...通过上述步骤,我们可以看到Spring框架提供的邮件发送功能不仅强大而且易于使用,极大地简化了开发过程中与邮件服务交互的复杂度。

    采用 spring 发送带 附件的邮件(完整示例,带 jar 包)

    本例为完整的采用spring 发送带 附件的邮件。 下载后需要改动的地方: 1.在mail.properties中将接收者邮箱地址(username),邮箱密码换成真实的。 2.在SpringJavaMailDemo类中把发送者和接收者邮箱地址换成真实地址...

    如何用java实现邮件方式每天发送消息

    在Java编程环境中,使用Spring Boot框架来实现每天定时发送邮件是一项常见的需求。Spring Boot以其便捷的配置和强大的功能,使得创建此类应用变得简单。本文将详细介绍如何利用Spring Boot结合Spring Task(Spring的...

    springmail架包

    SpringMail 是一个基于 Java 的库,它为使用 JavaMail API 发送电子邮件提供了便捷的抽象层。这个框架使得在 Spring 应用程序中集成邮件服务变得简单。本文将深入探讨 SpringMail 的核心概念、配置以及如何在实际...

    SpringBoot整合发送邮件

    在Java开发中,Spring Boot框架提供了便捷的方式来整合各种服务,包括发送邮件的功能。Spring Boot的邮件服务基于JavaMailSender接口,使得我们可以轻松地配置并发送电子邮件。本文将深入探讨如何在Spring Boot应用...

    SpringBoot实现发送邮件任务

    首先,我们需要在pom.xml文件中引入spring-boot-starter-mail依赖项,以便使用SpringBoot的邮件发送功能。 ```xml &lt;!-- 邮件 --&gt; &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-mail ...

    Spring 实现 定时 发送EMAIL

    在本文中,我们将深入探讨如何使用Spring框架实现定时发送HTML格式的电子邮件。首先,这个功能主要涉及两个核心部分:定时任务管理和电子邮件发送。 1. **定时任务管理**: Spring 提供了强大的任务调度框架,名为...

    Spring Boot实战之发送邮件示例代码

    Spring Boot通过其starter模块简化了邮件发送的操作,本篇将详细介绍如何使用Spring Boot发送邮件。 邮件服务是互联网通信中的一项重要功能,其基本工作原理是通过简单的邮件传输协议(SMTP)和邮局协议版本3(POP3...

    第二章 使用SpringCloud框架实现一个微服务.pdf

    在本章中,我们将探讨如何使用SpringCloud框架构建一个微服务,特别是一个名为“Message-Service”的示例项目,该服务用于处理消息通知,如短信或电子邮件。这个项目旨在提供一个实践性的学习平台,以帮助理解Spring...

    Springboot开发-使用springboot实现发邮件功能.zip

    在Spring Boot框架中,开发邮件发送功能是一项常见的需求,它使得应用程序能够自动化地发送通知、确认、提醒等信息。Spring Boot提供了对JavaMailSender接口的简单集成,让我们能够轻松实现邮件服务。本教程将深入...

    开源框架 Spring Gossip

    RMI Hessian、 Burlap Http Invoker &lt;br&gt;邮件 对于邮件发送服务的支援是由Spring的 org.springframework.mail.MailSender介面所定义,它有两个实作类别, org.springframework.mail.cos....

    Spring3.X编程技术与应用,完整扫描版

    Spring的任务执行与调度、Spring Web应用的国际化支持、AJAX和Spring结合的访问模式、利用Spring发 送电子邮件、Spring JMS消息应用编程、教学资源全文检索设计、Java应用的报表打印、网络考试系统设 计、Spring应用...

    Spring Boot利用Java Mail实现邮件发送

    在Spring Boot应用中,利用Java Mail发送邮件是一个常见的需求,特别是在需要向用户发送通知、确认信息或验证码的场景。下面将详细介绍如何通过Spring Boot结合Java Mail实现这一功能。 首先,你需要在项目的`pom....

    SpringBoot整合邮箱JavaMail

    这里以QQ邮箱为例,使用SMTP服务器,记得替换`your_email@example.com`和`your_email_password`为你的实际邮箱地址和授权码。 然后,创建一个Java配置类,例如`MailConfig.java`,并配置一个`JavaMailSender`实例:...

Global site tag (gtag.js) - Google Analytics