javamail 错误,加上send就出错,求助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javamail 错误,加上send就出错,求助相关的知识,希望对你有一定的参考价值。

package cn.hxex.library.service.impl;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import cn.hxex.library.model.Email;
import cn.hxex.library.service.EmailService;

public class EmailServiceImpl implements EmailService
public Email sendEmail(String subject, String object)

JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
// 设定 Mail Server
senderImpl.setHost("smtp.qq.com");

//SMTP验证时,需要用户名和密码
senderImpl.setUsername("####");
senderImpl.setPassword("####");

// 建立邮件讯息
SimpleMailMessage mailMessage = new SimpleMailMessage();

// 设定收件人、寄件人、主题与内文
mailMessage.setTo("####@qq.com");
mailMessage.setFrom("####@qq.com");
mailMessage.setSubject(subject);
mailMessage.setText(object);

// 传送邮件
//senderImpl.send(mailMessage);就是这句一加上就错了!!!

System.out.println("邮件传送OK..");

return null;


参考技术A send(msg):是一个静态方法,需要用Transport类直接调用,Transport.send(msg);
或者用Transport的一个实例transport:
transport.connect(host,port,username,password)
transport.sendMessage(msg,mailTo)
transport.close();
建议你全部贴出来看一下啦!我用下面代码可以发出来的!(邮件地址你改一下就可以了)
Properties props = new Properties();
props.setProperty("mail.debug", "true");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.sina.com");
Session session =Session.getInstance(props, new Authenticator()
@Override
protected PasswordAuthentication getPasswordAuthentication()
return new PasswordAuthentication("yourmail@sina.com","yourpassword");

);
Message msg = new MimeMessage(session);
msg.setSubject("subject ");
msg.setText("mailtext!");
Address from = new InternetAddress("yourmail@sina.com");//发送地址
Address to = new InternetAddress("mail1@yeah.net");//接收地址
Address cc = new InternetAddress("mail2@163.com");//抄送地址
Address bcc = new InternetAddress("mail3@126.com");//密送地址
msg.setFrom(from);
msg.setRecipient(RecipientType.TO, to);
msg.setRecipient(RecipientType.CC, cc);
msg.setRecipient(RecipientType.BCC, bcc);

Transport.send(msg);//这个直接包含了打开连接/发送邮件/关闭连接
希望有帮助吧!追问

我用的jsf + spring框架,在bean里面写了一个sendaction ,在service里面写了上面的函数,为什么不行啊,是不是写的地方不对呢,另外你给的代码放service函数里也不行啊。。。

追答

抱歉可否看下你的service方法!

Javamail,Transport.send() 非常慢

【中文标题】Javamail,Transport.send() 非常慢【英文标题】:Javamail, Transport.send() very slow 【发布时间】:2012-09-12 23:37:30 【问题描述】:

我写了一个批量发送电子邮件的方法,但它非常慢(每 10 秒大约 3 封邮件)。我想发送数千封邮件。有什么方法可以更快地做到这一点?

我现在使用gmail,但只是为了测试,最后我想使用我自己的SMTP服务器发送。

代码如下:

public boolean sendMessages()

    try 
    
        Session session = Session.getInstance(this._properties, new javax.mail.Authenticator() 
            @Override
            protected PasswordAuthentication getPasswordAuthentication() 
                 return new PasswordAuthentication("user", "password");
            
        );
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(this.getFrom()));


        message.setSubject(this.getSubject());
        message.setText(this.getBody());                
        for (int i = 0, c = this._addresses.size(); i < c; i++)
        
            message.setRecipient(Message.RecipientType.TO,  new InternetAddress(this._addresses.get(i)));                    
            Transport.send(message);
        
        return true;
      
     catch(AuthenticationFailedException e) 
         e.printStackTrace();
           return false;
     
     catch(MessagingException e) 
         e.printStackTrace();
           return false;
     

【问题讨论】:

我希望限制是服务器接受电子邮件的速度。您应该期望自己的邮件服务器每秒处理超过 10 个。 您可以通过将 Transport.send 调用替换为: message.saveChanges(); 来衡量 JavaMail 创建消息的速度。 message.writeTo(new BufferedOutputStream(new FileOutputStream("msg.txt")));如果发送到您的服务器的速度比这慢,这很可能是由于网络性能、协议开销或服务器的速度。 MimeMessage.saveChanges can trigger a DNS lookup 这会偏离你的基准。 【参考方案1】:

好的,谢谢你的建议。

我的解决办法是:

Transport transport = session.getTransport("smtp");
transport.connect(this._properties.getProperty("mail.smtp.host"), 
Integer.parseInt(this._properties.getProperty("mail.smtp.port")),
    this._properties.getProperty("mail.smtp.user"),
    this._properties.getProperty("mail.smtp.password"));

Address[] addr = new Address[this._addresses.size()];
for (int i = 0, c = this._addresses.size(); i < c; i++)

    addr[i] = new InternetAddress(this._addresses.get(i));


transport.sendMessage(message, addr);

【讨论】:

以上是关于javamail 错误,加上send就出错,求助的主要内容,如果未能解决你的问题,请参考以下文章

Javamail,Transport.send() 非常慢

Android Studio 编译出错,求助,万分

Excel数据有效性运用函数indirect出错解答求助?

Redis重启Redisson出错:Unable to send command!

发邮件出错javamail到底错哪儿了

javamail 在linux下发送电子邮件出错