1

iOSのMailCoreフレームワークを使用してメッセージを送信しようとしています。これは私のViewDidLoadメソッドです。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

myMessage = [[CTCoreMessage alloc] init];

// Set To
CTCoreAddress *addrTo = [CTCoreAddress address];
[addrTo setEmail:@"aaa@gmail.com"];
[myMessage setTo:[NSSet setWithObject:addrTo]];

// Set From 
CTCoreAddress *addrFrom = [CTCoreAddress address];
[addrFrom setEmail:@"bbb@gmail.com"];
[addrFrom setName:@"bb"];
[myMessage setFrom:[NSSet setWithObject:addrFrom]];

[myMessage setSubject:@"test"];
[myMessage setHTMLBody:@"Отправил это сообщение через SMTP с TSL (используя MailCore) :)"];

[CTSMTPConnection sendMessage:myMessage server:@"smtp.gmail.com" username:@"bbbb"
                     password:@"ccc" port:587 useTLS:YES useAuth:YES];
[myMessage release];
}

その結果、次のような理由で短縮された電子メールが届きます。

Отправил это сообщение через SMTP с T

その理由は何でしょうか。ご覧のとおり、ポート587でgmail.comを使用し、TLS=YESを使用しています。

PS gmail.comの代わりにmail.ruを使用しても、同じです。サーバーの問題ではないようです。

4

4 に答える 4

2

これは、エンコーディングの問題のように非常に疑わしいようです。最初にASCII以外の文字をHTMLエスケープした場合はどうなりますか?

明確にするために、誰かがHTMLBodyにその長さ(文字数)を要求し、それが送信するUTF-8バイトの正しい数であると想定しているようです。

于 2012-06-25T00:42:07.017 に答える
1

これは、MailCoreの最新バージョンで修正されています。これがコミットですhttps://github.com/mronge/MailCore/commit/1d833fb5996e2350aeaba9a1f04acb33b7cae84c

于 2012-07-04T03:00:20.970 に答える
0

最後に、何時間も試した後、私はこの問題を解決しました。

libEtPanのこのメソッドは、次のように変更する必要があります。

    int mailmime_set_body_text(struct mailmime * build_info,
               char * data_str, size_t length)
{
  int encoding;
  struct mailmime_data * data;

  encoding = mailmime_transfer_encoding_get(build_info->mm_mime_fields);

  // Added by Dennis !!!Here Russian message was cut off!!!
    // The reason is that size_t length is a count of chars but used for data length (which is twice as count of chars in UTF-8)
    // That's why I take the lenght of actual data_str, not length
    if (encoding == 2) {
        length = strlen(data_str);
    }

  data = mailmime_data_new(MAILMIME_DATA_TEXT, encoding,
               0, data_str, length, NULL);
  if (data == NULL)
    return MAILIMF_ERROR_MEMORY;

  build_info->mm_data.mm_single = data;

  return MAILIMF_NO_ERROR;
}
于 2012-06-26T10:21:30.337 に答える
0

これは、libEtPan DinhVietHoaの作者による解決策です。

問題はむしろこのメソッド(CTMIME_HtmlPart.m)にあります:

- (struct mailmime *)buildMIMEStruct {
    struct mailmime_fields *mime_fields;
    struct mailmime *mime_sub;
    struct mailmime_content *content;
    struct mailmime_parameter *param;
    int r;

    /* text/html part */
    //TODO this needs to be changed, something other than 8BIT should be used
    mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
    assert(mime_fields != NULL);

    content = mailmime_content_new_with_str("text/html");
    assert(content != NULL);

    param = mailmime_parameter_new(strdup("charset"), strdup(DEST_CHARSET));
    assert(param != NULL);

    r = clist_append(content->ct_parameters, param);
    assert(r >= 0);

    mime_sub = mailmime_new_empty(content, mime_fields);
    assert(mime_sub != NULL);
    NSString *str = [self content];
    //TODO is strdup necessary?
    r = mailmime_set_body_text(mime_sub, strdup([str cStringUsingEncoding:NSUTF8StringEncoding]), [str length]);
    assert(r == MAILIMF_NO_ERROR);
    return mime_sub;
}

[str cStringUsingEncoding:NSUTF8StringEncoding]を引数として渡していることがわかります。そして、そのデータのサイズを渡す代わりに、その文字列の文字数である[strlength]を渡します。ここであなたがすべきこと:

NSData * data = [str dataUsingEncoding:NSUTF8String];
r = mailmime_set_body_text(mime_sub, strdup([data bytes]), [data length]);
于 2012-06-27T08:15:24.840 に答える