使用 Gmail 发送电子邮件时在 Java 中设置发件人姓名

Setting sender's name in Java while sending email using Gmail

我从 "quickstart: Sending Gmail" 复制了代码,并对我的应用做了一些修改。代码似乎工作正常,只是发件人的姓名无论我如何尝试都没有设置。

这是我的完整代码:

import java.util.Arrays;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleOAuthConstants;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.Message;

public class Test{
 private static final String SCOPE = "https://www.googleapis.com/auth/gmail.modify";
 private static final String APP_NAME = "XYZ";
 // Path to the client_secret.json file deloper Console
 private static final String CLIENT_SECRET_PATH = "src/testapp/auth_client.json";

 private static GoogleClientSecrets clientSecrets;
 private static GoogleAuthorizationCodeFlow flow;
 private static HttpTransport httpTransport;
 private static JsonFactory jsonFactory;
 private static Gmail service;

 public static String getRequestUrl() throws FileNotFoundException, IOException{
  httpTransport = new NetHttpTransport();
  jsonFactory = new JacksonFactory();
  
  clientSecrets = GoogleClientSecrets.load(jsonFactory, new FileReader(
    CLIENT_SECRET_PATH));
  
  // Allow user to authorize via url.
  flow = new GoogleAuthorizationCodeFlow.Builder(
    httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE))
  .setAccessType("online").setApprovalPrompt("auto").build();
  
  String url = flow.newAuthorizationUrl()
    .setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).build();
  
  return url;
 }
 
 public static void sendMail(String to, String sub, String body) throws IOException, MessagingException {

  Message message = createMessageWithEmail(createEmail(to, "me", sub, body));
     message = service.users().messages().send("me", message).execute();
     
     System.out.println("Message id: " + message.getId());
     System.out.println(message.toPrettyString());
 }

 static void emailCredentialSetup(String code) throws IOException {
  // Generate Credential using retrieved code.
  GoogleTokenResponse response = flow.newTokenRequest(code)
    .setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI)
    .execute();
  GoogleCredential credential = new GoogleCredential()
    .setFromTokenResponse(response);

  // Create a new authorized Gmail API client
  service = new Gmail.Builder(httpTransport, jsonFactory,
    credential).setApplicationName(APP_NAME).build();
 }
 
 /**
    * Create a MimeMessage using the parameters provided.
    *
    * @param to Email address of the receiver.
    * @param from Email address of the sender, the mailbox account.
    * @param subject Subject of the email.
    * @param bodyText Body text of the email.
    * @return MimeMessage to be used to send email.
    * @throws MessagingException
  * @throws UnsupportedEncodingException 
    */
   private static MimeMessage createEmail(String to, String from, String subject,
       String bodyText) throws MessagingException, UnsupportedEncodingException {
     Properties props = new Properties();
     Session session = Session.getDefaultInstance(props, null);

     MimeMessage email = new MimeMessage(session);

     email.setFrom(new InternetAddress(from, "SPecial message"));
     email.addRecipient(javax.mail.Message.RecipientType.TO,
                        new InternetAddress(to));
     email.setSubject(subject);
     email.setText(bodyText);
     return email;
   }
   
   /**
    * Create a Message from an email
    *
    * @param email Email to be set to raw of message
    * @return Message containing base64 encoded email.
    * @throws IOException
    * @throws MessagingException
    */
   private static Message createMessageWithEmail(MimeMessage email)
       throws MessagingException, IOException {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     email.writeTo(baos);
     String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
     Message message = new Message();
     message.setRaw(encodedEmail);
     return message;
   }
   
 public static void main(String[] args) throws FileNotFoundException, IOException, MessagingException {
  System.out.println(getRequestUrl());
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  emailCredentialSetup(br.readLine());
  
  sendMail("myemail@gmail.com", "TEST1", "Hello");
 }
}

有人可以帮我将发件人姓名设置为自定义字符串吗?在谷歌搜索后,我尝试将名称设置为 "SPecial message",但它不起作用。

从您的姓名中删除 space "Special Message" 尝试以这种方式发送 "SpecialMessage" 应该可以。

从你正在执行的代码看来:

  email.setFrom(new InternetAddress("me", "SPecial message"));

它试图将 "me" 用作电子邮件 header 中的电子邮件地址,这是行不通的。您需要将其设置为用户的真实电子邮件地址,或者不提供 From header 以自动设置。 (如果 From header 中的电子邮件地址对于用户来说是错误的,它会删除整个 header 并设置一个有效的。)