2011-01-13 40 views
11

Tôi đang cố gắng gửi email bằng máy chủ thư của công ty mình. Nhưng tôi nhận được ngoại lệ sauCách gửi email bằng máy chủ trao đổi MS

Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Client was not authenticated 
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583) 
    at javax.mail.Transport.send0(Transport.java:169) 
    at javax.mail.Transport.send(Transport.java:98) 

Đây là mẫu mã của tôi,

Properties props = System.getProperties(); 

// Setup mail server 
props.put("mail.smtp.host", "example.server.com"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.port", "25"); 
// Get session 
//Session session = Session.getDefaultInstance(props, null); 
Session session = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("username", "password"); 
     } 
    }); 

// Define message 
MimeMessage message = new MimeMessage(session); 

// Set the from address 
message.setFrom(new InternetAddress(from)); 

// Set the to address 
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 

// Set the subject 
message.setSubject("Hello JavaMail"); 

// Set the content 
message.setText("Welcome to JavaMail"); 

// Send message 
Transport.send(message); 

gì đoạn mã là sai? Như tên người dùng và mật khẩu, tôi đang sử dụng địa chỉ email và mật khẩu của công ty mình.

Trả lời

6

5.7.1 có thể do trao đổi chứ không phải mã của bạn. Bạn có thể chỉ cần bật chuyển tiếp trên máy chủ. Cho người dùng ẩn danh hoặc từ một địa chỉ IP nào đó. Tôi không phải là chuyên gia về Exchange nhưng tôi đã làm việc này trước đây. Dưới đây là giải pháp cuối cùng tôi đã kiểm tra hoạt động:

Nếu một lỗi 5.7.1 là gặp phải khi cố gắng gửi email qua SMTP trên một máy chủ trao đổi khi người dùng đã được chứng thực ..

Đối với ref vấn đề bạn chỉ cần đã được gây ra bởi một thiết lập trên máy chủ Exchange 2007 - điều này sẽ không bình thường là một vấn đề trên máy chủ

cố định bằng cách làm dưới đây 2003 ...

bạn có thể thiết lập thông qua giao diện đồ họa xác thực này

  • Trong cấu hình Server/Hub Transport/Default <ServerName>
  • nhấp chuột, tài sản, Permission Groups Ngay
  • Kiểm tra "Anonymous users" và sau đó bấm OK

Rõ ràng người dùng anon là không quá an toàn nhưng bạn có thể thấy nếu điều này giải quyết được vấn đề.

+0

là nó có thể quản trị viên CNTT của tôi có thể tạo một người dùng thử nghiệm trên máy chủ trao đổi và tôi có thể sử dụng để gửi email không? – user509755

+0

Tôi không hiểu tại sao không. Ứng dụng web của tôi chạy dưới sự mạo danh người dùng miền là những gì kết nối với máy chủ trao đổi. Tôi không kno quá nhiều về trao đổi, nhưng trang web cuối cùng trong cài đặt các ứng dụng trên đã cho phép chuyển tiếp thông qua smtp từ máy chủ web. sau này tôi đã ngừng nhận được 5.7.1 lỗi. nếu bạn không thể làm một người dùng duy nhất sau đó bạn sẽ có thể làm một máy duy nhất ít nhất. Có một số thông tin ở đây về sự cố với một người dùng không thể chuyển tiếp có một số thông tin thú vị http://social.technet.microsoft.com/Forums/en-US/exchangesvrtransport/thread/1a84a06a-f1c8-40b4-ace8 -1e264f218aa1/ – WraithNath

+0

Tôi nghĩ rằng khu vực bạn cần tìm là 'Nhận kết nối' – WraithNath

1

Tôi đã phải sử dụng javamail + exchange. Các tin nhắn trở lại là bất lực. Nhờ ngăn xếp, tôi có một số gợi ý.

Thêm phần này vào mã của bạn

props.put("mail.smtp.starttls.enable","true"); 

Hãy suy nghĩ về việc thêm các chứng chỉ của các máy sử dụng quá. Để tìm chúng, chỉ cần truy cập trình duyệt của bạn, xuất chúng và nhập vào tệp cacerts đang được sử dụng.

0

Vui lòng sử dụng các phần mã sau thay vì Transport.send(message);

MimeMessage message = new MimeMessage(session); 

message.saveChanges(); 
Transport transport = session.getTransport("smtp"); 
transport.connect(host, "user", "pwd"); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close(); 

Tôi đã thử nghiệm ở các địa phương và nó đang làm việc

+0

Phương thức 'Transport.send (message)' bao gồm 'message.saveChanges()', 'transport.connect', ' transport.sendMessage' và 'transport.close' vì vậy tôi không nghĩ rằng tôi cần làm điều đó một lần nữa bản thân mình. – omerhakanbilici

2

Trong một số công ty, sự hỗ trợ Exchange server SMTP là vô hiệu hóa và bạn không thể yêu cầu họ để kích hoạt nó. Trong những trường hợp này, một giải pháp hợp lý là một trong những điều này:

http://davmail.sourceforge.net/

1

Simple Java Mail làm việc cho tôi.Điều duy nhất bạn cần phải kiểm tra là cho đúng hostname, tên, cổngmật khẩuTransportStrategy.SMTP_TLS:

new Mailer(host, port, username, password, TransportStrategy.SMTP_TLS).sendMail(email); 
+0

@zeddam Có phải đó là nguồn mở để sử dụng không? – Sundhar

2

mail.jar (Phiên bản 1.4.0) có một vấn đề tương thích với MS Exchange Máy chủ và ném 530 5.7.1 Client was not authenticated, ngay cả khi Tên người dùng và mật khẩu được định cấu hình.

Nâng cấp API thư lên 1.4.4 HOẶC 1.4.7 sẽ giải quyết vấn đề. 1.4.7 có thể tải về

Thư API từ URL sau: http://www.oracle.com/technetwork/java/javamail/index.html

1

Khi tôi sẽ sử dụng một máy chủ MS Exhange SMTP để gửi email, tôi sử dụng phụ thuộc maven trên.

<dependency> 
    <groupId>com.microsoft.ews-java-api</groupId> 
    <artifactId>ews-java-api</artifactId> 
    <version>2.0</version> 
</dependency> 

Vì lý do đó tôi đã tạo một lớp đại diện cho ứng dụng email cho máy chủ MS Exchange. Tôi sử dụng log4j để đăng nhập.

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency> 

Bên dưới lớp client MS Exchange (tôi sử dụng mô hình xây dựng cho việc xây dựng các đối tượng cho sự an toàn thread),

import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import microsoft.exchange.webservices.data.core.ExchangeService; 
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; 
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; 
import microsoft.exchange.webservices.data.core.service.item.EmailMessage; 
import microsoft.exchange.webservices.data.credential.ExchangeCredentials; 
import microsoft.exchange.webservices.data.credential.WebCredentials; 
import microsoft.exchange.webservices.data.property.complex.MessageBody; 
import org.apache.log4j.Logger; 

/** 
* A client to connect to a MS Exchange SMTP Server. 
*/ 
public final class ExchangeClient { 

    private static final Logger LOGGER = Logger.getLogger(ExchangeClient.class); 

    private final String hostname; 
    private final ExchangeVersion exchangeVersion; 
    private final String domain; 
    private final String username; 
    private final String password; 
    private final String subject; 
    private final String recipientTo; 
    private final List<String> recipientCc; 
    private final List<String> recipientBcc; 
    private final List<String> attachments; 
    private final String message; 

    private ExchangeClient(ExchangeClientBuilder builder) { 
     this.hostname = builder.hostname; 
     this.exchangeVersion = builder.exchangeVersion; 
     this.domain = builder.domain; 
     this.username = builder.username; 
     this.password = builder.password; 
     this.subject = builder.subject; 
     this.recipientTo = builder.recipientTo; 
     this.recipientCc = builder.recipientCc; 
     this.recipientBcc = builder.recipientBcc; 
     this.attachments = builder.attachments; 
     this.message = builder.message; 
    } 

    public static class ExchangeClientBuilder { 

     private String hostname; 
     private ExchangeVersion exchangeVersion; 
     private String domain; 
     private String username; 
     private String password; 
     private String subject; 
     private String recipientTo; 
     private List<String> recipientCc; 
     private List<String> recipientBcc; 
     private List<String> attachments; 
     private String message; 

     public ExchangeClientBuilder() { 
      this.exchangeVersion = ExchangeVersion.Exchange2010_SP1; 
      this.hostname = ""; 
      this.username = ""; 
      this.password = ""; 
      this.subject = ""; 
      this.recipientTo = ""; 
      this.recipientCc = new ArrayList<>(0); 
      this.recipientBcc = new ArrayList<>(0); 
      this.attachments = new ArrayList<>(0); 
      this.message = ""; 
     } 

     /** 
     * The hostname of the Exchange Web Service. It will be used for 
     * connecting with URI https://hostname/ews/exchange.asmx 
     * 
     * @param hostname the hostname of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder hostname(String hostname) { 
      this.hostname = hostname; 
      return this; 
     } 

     /** 
     * The Exchange Web Server version. 
     * 
     * @param exchangeVersion the Exchange Web Server version. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder exchangeVersion(ExchangeVersion exchangeVersion) { 
      this.exchangeVersion = exchangeVersion; 
      return this; 
     } 

     /** 
     * The domain of the MS Exchange Smtp Server. 
     * 
     * @param domain the domain of the Active Directory. The first part of 
     * the username. For example: MYDOMAIN\\username, set the MYDOMAIN. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder domain(String domain) { 
      this.domain = domain; 
      return this; 
     } 

     /** 
     * The username of the MS Exchange Smtp Server. The second part of the 
     * username. For example: MYDOMAIN\\username, set the username. 
     * 
     * @param username the username of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder username(String username) { 
      this.username = username; 
      return this; 
     } 

     /** 
     * The password of the MS Exchange Smtp Server. 
     * 
     * @param password the password of the MS Exchange Smtp Server. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder password(String password) { 
      this.password = password; 
      return this; 
     } 

     /** 
     * The subject for this send. 
     * 
     * @param subject the subject for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder subject(String subject) { 
      this.subject = subject; 
      return this; 
     } 

     /** 
     * The recipient for this send. 
     * 
     * @param recipientTo the recipient for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientTo(String recipientTo) { 
      this.recipientTo = recipientTo; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as cc 
     * recipients. 
     * 
     * @param recipientCc the first cc email address. 
     * @param recipientsCc the other cc email address for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientCc(String recipientCc, String... recipientsCc) { 
      // Prepare the list. 
      List<String> recipients = new ArrayList<>(1 + recipientsCc.length); 
      recipients.add(recipientCc); 
      recipients.addAll(Arrays.asList(recipientsCc)); 
      // Set the list. 
      this.recipientCc = recipients; 
      return this; 
     } 

     /** 
     * You can specify a list with email addresses that will be used as cc 
     * for this email send. 
     * 
     * @param recipientCc the list with email addresses that will be used as 
     * cc for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientCc(List<String> recipientCc) { 
      this.recipientCc = recipientCc; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as bcc 
     * recipients. 
     * 
     * @param recipientBcc the first bcc email address. 
     * @param recipientsBcc the other bcc email address for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientBcc(String recipientBcc, String... recipientsBcc) { 
      // Prepare the list. 
      List<String> recipients = new ArrayList<>(1 + recipientsBcc.length); 
      recipients.add(recipientBcc); 
      recipients.addAll(Arrays.asList(recipientsBcc)); 
      // Set the list. 
      this.recipientBcc = recipients; 
      return this; 
     } 

     /** 
     * You can specify a list with email addresses that will be used as bcc 
     * for this email send. 
     * 
     * @param recipientBcc the list with email addresses that will be used 
     * as bcc for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder recipientBcc(List<String> recipientBcc) { 
      this.recipientBcc = recipientBcc; 
      return this; 
     } 

     /** 
     * You can specify one or more email address that will be used as cc 
     * recipients. 
     * 
     * @param attachment the first attachment. 
     * @param attachments the other attachments for this send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder attachments(String attachment, String... attachments) { 
      // Prepare the list. 
      List<String> attachmentsToUse = new ArrayList<>(1 + attachments.length); 
      attachmentsToUse.add(attachment); 
      attachmentsToUse.addAll(Arrays.asList(attachments)); 
      // Set the list. 
      this.attachments = attachmentsToUse; 
      return this; 
     } 

     /** 
     * You can specify a list with email attachments that will be used for 
     * this email send. 
     * 
     * @param attachments the list with email attachments that will be used 
     * for this email send. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder attachments(List<String> attachments) { 
      this.attachments = attachments; 
      return this; 
     } 

     /** 
     * The body of the email message. 
     * 
     * @param message the body of the email message. 
     * @return the builder for chain usage. 
     */ 
     public ExchangeClientBuilder message(String message) { 
      this.message = message; 
      return this; 
     } 

     /** 
     * Build a mail. 
     * 
     * @return an EmailApacheUtils object. 
     */ 
     public ExchangeClient build() { 
      return new ExchangeClient(this); 
     } 
    } 

    public boolean sendExchange() { 
     // The Exchange Server Version. 
     ExchangeService exchangeService = new ExchangeService(exchangeVersion); 

     // Credentials to sign in the MS Exchange Server. 
     ExchangeCredentials exchangeCredentials = new WebCredentials(username, password, domain); 
     exchangeService.setCredentials(exchangeCredentials); 

     // URL of exchange web service for the mailbox. 
     try { 
      exchangeService.setUrl(new URI("https://" + hostname + "/ews/Exchange.asmx")); 
     } catch (URISyntaxException ex) { 
      LOGGER.error("An exception occured while creating the uri for exchange service.", ex); 
      return false; 
     } 

     // The email. 
     EmailMessage emailMessage; 
     try { 
      emailMessage = new EmailMessage(exchangeService); 
      emailMessage.setSubject(subject); 
      emailMessage.setBody(MessageBody.getMessageBodyFromText(message)); 
     } catch (Exception ex) { 
      LOGGER.error("An exception occured while setting the email message.", ex); 
      return false; 
     } 

     // TO recipient. 
     try { 
      emailMessage.getToRecipients().add(recipientTo); 
     } catch (ServiceLocalException ex) { 
      LOGGER.error("An exception occured while sstting the TO recipient(" + recipientTo + ").", ex); 
      return false; 
     } 

     // CC recipient. 
     for (String recipient : recipientCc) { 
      try { 
       emailMessage.getCcRecipients().add(recipient); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while sstting the CC recipient(" + recipient + ").", ex); 
       return false; 
      } 
     } 

     // BCC recipient 
     for (String recipient : recipientBcc) { 
      try { 
       emailMessage.getBccRecipients().add(recipient); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while sstting the BCC recipient(" + recipient + ").", ex); 
       return false; 
      } 
     } 

     // Attachements. 
     for (String attachmentPath : attachments) { 
      try { 
       emailMessage.getAttachments().addFileAttachment(attachmentPath); 
      } catch (ServiceLocalException ex) { 
       LOGGER.error("An exception occured while setting the attachment.", ex); 
       return false; 
      } 
     } 

     try { 
      emailMessage.send(); 
      LOGGER.debug("An email is send."); 
     } catch (Exception ex) { 
      LOGGER.error("An exception occured while sending an email.", ex); 
      return false; 
     } 

     return true; 
    } 

} 

Một ví dụ làm việc,

// import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; 
ExchangeClient client = new ExchangeClient.ExchangeClientBuilder() 
     .hostname("webmail.domainOfWeb.com") 
     .exchangeVersion(ExchangeVersion.Exchange2010) 
     .domain("ActiveDirectoryDomain") 
     .username("ActiveDirectoryUsername") 
     .password("ActiveDirectoryPassword") 
     .recipientTo("[email protected]") 
     .recipientCc("[email protected]") // Ignore it in case you will not use Cc recipients. 
     .recipientBcc("[email protected]") // Ignore it in case you will not use Bcc recipients. 
     .attachments("/home/username/image.png") // Ignore it in case you will not use attachements. 
     .subject("Test Subject") 
     .message("Test Message") 
     .build(); 
client.sendExchange(); 
Các vấn đề liên quan